一,多态(重点)
1.什么是多态:多态是在继承/实现情况下的一种现象。
2.多态的表现
(1)对象多态:父类类型的变量接受子类类型的对象。
(2)行为多态:多个同类型的变量调用同一个方法,最终执行的结果/行为不一样。
3.多态的前提:要有继承/实现;存在父类引用子类对象;要有方法重写。
4.成员访问特点
(1)实例变量:编译看父类(左边),运行看父类(左边)
(2)实例方法:编译看父类(左边),运行看子类(右边)
(3)类方法:编译看父类(左边),运行看父类(左边)
(4)总结:除了实例方法编译看父类,运行看子类,其余情况都看父类。
5.多态的好处:在多态形式下,右边的对象是解耦合的,更便于扩展和维护。
6.弊端:多态形式下不能使用子类独有成员。
7.应用场景:定义方法时,使用父类类型的形参,可以接收父类类型的对象和一切子类对象,扩展性更强,更便利。
8.类型转换
(1)向上转型:父类 变量名=new 子类()
例子:People p=new Teacher()
(2)向下转型:子类 变量名=(子类)父类变量
例子:Teacher t=(Teacher)p
(3)注意:如果对象的真实类型与强转后的类型不同,编译阶段不会报错,但是运行时会报错 (ClassCastException)
(4)建议:向下转型前,使用instenceof关键字,判断当前对象的真实类型,在进行转型。
二,final
1.final修饰类(最终类)
特点:不能被继承
2.final修饰方法(最终方法)
特点:不能被重写
3.final修饰变量
特点:
(1)该变量只能被赋值一次
(2)修饰基本类型的变量,变量存储的数据不能被改变
(3)修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以被改变 的
4.常量
(1)本质:使用static final修饰的成员变量被称为常量
(2)作用:通常用来记录系统的配置信息
(3)书写规范:常量名所有字母必须大写,多个单词之间需要用下划线“_”隔开
(4)好处
①代码可读性更好,可维护性也更好
②程序编译后,常量会被“宏替换”:出现常量的地方全部会被替换成其记住的字面量,这样可 以保证使用常量和直接用字面量的性能是一样的
三,abstract
1.abstract修饰方法(抽象方法):只能有方法签名,不能有方法体
2.abstract修饰类(抽象类):可以有抽象方法的类
(1)本质:还是一个类,可以有类的全部内容,还可以有抽象方法。
(2)特点
①不能创建对象,如果创建对象就会报错
②抽象类虽然不能创建对象,但是可以作为父类让子类继承,而且子类继承父类必须重写父类 的所有抽象方法
③子类继承父类如果不想重写父类的抽象方法,要想不报错,这个子类也必须是抽象类
(3)好处
①用抽象类可以把子类中相同的代码,包括方法声明,都抽取到父类,这样可以更好的支持多 态,提高代码的灵活性
②我们不知道系统未来具体的业务实现时,我们可以先定义抽象类,将来让子类去实现,以方 便系统的扩展
(4)注意事项
①抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
②类该有 的成员,抽象类都可以有
③一个类继承抽象类,要么重写全部抽象方法,要么这个类也必须定义成抽象类
四,接口(重点)
1.格式:public interface 接口名{}
2.组成:
(1)jdk8之前(不包括jdk8):接口中只能有常量和抽象方法
(2)jdk8之后(包括jdk8):除了常量和抽象方法,还还可以有默认方法,抽象方法(jdk9及以 后的版本才可以),类方法
①默认方法:默认方法:使用public dafault修饰,使用实现类的对象调用
②静态方法:public static修饰,必须用当前接口名调用
③私有方法:private修饰,jdk9开始才有的,只能在接口内部被调用
3.接口的实现
(1)接口不能创建对象
(2)接口是用来被类实现(implements)的,实现接口的类称为实现类
(3)实现类的接口,要么重写抽象方法,要么实现类本身定义为抽象类
(4)格式:修饰符 class 实现类 [extends 父类] implements 接口1, 接口2, 接口3 , ... {}
(5)分类:单实现,多实现,继承并实现
4.好处
(1)弥补了类单继承的不足,一个类同时可以实现多个接口
(2)让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现
5.注意事项
(1)一个接口继承多个接口,如果存在默认方法同名,子接口必须重写一次
(2)一个类实现多个接口,如果存在默认方法同名,实现类必须重写一次
(3)一个类继承父类,并实现接口,父类成员方法与接口默认方法同名,优先继承父类成员方法
五,内部类
1.成员内部类:就是类中的一个普通成员,类似于成员变量,成员方法
(1)创建对象的格式:外部类名.内部类名 对象名 = new 外部类(...).new 内部类(…)
(2)特点
①可以直接访问外部类的实例成员、静态成员
②可以拿到当前外部类对象,格式是:外部类名.this
2.静态内部类:有static修饰的内部类,属于外部类自己持有
(1)创建对象的格式:外部类名.内部类名 对象名 = new 外部类.内部类(…)
(2)特点:可以直接访问外部类的静态成员,不能直接访问外部类的实例成员
3.局部内部类:方法中定义的类,只能在当前方法中使用
4.匿名内部类(重点):是局部内部类的一种简化形式.本质上是一个子类/实现类对象
(1)特点:由底层,创建一个局部内部类,并会立即创建出一个子类对象
(2)作用:用于更方便的创建一个子类对象
(3)书写格式:new 类或接口(参数值…) { 类体(一般是方法重写);};
(4)应用场景:匿名内部类通常作为一个参数传输给方法