java多态就近原则
踏过山河,踏过海 人气:0直接上题:
题目补充:
class A { int m; //-10 int getM() { return m; } int seeM() { return m; } } class B extends A { int m ; //10 int getM() { // System.out.println(this.m+"............"+super.m); return m+10; } } public class Test { public static void main(String args[]) { B b = new B(); //先找B,B没有再找A,找A的时候,就要注意:就近原则了 b.m = 10; //此刻,A类的m为0,B类的m为10 System.out.println("b.seeM():"+b.seeM()); System.out.println("b.getM():"+b.getM());//20 A a = b; //把b符给a这样创建对象的方法,还是先找B,B没有再找A,找A的时候,就要注意:就近原则了 //此刻,A类的m仍为0,B类的m仍为10 System.out.println("..................................."); System.out.println("a.seeM():"+a.seeM()); System.out.println("a.getM():"+a.getM()); System.out.println("..................................."); a.m = -10;//A只能改自己的m,不能改B的m,所以 //此刻,A类的m为-10,B类的仍m为10 System.out.println("b.getM():"+b.getM());//20 b始终调用重写后的getM()方法 System.out.println("a.getM():"+a.getM());//b.getM()是20,后来把b赋给a,a也成了20 20 //b调用的getM()方法是重写之后的getM()方法,所以是10+10 System.out.println("a.seeM():"+a.seeM()); System.out.println("b.seeM():"+b.seeM());//此时不管是a的m还是b的m都是-10 -10 System.out.println("a.m:"+a.m+" b.m:"+b.m); System.out.println("a.getM():"+a.getM()); //因为b自己没有seeM方法,所以b在使用seeM方法时,是用的父类A的seeM方法,根据就近原则,b在调用seeM方法时是使用的A.m的-10 //所以,b通过seeM()方法看到的是m是a的m } }
判断成员变量的方法\技巧其实很简单:
只需要:
确定当前这个类 调用的成员方法 是先找谁?
=>如果先找父类,找就完事了
=>如果先在子类,子类找到了要用的方法,那就用;
如果没找到,还要去父类里面去找要用到的方法,注意,这时就要使用就近原则了
所以,关键有二:
一,确定先找谁?先找父类还是先在子类
eg:以上面的题为例:
B b = new B();//先找子类B, 子类 方法找完还 没找到 时,还要去 父类 里面找
A a = b;//注意这种 : 还是 先找 子类B, 子类 方法找完还 没找到 时,还要去 父类 里面找
A a = new A();//这个时候,先找 父类A,但 父类 方法找完还没找到时,不会再找 子类 了!
二,当从子类B找到父类A时,注意:要用到就近原则
加载全部内容