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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡超 中级黑马   /  2013-12-14 16:35  /  2227 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有三个类,分别是Person,Student,GoodStudent,其中Student继承Person,GoodStudent继承Student,person类中,有私有成员变量name,age;Student有成员变量id,name,age;GoodStudent有成员变量id,name,age,grade;现在问题是:GoodStudent能调用Person中的成员变量吗?还有假设Person类中有空参数构造函数,及带参数构造函数,在GoodStudent创建时,调用了哪些类的构造函数?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

3 个回复

倒序浏览
1、理论说明:
                   问1:父类的成员用private修饰后,该成员就只能在父类中直接调用,若要在其子类中调用,只能通过父类中的函数来提取父类的私有成员
                   问2:子类的构造函数的执行要参考父类的构造函数(因为构造函数时给对象初始化用的,所以子类的初始化要参考父类的初始化),所以                                                     子类的构造函数执行时会先执行父类的构造函数;
2、代码解释:
按楼主的要求:代码如下
class Person//父类
{
        Person()
        {
                System.out.println("Person");
        }
        private String name;
        private int age;
        public void setAge(int age)//设置Age
        {
                this.age=age;
        }
        public int getAge()//提取Age
        {
                return age;
        }
}
class Student extends Person//子类
{
        Student()
        {
                //super():隐式,调用父类Person的构造函数
                System.out.println("Student");
        }
        String id;
        String name;
        int age=20;
}
class GoodStudent extends Student//student的子类
{
        GoodStudent()
        {
                //super():隐式,调用父类Student()的构造函数
                System.out.println("GoodStudent");
        }
        String id;
        String name;
        int age=30;
        int grade;
}
class Test //测试类
{
        public static void main(String[] args)
        {
                GoodStudent g=new GoodStudent();
                g.setAge(3);
                System.out.println(g.getAge());//输出age
        }
}

最后的输出结果为:
Person
Student
GoodStudent
3
由此可以看出:子类的构造函数的执行会先去找寻父类的构造函数并优先于子类的构造函数而执行;
在主函数中g.setAge(3),是对父类Person中的Age赋值,getAge也是输出父类中的Age

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
简单分析一下就可以了,大概分三个步骤呢,
仔细看下啊,一、需要分析

Person,Student,GoodStudent三个类的继承关系

实现三个class的构造函数

打印信息查看各个类的构造函数是否被调用

1、弄清楚java 类的无参构造函数是默认调用的

2、如果父类的构造函数是有参的,那么要在子类的构造函数的第一行加入super(args); 来确认对哪个父类构造函数的调用

估计你一下也看不懂,慢慢学视频,慢慢就懂了的

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
按照你问题的顺序首先说第一个问题,如果你父类中变量是用public修饰的,那么GoodStudent可以调用Person中的成员变量,其实这个问题是属于类的多态中成员变量的特点,访问的方法是 Person  p = new GoodStudent();p.name ;p.age,以上代码p点出来的name和age就是Person成员变量。
第二个问题:在GoodStudent的构造函数中的最上边一行jvm会自动加上一个super()并隐藏,所以说你不修改的情况下,就是调用的父类中不带参数的构造方法,如果你想调用父类中带参数的构造方法,那就在GoodStudent类中的构造函数里手动加上super(参数)来覆盖掉jvm自动加的那个super()即可!
————————————————————————
这样说应该比较容易理解,有问题可以再追问{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

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