黑马程序员技术交流社区

标题: 关于继承方面 [打印本页]

作者: 胡超    时间: 2013-12-14 16:35
标题: 关于继承方面
有三个类,分别是Person,Student,GoodStudent,其中Student继承Person,GoodStudent继承Student,person类中,有私有成员变量name,age;Student有成员变量id,name,age;GoodStudent有成员变量id,name,age,grade;现在问题是:GoodStudent能调用Person中的成员变量吗?还有假设Person类中有空参数构造函数,及带参数构造函数,在GoodStudent创建时,调用了哪些类的构造函数?
作者: 笑脸不在    时间: 2013-12-14 17:00
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


作者: 丑男先生。    时间: 2013-12-14 17:18
简单分析一下就可以了,大概分三个步骤呢,
仔细看下啊,一、需要分析

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

实现三个class的构造函数

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

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

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

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2