下面是一个普通继承的代码及调用:
public class Demo46 {
public static void main(String[] args){
Zi zi=new Zi();
zi.method1();
zi.method2();
zi.method3();
}
}
class Fu{
void method1(){
System.out.println("fu method_1");
}
void method2(){
System.out.println("fu method_2");
}
}
class Zi extends Fu{
void method1(){
System.out.println("zi method_1");
}
void method3(){
System.out.println("zi method_3");
}
}
运行结果:zi method_1
fu method_2
zi method_3
在多态中非静态成员函数的特点:
在编译时期,参阅引用变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败。
在运行时期,参阅对象所属类中是否有调用方法。
运行结果是:public class Demo46 { public static void main(String[] args){ // Zi zi=new Zi(); // zi.method1(); // zi.method2(); // zi.method3(); Fu fu=new Zi(); fu.method1(); fu.method2();
fu.method3();在编译时期,参阅引用变量所属的类中没有method3的调用方法,故会编译失败。 } } class Fu{ void method1(){ System.out.println("fu method_1"); } void method2(){ System.out.println("fu method_2"); } } class Zi extends Fu{ void method1(){ System.out.println("zi method_1"); } void method3(){ System.out.println("zi method_3"); } }Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method method3() is undefined for the type Fu
at com.basic.Demo46.main(Demo46.java:12)正确的代码是:
public static void main(String[] args){ // Zi zi=new Zi(); // zi.method1(); // zi.method2(); // zi.method3(); Fu fu=new Zi(); fu.method1(); fu.method2(); } } class Fu{ void method1(){ System.out.println("fu method_1"); } void method2(){ System.out.println("fu method_2"); } } class Zi extends Fu{ void method1(){ System.out.println("zi method_1"); } void method3(){ System.out.println("zi method_3"); } }
运行结果为:
zi method_1
fu method_2
总结:非静态成员函数在多态调用时,编译看左边,运行看右边。也即是对于 Fu f=new Zi();来说,编译的时候看Fu类中是否有调用的成员函数,若有,编译通过,没有,编译失败,在运行的时候,看Zi类中的调用的函数。
在多态中静态成员函数的特点:
无论编译还是运行,都参考左边(引用型变量所属的类)
运行结果为:public class Demo46 { public static void main(String[] args){ Fu fu=new Zi(); fu.method4(); Zi zi=new Zi(); zi.method4(); } } class Fu{ int num=6; void method1(){ System.out.println("fu method_1"); } void method2(){ System.out.println("fu method_2"); } static void method4(){ System.out.println("fu method_4"); } } class Zi extends Fu{ int num=9; void method1(){ System.out.println("zi method_1"); } void method3(){ System.out.println("zi method_3"); } static void method4(){ System.out.println("zi method_4"); } }
fu method_4
zi method_4
在多态中成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)
public class Demo46 { public static void main(String[] args){ Fu fu=new Zi(); System.out.println(fu.num); Zi zi=new Zi(); System.out.println(zi.num); } } class Fu{ int num=6; void method1(){ System.out.println("fu method_1"); } void method2(){ System.out.println("fu method_2"); } } class Zi extends Fu{ int num=9; void method1(){ System.out.println("zi method_1"); } void method3(){ System.out.println("zi method_3"); } }
运行结果为:
6
9