日期:2014-05-20  浏览次数:20662 次

子类继承父类 是否继承了父类一切非私有的属性和方法?
请看看下面的代码输出什么.. 好吗
class Person{
  String name = "person" ;

  public void shout(){
  System.out.println(name);
  }
}

class Stu extends Person{
  String name = "student" ;
  String school = "school" ;
}
public static void main(String[] args){
  Person p = new Stu();
  p.shout();
}

  若是把main方法里的 Person p = new Stu() 改成 Stu s = new Stu()
  s.shout()输入什么.
  老师说子类继承父类之后 子类里就有父类非私有的所有属性和方法的一份拷贝
  那我的p.shout()就是调用自己本身拷贝的方法.而不是父类的那个shout()方法 是这样吗? 

  我把题目运行了 .结果发现 老师的话把我绕进去了.....谢谢大家的解答的 .

------解决方案--------------------
首先,不管你是Person p = new Stu(); 还是 Stu stu = new Stu(),结果都是输出父类的属性值
因为子类Stu并没有重写父类方法shout(),所以在调用shout方法的时候,shout方法中引用的属性都将是super.属性。至于属性继承方面,确实是覆盖了,但是在父类的方法中并未能引用到子类的属性
------解决方案--------------------
首先,我跟你说学习Java不要被绕在这些平时编程极少遇到的情况上面,否则耗费时间太多没有什么实际长进。你举的这种实例实际上是编程当中应该尽量避免的错误,我问你 父类里面已经有了name属性,你干嘛要子类里面再写一个name属性?

第二,你老师说的不是很确切,子类是继承了属性和方法,但是想要执行出来还与访问控制权限和属性的重写等相关,你这里父类里面有name,而子类里面也有name,这样子类执行继承的方法的时候根据最小作用域原则会调用父类的name属性,而不是实际子类的。
------解决方案--------------------
什么叫拷贝?

对象New出来后,类变量存放在heap segment,方法存放在代码区,只有在调用的时候方加载进内存的堆栈中,并且都是先进后出的!至于所谓父类继承,无非不就是引用父类的成员变量和方法罢了,当然还有重写的情况!

你想想吗,怎么会拷贝!你不难受,你电脑也背不住呀!!!