java多态中的就近原则介绍
直接上题:
题目补充:
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时,注意:要用到就近原则
到此这篇关于java多态中的就近原则介绍的文章就介绍到这了,更多相关java多态就近原则内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
赞 (0)