面试宝典第四章Java基础知识——4.2面向对象技术

时间:2023-01-01 12:26:35

4.2.1——面向对象和面向过程有什么区别
1.出发点不同
面向对象方法是用符合常规思维的方式来处理客观问题,强调把问题域的要领直接映射到对象与对象之间的接口上,而面向过程方法强调的是过程的抽象化和模块化,它是以过程为中心构造或处理客观世界问题的
2.层次逻辑问题
面向对象方法是用计算机逻辑来模拟客观世界中的物理存在,以对象的集合类作为处理问题的基本单位,尽可能的使计算机世界向客观世界靠拢,使得问题的处理更加清晰直接,面向对象方法是使用类的层次结构来实现类之间的继承和发展
而面向过程方法处理问题的基本单位是能清晰准确表达问题的模块,用模块的层次结构概括模块与模块之间的关系与功能,把客观世界的问题抽象成计算机可以处理的问题
3.数据处理的方式与控制程序不同,面向对象方法将数据与对应的代码封装成一个整体,原则上其它对象不能直接修改其数据,即对象的修改只能由其本身的成员函数来完成,控制程序方式上是通过”事件驱动”来激活和运行程序,而面向过程方法是直接通过程序来处理数据,处理完毕之后即可显示处理结果,在控制程序的方法上是按照设计调用或返回程序,不能*的导航,各模块之间存在控制与被控制,调用与被调用的关系。
4.2.5——组合和继承有什么区别
组合和继承是面向对象中两种代码复用的方式。
组合是值在新类中创建原有类的对象,来重复利用原有类的功能(实际上我们在做题过程中遇到的代码大部分都是这种形式),而继承是面向对象的特征之一,组合是显示的,而继承是隐式的。组合和继承存在对应关系,组合中的整体类对应继承中的子类,组合中的局部类对应继承中的父类。
Car,Vehicle,Tire
Car和Vehicle是继承关系(用is a来理解),而Car和Tire是组合关系(用has a来理解)
class Vehicle{}
class Car extends Vehicle{}

class Tire{}
class Car{
private Tire t = new Tire();
}
在实际使用中遵循两个原则
1.除非两个类是is a的关系,否则不要轻易的使用继承,不要为了单纯的代码重用而使用继承,因为过多的使用继承会降低代码的可维护性,比如当父类被修改的时候,会影响到所有继承他的子类,从而增加程序维护的难度和成本
2.不要仅仅为了实现多态而是用继承,如果类之间没有”is a”的关系,可以通过组合和接口的方式来达到相同的目的。在java语言中,能够使用组合就不要使用继承。
4.2.8——抽象类和接口有什么异同?
1.除去内部的属性,方法这些问题,要记住一个老是被我忽略的问题,就是抽象类的类名一定要用abstract来修饰(public ,和默认都可以作为访问修饰符),这一定和抽象类内部类似,而接口的接口名也是可以使用(public和默认作为访问修饰符),这和接口内部全部被public隐藏修饰有所不同。
2.抽象类和接口表示的两种抽象机制的不同之处到底在哪里?
抽象类表达的是一个实体
而接口表达的是一个概念
4.2.10——如何获取父类的类名
1.java语言提供了获取类名的办法:getClass().getName(),开发人员可以调用这个方法来获取类名,代码如下
public class Test{
Public void test(){
system.out.println(this.getClass().getName());
}
Public static void main(String[] args){
new Test().test();
}
}
输出结果:Test
2.那么是否可以通过调用父类的getClass().getName方法来获取父类的类名呢?
Class A{}
public class B extends A{
public void test(){
System.out.println(super.getClass().getName());
}
public static void main(String[] args){
new B().test();
}
}
输出结果:B
为什么输出结果不是A而是B呢?主要原因在于java语言中任何类都继承自Object类,getClass()方法在Object类中被定义为final和native,子类不能覆盖该方法,因此this.getClass()和super.getClass()最终都调用的是Object类中的getClass()方法,而Object类中的getClass()方法的返回是:返回此Object的运行时类。所以还是输出B。
3.那么如何可以在子类中得到父类的名字呢?
可以通过java的反射机制,使用getClass().getSuperClass().getName();
class A{}
class B extends A{
public void test(){
System.out.println(this.getClass().getSuperClass().getName());
}
Public static void main(String[] args){
New A().test();
}
}
输出:A
4.Object类下的getClass()
public final Class