public class test {
public static void main(String[] args) {
Father f = new Son();
System.out.println(f.num);
f.print();
}
}
class Father{
int num=10;
public void print(){
System.out.println("Father");
}
}
class Son extends Father{
int num=20;
public void print(){
System.out.println("Son");
}
}
多态也叫作动态绑定。
对于成员变量:
编译、运行看的都是父类。
对于非静态的成员方法:
环境执行程序要经过编译、运行;成员方法在编译的时候到父类中找print( ),在运行的时候到子类中找print( )【编译看的是父类,运行看的是子类】。
对于静态的成员方法:
因为是静态的,相当于是用类名去调用,故编译、运行都看父类的。
并且对于非静态成员方法,如果print( )只存在于子类中,在父类中没有print( )的话,编译的时候就会出错,故不会运行。
父类引用指向子类对象是向上转型
先有向上转型,然后才有向下转型
多态的好处和弊端:
1、好处:提高了代码的维护性(是由继承保证的)
package pro5;
public class test {
public static void main(String[] args) {
//Animal a = new Dog();在实际开发中很少这样用,用下面的方式可以使用子类中的特定属性和行为
meth(new Cat());
meth(new Dog());
}
public static void meth(Animal a){ //当作参数的时候用多态最好,因为扩展性强
//关键字instanceof用来判断前边的引用是否和后面的数据类型相等
if(a instanceof Cat){
Cat c1 =(Cat)a;
c1.print();
c1.eat();
}else if(a instanceof Dog){
Dog d1 =(Dog) a;
d1.print();
d1.eat();
}else{
a.print();
}
}
}
class Animal{
public void print(){
System.out.println("Animal");
}
}
class Cat extends Animal{
public void print(){
System.out.println("Cat");
}
public void eat(){
System.out.println("Cat Eat");
}
}
class Dog extends Animal{
public void print(){
System.out.println("Dog");
}
public void eat(){
System.out.println("Dog Eat");
}
}
2、弊端:不能够使用子类特有的属性和行为。