多态中成员访问特点
- 成员变量:编译看左边,执行看左边
- 成员方法:编译看左边,执行看右边(因为成员方法有重写,而成员变量没有
优缺
- 定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
- 弊端:不能使用子类的特有功能
demo
package duotai;
public class demo {
public static void main(String[] args) {
AnimalOperator ao = new AnimalOperator();
Cat c = new Cat();
ao.useAnimal(c); //编译看左边AnimalOperator下有eat方法,执行看右边,eat被子类重写
Dog d = new Dog();
ao.useAnimal(d);
}
}
animal
package duotai;
public class Animal {
public void eat(){
System.out.println("动物吃");
}
}
cat
package duotai;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("cat eat");
}
}
dog
package duotai;
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("eat dog");
}
}
operator
package duotai;
public class AnimalOperator {
public void useAnimal(Animal a){
a.eat();
}
}
转型
向上转型 Animal a=new cat();
向下转型 cat c=(cat)a;
抽象类
特点
- 抽象类和抽象方法必须使用abstract修饰
- 抽象类中不一定有抽象方法
- 抽象类不能实例化
- 抽象类的子类:要么重写抽象类中的所有抽象方法,要么是抽象类
抽象类有构造函数(虽然不能实例化),这样可以使用构造函数初始化抽象类中的数据。
抽象方法使得子类必须重写方法。
接口
- 要么重写接口中所有抽象方法,要么是抽象类。
- int num 等价于 public static final int num,public abstract void show() 等价于 void show();
- 接口没有构造方法,接口的实现的构造方法中super()使用的构造方法是所有类的超集object()的构造方法。
抽象是对事物的抽象、接口是对行为的接口