4.7 final关键字的特点
final修饰的类不可以被继承。
final修饰的方法不可以被覆盖。
final修饰的变量是一个常量,只能被赋值一次。
写法规范:常量所有字母都大写,多个单词,中间用_连接。
4.8 抽象类的特点
(1)抽象类和抽象方法必须用abstract关键字来修饰;
(2)抽象方法只有方法声明,没有方法体,定义在抽象类中。
(3)抽象类不可以被实例化,也就是不可以用new创建对象。
原因如下:
①抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。例如:犬科是一个抽象的概念,真正存在的是狼和狗。
②而且抽象类即使创建了对象,调用抽象方法也没有意义。
③抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。
(4)抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
(5)抽象类的子类:要么是抽象类,要么重写抽象类中的所有抽象方法
(6)抽象类中有构造函数,用于给子类对象进行初始化。
(7)抽象类的成员方法特性:
①抽象方法——强制要求子类做的事情;
②非抽象方法 ——子类继承的事情,提高代码复用性。
※常见面试题:
(1)一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
答:可以。意义是:这么做的目的只有一个,不让其他类创建本类对象,交给子类完成。
(2)abstract不能和哪些关键字共存?
① 不和static共存: 被abstract修饰的方法没有方法体; 而被static修饰的可以用“类名·方法名”调用,但“类名·方法名”调用抽象方法没有意义;
② 不和final共存:被abstct修饰的方法强调重写,而被final修饰的方法不让其重写,矛盾;
③ 不和private共存:abstct修饰的方法,为了让子类看到并重写;而被private修饰的方法,为了不让子类访问,矛盾。
(3)抽象类一定是个父类吗?
答:是的,因为需要子类覆盖其方法后才可以对子类实例化。
4.9 接口的特点
(1)接口用关键字interface表示。格式:interface 接口名 { }
实现接口用implements表示。格式:class 类名 implements 接口名 { }
(2)接口中的成员修饰符是固定的:
成员常量:publicstaticfinal int num = 10 ;
成员函数:publicabstract viod show { }
(3) 类和接口的区别:
(4)instanceof:用于判断对象的具体类型,只能用于引用数据类型判断,通常在向下转型前用于健壮性的判断。