1.总体规则:多态时,访问的成员在父类中必须要有;否则编译错误(也就是我们之前所说的:多态时,父类的引用不能访问子类特有成员)
2.多态的几种形式:
1).类的多态:
class Animal{}
class Cat extends Animal{}
main(){
Animal a = new Cat();
}
2).抽象类多态:
abstract class Animal{
public abstract void show();
}
class Cat extends Animal{
public void show(){
}
};
main(){
Animal a = new Cat();//OK的
a.show();//OK的--访问的是子类重写的show()
}
3).接口多态:
interface IA{
public void show();
}
class Sub implements IA{
public void show(){
}
}
main(){
IA a = new Sub();//OK的
a.show();//OK的--访问的是Sub的show()
}
3.多态时,成员访问的特点:
1).成员变量:编译看左边(编译时,父类中必须要有这个成员,否则编译错误),运行看左边(访问的是父类的);
class Animal{
int num = 20;
}
class Cat exstends Animal{
int n = 10;
int num = 30;
}
main(){1
//多态:
Animal a = new Cat();
System.out.println(a.n);//多态时,不能访问子类特有成员
System.out.println(a.num);//OK的-->20(访问的是父类的)
}
2).成员方法:编译看左边,运行时看右边;
class Animal{
void show(){
System.out.println("a");
}
}
class Cat extends Animal{
void show(){
System.out.println("b");
}
}
main(){
//多态
Animal a = new Cat();
a.show();//b
}
3.静态方法:编译看左边,运行看左边;
class Animal{
public static void show(){
System.out.println("a");
}
}
class Cat extends Animal{
public static void show(){
System.out.println("b");
}
}
main(){
Animal a = new Cat();
a.show();//a