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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 唐宋元明清 于 2013-11-13 18:36 编辑

class Person{
        private String name;
        private int age;
        Person(String name,int age){
                this.name=name;
                this.age=age;
        }
}
class Student extends Person{
        Student(String name,int age){
                super(name,age);
        }
}
求教子类对象建立后,子类对象存储的是什么东西?

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

13 个回复

倒序浏览
子类初始化过程,对象中的成员变量的初始化是按下述步骤进行的:
1).分配成员变量的存储空间并进行默认的初始化,就是用new关键字产生对象后,对类中的成员变量按第三章的表3.1中的对应关系对对象中的成员变量进行初始化赋值。
2).绑定构造方法参数,就是new Person(实际参数列表)中所传递进的参数赋值给构造方法中的形式参数变量。
3).如有this()调用,则调用相应的重载构造方法(被调用的重载构造方法又从步骤2开始执行这些流程),被调用的重载构造方法的执行流程结束后,回到当前构造方法,当前构造方法直接跳转到步骤6执行。
4).显式或隐式追溯调用父类的构造方法(一直到Object类为止,Object是所有Java类的最顶层父类,在本章后面部分有详细讲解),父类的构造方法又从步骤2开始对父类执行这些流程,父类的构造方法的执行流程结束后,回到当前构造方法,当前构造方法继续往下执行。
5).进行实例变量的显式初始化操作,也就是执行在定义成员变量时就对其进行赋值的语句,如:
public Student extends Person
{
String school = ”it315”;// 显式初始化
……
}
将“it315”赋值给school成员变量。
6).执行当前构造方法的方法体中的程序代码,如
public Student extends Person
{
public Student(String name,int age,String school)
{
super(name,age);
this.school=school;
}
}
这一步将执行this.school=school;这条语句,其中用到的super()或this()方法调用语句已在前面的步骤中执行过,这里就不再执行了。注意区别刚才所说的this()方法调用语句与this.school=school的区别,前者指调用其他的构造方法,后者是一个普通的赋值语句。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
这么说吧,子类对象既然是继承父类对象的。所以最起码他要包含父类的全部功能而且还必须拥有自己的特有功能。
在你这个程序中父类的构造函数私有化了。所以子类通过super无法访问到,子类对象什么都没有。
回复 使用道具 举报
以楼主程序为例。首先我们要建立子类对象,用new语句来建立子类对象。因为代码中定义的Student有构造方法,所以我们必须遵循类中定义的构造方法,即接收两个参数的构造方法。Student stu=new Student(zhangsan,20);现在jvm运行到这一句,首先,jvm看到的是Student类,并看到Student类继承了Person类,那么先将父类Person加载如内存中,并将Person类初始化。然后加载Student类到内存中。执行Student()方法,传入zhangsan 和20两个参数。通过super语句,jvm重新从Person类中找到Person()方法,并传入zhangsan 20两个参数,执行Person(zhangsan,20)。因为Person的name和age都被Student继承,所以Student的对象stu的成员变量就通过Person()方法,把自己的name和age赋值为zhangsan和20。这时的子类对象stu中,存储的就是构造方法Student(),成员变量name=zhangsan,age=20.

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
Θ动@咚Θ 发表于 2013-11-12 12:51
以楼主程序为例。首先我们要建立子类对象,用new语句来建立子类对象。因为代码中定义的Student有构造方法, ...

看的不是很懂
zhangsan,20肯定是存在成员变量里面了,问题是子类没有成员变量啊。(父类私有了,子类应该继承不到父类的成员变量了)
回复 使用道具 举报
唐宋元明清 发表于 2013-11-12 18:59
看的不是很懂
zhangsan,20肯定是存在成员变量里面了,问题是子类没有成员变量啊。(父类私有了,子类应该 ...

是的,我的错,子类没有成员变量,被父类私有。但是,子类中有指向父类中name age的引用,虽然是私有的,子类对象不能直接访问,但是通过super()方法是可以访问的。
回复 使用道具 举报
子类可以继承父类公有public 的成员,可以被子类直接访问,但是父类私有的成员不能被子类直接访问,但是父类提供了公有的方法访问他自己的私有成员,则子类可以通过父类的公有方法访问私有成员;
子类虽然不能继承父类构造,但是可以使用super()来访问父类的构造,
回复 使用道具 举报
本帖最后由 唐宋元明清 于 2013-11-13 14:54 编辑
Θ动@咚Θ 发表于 2013-11-12 19:19
是的,我的错,子类没有成员变量,被父类私有。但是,子类中有指向父类中name age的引用,虽然是私有的, ...


。。新问题是,就只有new 子类。只有子类有对象,父类是没有建立对象的啊。那父类何来对象的成员变量呢?大概意思就是:
class abc
{
int a=1;
}
如果我不建立abc的对象,堆内存中是没有成员变量a的,有的只是描述,描述你建立对象那么a就等于1,如果你不建立对象a什么都不是。
回复 使用道具 举报
唐宋元明清 发表于 2013-11-13 12:42
。。新问题是,就只有new 子类。只有子类有对象,父类是没有建立对象的啊。那父类何来对象的成员变量呢? ...

既然子类继承了父类,子类就拥有了父类中的可访问的成员变量和方法,创建子类对象时,对象中也加在了父类的变量。
回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
黄炳期 发表于 2013-11-13 12:58
既然子类继承了父类,子类就拥有了父类中的可访问的成员变量和方法,创建子类对象时,对象中也加在了父类 ...

可以详细描述下子类对象中的东西么?毕竟父类的描述(变量)私有,子类是用不了的,子类对象中应该就没有成员变量。父类也没有成员变量,因为父类没有创建对象,有的只是描述。
我的问题基本的那个点就在于name,age的值存放到哪了?
回复 使用道具 举报
子类的构造方法执行的时候,会首先去执行父类的构造方法, 当父类没有无参构造的时候,用super调用父类带参数构造.
创建子类对象的时候,子类对象中应改存储着子类自身的成员变量和Super()代表的那片父类空间,这片空间里面有父类的成员变量即name和age

这个图你看一下

360截图20131113160032878.jpg (25.62 KB, 下载次数: 11)

360截图20131113160032878.jpg
回复 使用道具 举报
唐宋元明清 发表于 2013-11-13 14:51
可以详细描述下子类对象中的东西么?毕竟父类的描述(变量)私有,子类是用不了的,子类对象中应该就没有 ...

name和age属于成员变量,存储在子类对象中
回复 使用道具 举报
习嘻嘻 发表于 2013-11-13 16:03
子类的构造方法执行的时候,会首先去执行父类的构造方法, 当父类没有无参构造的时候,用super调用父类带参数 ...

哦。。原来如此。你画了这张图。。我好像是明白了。。谢谢~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马