多态的介绍
概念:多态就是某一个事物在不同时刻表型出来的不同状态
多态的前提:要实现多态必须在有继承的基础下;
要有方法的重写(没有重写则多态就没有实际的)
要有父类引用指向子类的对象(比如猫继承动物)
动物 an=new 猫();
多态中成员访问特点:
左边表示父类
右边表示子类
成员变量
编译看左边,运行看左边。(简单理解为最后的值跟父类一样)
构造方法
创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。(看子类重写后的)
成员方法
编译看左边,运行看右边。(运行跟随子类的)
静态方法
编译看左边,运行看左边。(静态不受影响所以跟随父类)
(静态和类相关,算不上重写,所以,访问还是左边的)
多态的优缺点:
优点:因为继承为前提所以提高了代码的维护性
提高了代码的扩展性(有多态自身保证)
弊端:不能直接使用子类的引用
解决方法:把父类的引用强制转化为子类的引用(向下转型)
动物 an=new 猫();
Cat cat=(Cat) an;
举例:
package MyDemo;
public class Text{
public static void main(String[] args) {
Animal an= new Cat();
an.show();
Cat cat=(Cat)an; //向下转型调用子类特有方法
cat.eat();
// ((Cat) an).eat();
}
}
class Animal{
public void show(){
System.out.println("父类的方法");
}
}
class Cat extends Animal{
@Override
public void show() {
System.out.println("子类的方法");
}
public void eat(){
System.out.println("调用了子类的特有方法");
}
}
抽象类
抽象类特点:
抽象类和抽象方法必须用abstract关键字修饰
抽象类格式: abstract class 类名 {}
抽象方法格式: public abstract void eat();
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
构造方法的作用
用于子类访问父类数据时的初始化
抽象类不能直接实例化那么,抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
抽象类的子类
要么是抽象类
要么重写抽象类中的所有抽象方法
抽象类的成员特点:
成员变量:既可以是变量,也可以是常量。
构造方法:有。
用于子类访问父类数据的初始化。
成员方法:既可以是抽象的,也可以是非抽象的。
接口
接口概述:为了体现事物功能的扩展性,Java中就提供了接口来定义这些额外功能,并不给出具体实现,将来哪些对象需要把额外功能调用实现即可;
接口用关键字interface表示
格式: interface 接口名 {}
类实现接口用implements
表示 格式: class 类名 implements 接口名 {}
接口利用多态来实现实例化
接口的子类
a:可以是抽象类。但是意义不大。
b:可以是具体类。要重写接口中的所有抽象方法。
接口的特点:
成员特点
成员变量;只能是常量,并且是静态的。
默认修饰符:public static final
建议:自己手动给出。
构造方法:接口没有构造方法。
成员方法:只能是抽象方法。
默认修饰符:public abstract