final关键字
final关键字修饰类体现在该类不能被继承
final关键字修饰成员方法体现在该方法不能被重写
final修饰到的成员变量必须被初始化且不能改变值
(初始化三种方式:显式初始化、构造块中初始化、构造方法体中初始化)
常量
通常使用public static final关键字共同修饰成员变量来表达常量的含义,常量的命名规范要求所有字母都要大写,不同的单词之间采用下划线连接
多态
主要指同一种事物表现出来的多种形态
饮料:可乐、雪碧、芬达、脉动...
人:学生、教师、工人、保安....
多态的语法规则
父类类型 引用变量名 = new 子类类型()
多态的特点:
当父类类型的引用指向子类类型的对象时,父类类型的引用可以直接调用父类独有的方法
当父类类型的引用指向子类类型的对象时,父类类型的引用不可以直接调用子类独有的方法
对于父子类都有的非静态方法来说,编译阶段调用父类版本,运行阶段调用子类版本(动态绑定)
对于父子类都有的静态方法来说,编译阶段和运行阶段都调用父类版本
严格来说,静态方法不能被重写
引⽤数据类型之间的转换
-
引⽤数据类型之间的转换⽅式有两种:⾃动类型转换 和 强制类型转换。
-
⾃动类型转换主要指⼩类型向⼤类型的转换,也就是⼦类转为⽗类,也叫做向上转型。
-
强制类型转换主要指⼤类型向⼩类型的转换,也就是⽗类转为⼦类,也叫做向下转型或显式类型转换。
-
引⽤数据类型之间的转换必须发⽣在⽗⼦类之间,否则编译报错。
-
若强转的⽬标类型并不是该引⽤真正指向的数据类型时则编译通过,运⾏阶段发⽣类型转换异常。
-
为了避免上述错误的发⽣,应该在强转之前进⾏判断,格式如下:
if (引⽤变量 instanceof 数据类型) 判断引⽤变量指向的对象是否为后⾯的数据型。
抽象类
抽象类主要指不能具体实例化的类并且使用abstract关键字修饰,也就是不能创建对象
抽象方法
抽象方法指不能具体实现的方法并且使用abstract关键字修饰,也就是没有方法体
访问修饰符 abstract 返回值类型 方法名(形参列表);
抽象类中可以有成员变量、构造⽅法、成员⽅法。
抽象类中可以没有抽象⽅法,也可以有抽象⽅法。
有抽象⽅法的类必须是抽象类,因此真正意义上的抽象类应该具有抽象⽅法且使⽤abstract关键字修饰。
抽象类的实际意义
抽象类的实际意义不在于创建对象⽽在于被继承。
当⼀个类继承抽象类后必须重写抽象⽅法,否则该类也变成抽象类,也就是抽象类对⼦类具有强制性和规范性,因此叫做模板设计模式。
面试考点:
static关键字能不能和abstract关键字共同修饰一个方法?不能
static是修饰的方法是通过类名.的方式调用,但是abstract不能实例化对象
final关键字能不能和abstract关键字共同修饰一个方法?不能
final修饰的方法不能被重写,但是抽象方法就等着被子类重写
native关键字能不能和abstract关键字共同修饰一个方法?不能
native修饰的方法代表该方法已经被实现
private关键字能不能和abstract关键字共同修饰一个方法?不能
private修饰的方法是不能被继承的
接口
接口中只能有常量,不能有成员变量
接口中只能有抽象方法
定义类的关键字是class,而定义接口的关键字是interface
接口与接口之间是继承,当某一个类实现了子接口,它父类接口中的抽象方法也是需要重写的
类和接口之间的关系
抽象类和接⼝的主要区别(笔试题)
-
定义抽象类的关键字是abstract class,⽽定义接⼝的关键字是interface。
-
继承抽象类的关键字是extends,⽽实现接⼝的关键字是implements。
-
继承抽象类⽀持单继承,⽽实现接⼝⽀持多实现。
-
抽象类中可以有构造⽅法,⽽接⼝中不可以有构造⽅法。
-
抽象类中可以有成员变量,⽽接⼝中只可以有常量。
-
抽象类中可以有成员⽅法,⽽接⼝中只可以有抽象⽅法(Java8以前的版本)。
-
抽象类中增加⽅法时⼦类可以不⽤重写,⽽接⼝中增加⽅法时实现类需要重写(Java8以前的版本)。
-
从Java8开始增加新特性,接⼝中允许出现⾮抽象⽅法和静态⽅法,但⾮抽象⽅法要使⽤default关键字修饰。
-
从Java9开始增加新特性,接⼝中允许出现私有⽅法(private),可以实现多个默认方法的共性提取(有重复代码就可以提取出来一个方法)。