//在调用方法的时候,不是看句柄是哪一个类,而应该看对象是属于哪一个类的,属于哪一个类的,就调用哪一个类的成员和方法。
//子类可以添加自己的新方法,但是子类对象的引用赋值给父类句柄之后,不能使用父类的句柄访问子类的新方法。
//父类的方法重载之后,将子类对象赋值给父类句柄,就不能使用父类句柄调用的该方法为子类覆盖的方法,而不是父类方法。方法覆盖机制。
//但是,对父类中的变量,如果在子类中重新定义了,在使用该变量的时候,子类的对象使用它,就调用子类的该变量;父类的对象使用它,就调用父类的该变量。
class S508{ int i = 1; int fun(int i,int j){ System.out.println("S508() i+j = "+ (i+j)); return i+j; } } class A508 extends S508{ // int i = 9; int j = 10; int fun(int i,int k){ System.out.println("A508() i*k = "+i*k); return i*k; } double fun(double i,int j){ System.out.println("A508() i+j = "+(i+j)); return i+j; } } public class F508{ public static void main(String[] args) { S508 s= new S508(); s.fun(2,5); System.out.println(s.i); A508 a = new A508(); a.fun(2,5); System.out.println(a.i); // a = s; a.fun(2.2,5); System.out.println(a.i); s = a;//子类对象赋值给父类句柄 // System.out.println(s.i); s.fun(2, 5); System.out.println(s.i); // System.out.println(s.j); } }
输出结果:(IDE eclipse)
S508() i+j = 7
1
A508() i*k = 10
1
A508() i+j = 7.2
1
A508() i*k = 10
1