多态
调用特点
方法形参为类,则可以传递其与其所有子类
调用成员:
子类会继承父类成员变量;
若子类对成员方法进行了重写,则会把父类方法覆盖。
优缺点
不能调用子类的特有方法,必须父子都有才能调用。为了调用子类的特有方法,可以:
类型转换
向上转换(自动)
父类类型 变量名 = new 子类类型();
如:Animal a = new Cat();
向下转换(强制)
子类类型 变量名 = (子类类型) 父类变量名;
如:Aniaml a = new Cat();
Cat c =(Cat) a;
父子之间可以转换,但子和子之间不可以!
为了简化选择,并且实现在子之间选择,提出了:
instanceof关键字
public class Test {
public static void main(String[] args) {
// 向上转型
Animal a = new Cat();
a.eat(); // 调用的是 Cat 的 eat
// 向下转型
if (a instanceof Cat){
Cat c = (Cat)a;
c.catchMouse(); // 调用的是 Cat 的
catchMouse
}
else if (a instanceof Dog){
Dog d = (Dog)a;
d.watchHouse(); // 调用的是 Dog 的
watchHouse
}
}
}
JDK14简化后:
//新特性
//先判断a是否为Dog类型,如果是,则强转成Dog类型,转换之后变量名为d
//如果不是,则不强转,结果直接是false
if(a instanceof Dog d){
d.lookHome();
}
else if(a instanceof Cat c){
c.catchMouse();
}
else{
System.out.println("没有这个类型,无法转换");
}
包
包名命名规范:
路径名.路径名.xxx.xxx
// 例如:com.itheima.oa
使用不同包下的相同类:
//使用全类名的形式即可。
//全类名:包名 + 类名
//拷贝全类名的快捷键:选中类名crtl + shift + alt + c 或者用鼠标点
copy,再点击copy Reference
com.itheima.homework.demo1.Student s1 = new
com.itheima.homework.demo1.Student();
com.itheima.homework.demo2.Student s2 = new
com.itheima.homework.demo2.Student();
final关键字
final class 类名 {
}
final修饰的类不能被继承、重写。
①基本类型的局部变量,被ænal修饰后,只能赋值一次,不能再更改。
②显示初始化(在定义成员变量的时候立马赋值)
抽象类
写法:abstract写在public后面
没有方法体的方法是抽象方法!
p.s.抽象类不能创建对象,如果要创建则要重写所有抽象方法。也就是父类为抽象类,而写一些方法还不确定,所以在非抽象子类中重写后,再创建子类的对象。
抽象类的细节
1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其 非抽象子类的对象。
2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。
3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类,编译无法通过而报错。
5. 抽象类存在的意义是为了被子类继承。
理解:抽象类中已经实现的是模板中确定的成员,抽象类不确定如何实现的定义成抽象方法,交给具体的子类去实现。
接口(功能类)
新建接口的时候选择Interface,不是class!
interface 接口名称{
// 抽象方法
}
正常在多态中,传递参数只要传递一条线的亲属关系,都可以由子类继承。但由于其他线上的人也想继承该类,但不能作为参数进来,所以引出接口。
抽象类是事物,接口是行为。
注意:接口不能创建对象!!!!
接口可以多实现!
接口中的成员特点
接口和类之间的关系
多个接口中有重名的方法,重写一次就行了。
接口和接口之间的关系
继承关系:可以单继承,可以多继承。
注意:如果实现了最下面的子接口,则要重写所有的抽象方法。(重写方法,重写的时候并不是抽象方法)
新版本JDK的其他功能
适配器设计
由于刚才我们调用子类时需要重写所有的抽象方法,太麻烦,于是有了适配器模式。
在适配器InterAdapter.class中,方法体全空着(空实现);且适配器写成抽象类最好,因为其内部为空实现,不需要创建对象,所以写上abstract。
test里面直接extends InterAdapter,重写需要的方法体就可以了。
总结