再探java基础——对面向对象的理解(2)

时间:2022-11-20 16:52:54

对象、类和抽象类的区别

对象是一个具体的事物,类是对具有相同属性和行为的一组对象的抽象,对象是类的一个一个人的具体实例;抽象类是一种特殊的类,是对类的进一步抽象,抽象类不能被实例化。

类、抽象类和接口的异同

部分内容借鉴以下博文:http://www.cnblogs.com/qiuxiaoju/p/3174068.html

在面试可能经常被问到,接口有什么作用?相对于类而言,为何需要用类实现接口,接口和抽象类的区别等等诸如此类的问题。如果不仔细思考和总结一下这知识,还真不知道怎么回答。

Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方,才是它们的最佳位置呢?把它们比较一下,你就可以发现了。

相同点:

1.都是抽象类型,抽象类和接口都是对类进行抽象;

2.其中的抽象方法都必须被具体类实现;

3.都不可以被实例化,如果要非要通过new创建他们的实例,都需要通过匿名内部类的方式;

4.都可以定义公共的(public)和static属性和方法;如:

public int id = 5;

public final String name = "interface";

public static int age = 22;

public static final int weight = 55;

int i = 0;

不同点:

定义的角度:

1.定义抽象类用abstract class,定义接口用interface;

继承的角度:

2.一个具体的实现类只能继承一个父类,但可以实现多个接口;

属性和方法的角度:

3.抽象类可以定义private和protected属性和方法,而接口只能定义public和default(即默认的没有设定访问权限)的属性和方法;

4.Java抽象类可以提供某些方法的部分实现,而Java接口不可以;

5.抽象类可以有抽象方法和非抽象方法,子类可以有选择的实现抽象类中的非抽象方法,而实现类必须实现接口中的所有方法;

构造方法

6.接口不可以有构造方法,抽象类可以有构造方法;

设计理念不同

7.其实子类和抽象类的的关系表示的是”is-a”关系(塑料碗和瓷碗都是碗),是一种律属关系,子类属于父类,因此一个类只能继承继承一个类;子类和接口的关系表示的是“has-a”关系(智能手机继承自手机,同时实现了闹钟、MP3等各种功能),实现类拥有这个接口的特征也可以拥有另外一个借口的特征,因此一个类可以实现多个接口。

概况地说,接口是模块之间的协议,一些模块用于实现某些协议的具体动作,另外一些模块只针对接口编程,这样实现低耦合。
抽象类主要是用于继承设计的,主要用于模板设计!

经典的设计模式:缺省/默认适配模式(Default Adapter)

声明类型的工作仍然由Java接口承担,但是同时给出一个Java抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类。哈,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。

在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。

继承

1、方法(函数)重写(overwrite)要注意的机几点:
1),重写方法(函数)必须和被重写方法具有相同的方法名称、参数列表和返回类型;
2),重写的时候要从父类的函数声明中拷贝函数的声明(即函数名设参数的类型和个数)。
3),重写方法不能使用比被重写方法跟严格的访问权限。(为避免名称出错,重写时必须从基类中copy函数的声明)
2、super关键字指向当前类的父类。

3、构造方法:

a,子类的构造的过程必须调用其基类的构造方法;

b,子类可以在自己的构造方法中使用super(argument_list参数列表)调用基类的构造方法;即使用this(argument_list_)调用本类的另外的构造方法,如果调用super,必须写在子类构造方法的第一行。

c,如果子类的构造方法中没有显示地调用基类的构造方法,则系统默认调用基类无参数的构造方法;

d,如果子类的构造方法中没有显示地调用基类的构造方法,而基类中又没有无参数的构造方法,则编译出错。4、Object类是java所有类的根基类,如果在类的声明中未使用extends指明其基类,则默认为object类。
5、对象转型:

a,一个基类的引用类型对象可以“指向”其子类的对象;

b,一个基类的引用的不可以访问子类对象新增加的成员(属性和方法);

c,可以使用引用变量instanceof类名来判断该引用变量所“指向”的对象该类或该类的子类;

d,子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)。
6、动态绑定是指在“执行”期间(而非在编译期间)判定所引用对象的实际类型,根据实际的类型调用相应的方法。
 要符合的条件:a,要有继承;b,要有重写;c,父类引用指向子类对象。
7、抽象类;
 a,用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,这个方法叫做抽象方法;
 b,含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写;
 c,抽象类不能被实例化;
 d,抽象方法只需声明,而不需实现。
8、final关键字(类似于C++中的const)
 a,final的变量的值不能被改变;1),final的成员变量; 2)final的局部变量;
 b,final的方法不能被重写;
 c,final的类不能被继承。

继承和组合的关系

上次阿里面试的时候问到继承和组合的关,什么时候要用组合,什么时候要用继承。真后悔当初没有准备,不然就可以很容易地回答,现在想起来,当时回答的真是烂的不能再烂!

继承和组合的关系主要是要从理念上进行区分,继承是一种从属关系,是子由你来的一种关系;而组合是一种包含关系,是整体与部分的关系。

假设有两个类A和B,当A和B和关系是B is A,用继承:B extends A;当A和B和关系是B has A时,用组合,即B中含有A的实例化对象。