黑马程序员技术交流社区

标题: 继承问题 [打印本页]

作者: 杜加璇    时间: 2013-4-4 09:09
标题: 继承问题
本帖最后由 杜加璇 于 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 构造");
        }

}
既然子类继承了父类的属性,为什么不能继承父类的构造函数,继承执行父类构造创建新的子类对象应该可以啊求解释
作者: 赵晓东    时间: 2013-4-4 09:26
  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, 下载次数: 13)

QQ截图20130404092725.png

作者: 黑马李超    时间: 2013-4-4 09:28
子父类的构造函数的名称都不同怎么能继承 你不能用父类名的构造函数来初始化子类的对象吧
作者: 影响力147753321    时间: 2013-4-4 09:34
构造函数不能继承,只是调用而已。因为子类继承父类的时候,先运行父类构造函数;具体的说就是运行父类时就会先“调用”父类的构造函数,注意“调用”和继承不是一个含义,实质上是“自动运行”。

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

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

作者: 王杰123    时间: 2013-4-4 09:43
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关键子来调用父类带参数的构造方法,否则编译不能通过。
*/

作者: 王杰123    时间: 2013-4-4 09:43
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关键子来调用父类带参数的构造方法,否则编译不能通过。
*/

作者: HM张勇    时间: 2013-4-4 09:47
在子类的构造函数的第一行有一句隐式的super(),引用了父类的构造函数。

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

所以输出结果是
father 构造
son 构造
作者: 庄生晓梦    时间: 2013-4-4 17:05
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();
}
子类在对对象初始化时,要先访问依稀父类中的构造函数;没有继承
作者: 黄玉昆    时间: 2013-4-4 23:17
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




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