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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴振良 黑马帝   /  2012-2-10 01:18  /  1945 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴振良 于 2012-2-10 21:03 编辑

class test3
{
        String name="小强";
        int age=18;
        public test3()
        {
                System.out.println(name+(--age)+"岁");
        }
}
class test4 extends test3
{
        String sex="男";
        public test4()
        {
                System.out.println(name+":男,"+(++age)+"岁");
        }
}
class test5
{
        public static void main(String args[])
        {
                new test4();
        }       
}

输出结果为:
小强17岁
小强:男,18岁
在test4类中我不是重写了构造函数吗?为什么会打印出两句来呢?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

7 个回复

倒序浏览
子类在创建对象时,构造方法总是先调用父类的某个构造方法,如果子类构造方法没有明显的指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法,具体到你的程序中,在test4构造方法中相当于第一句省略了super();即调用test3里的构造方法,所以先打印父类里的输出,后打印子类的输出。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要查父类是如何对这些数据初始化的。所以子类在初始化时需要查看父类的构造函数,子类所有的构造函数默认的都会访问父类空参数的构造函数,因为子类的每一个构造函数的首行,都有一句隐藏的super();当父类中没有空参数的构造函数时,子类必须手动通过super();语句形式来指定访问父类中的构造函数

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
这是继承的一种表现,子类创建对象后,因为可以使用父类中的方法,所以要在子类初始化之前父类先初始化,所以
public test4()
        {
                System.out.println(name+":男,"+(++age)+"岁");
        }
相当于

public test4()
        {
         super();              
         System.out.println(name+":男,"+(++age)+"岁");
        }

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
毕老师讲过这个问题,每个构造函数的第一句都隐藏了super();,你可以显式的写出来,即创建对象时进行初始化的过程,执行构造函数前先执行父类对应的构造函数,(如果父类也继承了某个类,那就执行父类的父类的构造函数,以此类推,知道Object类。),所以你建立对象时父类test3和子类test4的构造函数的打印语句都会执行.

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
再加一句:类名的首字母应该大写,这样比较规范。从小程序练习是就应该养成好习惯哈~~
回复 使用道具 举报
魏腾飞 黑马帝 2012-2-10 09:45:42
7#
/*子类继承父类,在对象初始化过程中,子类对象进入子类中相应构造函数然后默认情况下调用super()父类的构造方法(也可以自己指定访问的构造方法)
此处是默认的super(),也就是test3()这个构造方法。接着进行了父类对象的初始化,然后该构造方法就有一个输出语句,所以进行打印。
到了子类的构造方法时候又进行了打印。但是作为同一对象的初始化,所以其对同一个对象的成员变量进行操作。
*/
class test3 {
        String name = "小强";
        int age = 18;

        public test3() {
                System.out.println(name + (--age) + "岁");//--age将age = 17
        }
}

class test4 extends test3 {
        String sex = "男";

        public test4() {
                System.out.println(name + ":男," + (++age) + "岁");//++age将age = 18
        }
}

class test5 {
        public static void main(String args[]) {
                new test4();
        }
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
戴振良 黑马帝 2012-2-10 20:45:57
8#
非常感谢大家,明白了!谢谢!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马