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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhkqy 中级黑马   /  2013-12-9 18:18  /  1197 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zhkqy 于 2013-12-9 18:21 编辑

  1. class Parent{
  2.     public String name="test";
  3.     public void parent(){
  4.         System.out.println("parent created");
  5.    }


  6. class Children{
  7.     public void children(){
  8.         
  9. System.out.println ("children created");
  10.       
  11. System.out.println (this.name);
  12.    }
  13. }

  14. Parent p=new Parent();
  15. Children c=new Children();  
复制代码


子类的构造方法中首先执行super();也就是父类的构造方法,问题是执行完父类的构造方法后父类是否被创建了实例,也就是是否被new.
如果有的话是哪里体现的。如果没有的话,那么子类又是如何可以调用到父类的非私有属性呢(视频上说是因为有extends关键字 子类如果没有就回去父类找,可是如果父类没有被创建的话,这个属性是不存在的啊!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 谢文斌 于 2013-12-9 18:36 编辑

  1. class Parent{
  2. public String name="test";
  3. public void parent(){
  4. System.out.println("parent created");
  5. }


  6. class Children extends Parent{
  7. public void children(){

  8. System.out.println ("children created");

  9. System.out.println (this.name);
  10. }
  11. }

  12. //Parent p=new Parent();
  13. Children c=new Children();
复制代码

如果你的Children没有写构造函数,那么它就会有一个隐式构造函数(默认),即Children(){},而这个默认的构造函数里又有一个隐式的super()语句,这个super()语句就表示new Parent();
这么说明白么?

看你的代码,你的Parent类和Children类里的方法应该是想写成构造函数吧?如果是就得改成和类名一样。构造函数是给对象初始化用的,在创建对象时执行并且只执行一次。


评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
首先有一个问题:你的代码里面Parent和Children在伦理上讲,确实有继承关系,但是在java里就。。
言归正传。
子类继承了父类的同时,也继承了父类的所有属性,不包括私有。
所以,假设Children继承了Parent,子类里就有了Parent()方法,也就是Super()。父类中的name属性也是有继承的,所以当子类中没有覆盖父类中的name的时候,14行的System.out.println (this.name);就是引用的父类中的属性。这些是解答你前面几个问题的。
最后一个问题:子类如果没有就回去父类找,可是如果父类没有被创建的话,这个属性是不存在的啊!
就像楼上说的,在子类继承了父类,并调用子类的时候,子类中隐藏的super()语句就会执行,这里的super()就是父类的构造函数Panrent().而要执行Parent()方法,父类Parent也要被执行,所以呢,父类在子类运行的时候,其实已经执行了一遍。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
楼主您好,您提供的代码还是有一些问题的。下面是我改过的代码:
  1. class Parent{
  2.        
  3.         public String name="test";

  4.         public Parent(){
  5.                 System.out.println("parent created");
  6.         }
  7. }

  8. class Children extends Parent{
  9.        
  10.         public Children(){  
  11.                
  12.                 System.out.println ("children created");
  13.                 System.out.println (this.name);
  14.         }
  15.         public static void main(String[] args)
  16.         {
  17.                 //Parent p=new Parent();
  18.                 Children c=new Children();  
  19.         }
  20. }
复制代码

下面是我对楼主问题的解释:
        当创建一个Children类对象时,在堆中只会创建一个Children对象实体,该对象实体中包含有父类所有的属性以及自己的属性。我认为new Children()时,并不是先把它的父类Parent的对象实体在堆中创建出来,而是自始至终只创建一个Children实体,这个Children实体中含有父类所有的可继承属性以及自己的属性。这就解释了为什么它可以调用父类的非私有属性啦,因为它的实体里本身就有一个继承自父类的属性,这个属性虽然继承自它的父类,但是属于它自己的。
        希望您能理解,有什么说的不对的,欢迎批评指正!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马