java多态中的就近原则介绍

网友投稿 292 2022-09-07


java多态中的就近原则介绍

直接上题:

题目补充:

class A {

int m; //-10

int getM() {

return m;

}

int seeM() {

return m;

}

}

class B extends A {

int m ; //10

intbkiStrAqmE 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+"bkiStrAqmE 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时,注意:要用到就近原则


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【DELM分类】基于鸽群算法改进深度学习极限学习机实现数据分类附matlab代码
下一篇:【图像识别】基于计算机视觉实现自动报靶系统(重弹孔)含Matlab源码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~