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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜加璇 中级黑马   /  2013-4-4 09:09  /  1701 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜加璇 于 2013-4-5 20:56 编辑

class Father
{
        String name="tom";

        Father(){
               
                System.out.println("father 构造");
        }
}

class Son extends Father
{
        String name="james";
        int age;

        Son(){
               
                System.out.println("son 构造");
        }

}
既然子类继承了父类的属性,为什么不能继承父类的构造函数,继承执行父类构造创建新的子类对象应该可以啊求解释

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

8 个回复

倒序浏览
  1. class Father
  2. {
  3. String name="tom";

  4. Father(){

  5. System.out.println("father 构造");
  6. }
  7. }

  8. class Son extends Father
  9. {
  10. String name="james";
  11. int age;

  12. Son(){

  13. //super();//这里有一个隐式的super默认调用了父类的构造函数,一般情况下这个super都是在子类构造方法的第一行
  14. System.out.println("son 构造");
  15. }

  16. }
  17. class Vo
  18. {
  19. public static void main(String[] args)
  20. {
  21. Son s = new Son();
  22. }
  23. }
复制代码

QQ截图20130404092725.png (1.34 KB, 下载次数: 16)

QQ截图20130404092725.png
回复 使用道具 举报
子父类的构造函数的名称都不同怎么能继承 你不能用父类名的构造函数来初始化子类的对象吧
回复 使用道具 举报
构造函数不能继承,只是调用而已。因为子类继承父类的时候,先运行父类构造函数;具体的说就是运行父类时就会先“调用”父类的构造函数,注意“调用”和继承不是一个含义,实质上是“自动运行”。

如果父类没有无参构造函数

创建子类时,不能编译,除非在构造函数代码体中第一行,必须是第一行显示调用父类有参构造函数

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
package qq.com;

class Father {
        String name = "tom";

        Father() {

                System.out.println("father 构造");
        }
}

public class Son extends Father {
        String name = "james";
        int age;

        Son() {
                super();//子类会默认调用父类的构造函数,并且放在第一行。
                System.out.println("son 构造");
        }

        public static void main(String[] args) {
                Son s = new Son();
        }
}
/*
* 对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,
* 当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,
* 父类的非静态代码块执行完毕,接着执行父类的构造方法;
* 父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。
* 子类的非静态代码块执行完毕再去执行子类的构造方法。
* 总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
*/
回复 使用道具 举报
package qq.com;

class Father {
        String name = "tom";

        Father() {

                System.out.println("father 构造");
        }
}

public class Son extends Father {
        String name = "james";
        int age;

        Son() {
                super();//子类会默认调用父类的构造函数,并且放在第一行。
                System.out.println("son 构造");
        }

        public static void main(String[] args) {
                Son s = new Son();
        }
}
/*
* 对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,
* 当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,
* 父类的非静态代码块执行完毕,接着执行父类的构造方法;
* 父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。
* 子类的非静态代码块执行完毕再去执行子类的构造方法。
* 总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
*/

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
在子类的构造函数的第一行有一句隐式的super(),引用了父类的构造函数。

Son()
{
//super();
System.out.println("son 构造");
}

所以输出结果是
father 构造
son 构造

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
class Fu
{
        Fu()
        {
                System.out.println("fu run");
        }
}

class Zi extends Fu
{
        Zi()
        {
                super();//隐式语句
                System.out.println("zi run");
        }
}

class EnxtedsDemo
{
        Zi z = new Zi();
}
子类在对对象初始化时,要先访问依稀父类中的构造函数;没有继承

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马