A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Oh_JAVA 中级黑马   /  2016-7-17 22:11  /  694 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Oh_JAVA 于 2016-7-17 22:14 编辑
  1. public class test {

  2.         public static void main(String[] args) {
  3.                 new B().prin();
  4.         }

  5. }
  6. class A{
  7.         private int num = 3;

  8.         public int getNum() {
  9.                 return num;
  10.         }

  11.         public void setNum(int num) {
  12.                 this.num = num;
  13.         }
  14.         
  15. }
  16. class B extends A{
  17.         private int num=4;
  18.         public void prin() {
  19.                 System.out.println(getNum());
  20.         }
  21. }
复制代码
在代码中 B 继承了 A,继承这个概念只是形式上的(虚的),还是真的会继承到自己本身,如果是真的继承到本身,B类就相当于这样:
  1. class B {
  2.         private int num=4;
  3.         public void prin() {
  4.                 System.out.println(getNum());
  5.         }
  6.         
  7.         public int getNum() {
  8.                 return num;
  9.         }

  10.         public void setNum(int num) {
  11.                 this.num = num;
  12.         }
  13. }
复制代码
这样子 按道理应该输出 4,真实答案是输出 3,那这样子是虚的喽,虚实我不知道这样的理解是不是其实和继承不搭嘎
既然输出是3,那应该就只有产生两种方式了
1.就是像我上面第二段代码一样,真的继承下来了,调用自己的getNum(),但是java知道那个getNum()是父类继承下来的,所以num直接去父类里找了
2.就是第一段代码一样,虚的,直接去父类调用getNum(),找到num
上面两种方式应该是那种,还是其他的解释?
我不知道大家有没有弄懂我想表达的意思,也可能就是我脑子一根筋,想不明白吧~~


2 个回复

倒序浏览
cat73 黑马帝 2016-7-17 22:18:20
沙发
本帖最后由 cat73 于 2016-7-17 22:20 编辑

感觉实际开发中变量覆盖的情况是很少出现的。。

JVM 会存储类本身以及每一个父类的方法,即使被覆盖了也会存储,以便通过 super.method() 的方式来调用。

其实就像 JavaScript 这种语言的话是真的会输出 4。。。
JavaScript 会遍历原型链并使用最先被找到的作为结果。。。
回复 使用道具 举报
cat73 发表于 2016-7-17 22:18
感觉实际开发中变量覆盖的情况是很少出现的。。

JVM 会存储类本身以及每一个父类的方法,即使被覆盖了也会 ...

额。。我表达不清楚,我想说这个继承的正式原理是真的把那些继承下来了吗?继承不会继承private的,所以也不会覆盖,再看了一遍好像有点豁然了,好像不是真的继承,这个继承的真实是不是 在B类中的getNum() 实际上super.getNum(),只是省略了super关键字
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马