JAVA:子类继承父类时的构造方法

Posted katerdaisy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA:子类继承父类时的构造方法相关的知识,希望对你有一定的参考价值。

在 Java 中,无论是 explicit 还是 implicit 方式,都要求在子类的构造方法中调用其父类的构造方法。如果父类无构造方法(其实是一个默认无参的构造方法),那么子类的构造方法中会自动进行调用;如果父类有自己的构造方法(这时父类不会有默认无参的构造方法),那么在子类的构造方法中,必须要调用父类的某个构造方法,而且必须是在构造方法的第一个语句中进行调用。

此时再创建子类实例就需要显示的调用父类的构造方法,并且进行传参,否则创建不出来父类的实例就会编译出错

当父类有多个构造方法时,子类需要显示的决定使用哪一个构造方法

究其原因,想必是 Java 语言设计者,要求子类有责任保证它所继承的父类尽快进入到一个稳定、完整的状态中。试想,如果没有这个约束,那么子类的某个继承自父类的方法可能会使用到父类中的一些变量,而这些变量并没有进行初始化,从而产生一些难以预料的后果。

父类的构造方法子类不可以继承,更不存在覆盖的问题。

所以子类构造方法默认调用父类的无参构造方法。(所以养成写无参构造的习惯)

如果子类访问父类的有参构造方法,必须在子类构造方法第一行使用super(参数)

当构造一个对象的时候,系统先构造父类对象,再构造子类对象。

如果直接new子类实例,就会调用到父类刚刚这个自动生成的没有参数的构造方法

当父类里有构造方法时,并且这个构造方法带参数的时候,编译器就不再自动生成无参数版本的构造方法了。

class Dog
Dog() //无参构造
System.out.println(“Dog() make”);
this.color = “yellow”;

Dog(String st)//有参构造
System.out.println(“Dog(String st) make”);
this.color = st;

void sleep()
System.out.println(this.color + " dog is sleep");

private String color = null;

class ChinaDog extends Dog

class AmericaDog extends Dog
AmericaDog(String st)
super(st);

public class test1

public static void main(String args[])
System.out.println(“main function”);
Dog dog1 = new Dog();//无参构造
Dog dog2 = new Dog(“red”);//有参构造
dog1.sleep();
dog2.sleep();
ChinaDog chinaDog = new ChinaDog();//调用父类无参构造
chinaDog.sleep();
AmericaDog americaDog = new AmericaDog(“crazy America”);//调用父类有参构造
americaDog.sleep();


java中子类继承父类时是否继承构造函数

来源:http://www.cnblogs.com/sunnychuh/archive/2011/09/09/2172131.html

---------------------

java继承中对构造函数是不继承的,只是调用(隐式或显式)。

以下是例子:

 public class FatherClass {

 public FatherClass() {
       System.out.println(100);
 }

 public FatherClass(int age) {
      System.out.println(age);
 }

}

 

public class SonClass extends FatherClass{

        public SonClass() {
         }

        public SonClass(int c) {
                 System.out.println(1234);
        }
   
 public static void main(String[] args) {

  SonClass s = new SonClass(66);
 
 }
}

编译后执行结果如下是什么呢?

分析:SonClass s = new SonClass(66);执行这句时,调用

 public SonClass(int c) {
                 System.out.println(1234);//系统会自动先调用父类的无参构造函数(super())
        }

 

在这个构造函数中,等价于

 public SonClass(int c) {

                super();//必须是第1行,否则不能编译
                 System.out.println(1234);
        }

所以结果是    100
             
1234

在创建子类的对象时,Java虚拟机首先执行父类的构造方法,然后再执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化。

3.如果子类构造函数是这样写的

public SonClass(int c) {

                super(22);//必须是第1行,否则不能编译
                          
//显式调用了super后,系统就不再调用无参的super()了;
                 System.out.println(1234);
        }

执行结果是   22
            1234

总结1:构造函数不能继承,只是调用而已。

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

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

如下:

SonClass (){

super(777);//显示调用父类有参构造函数

System.out.println(66);

}

如果不显示调用父类有参构造函数,系统会默认调用父类无参构造函数super();

但是父类中没有无参构造函数,那它不是不能调用了。所以编译就无法通过了。

总结2:创建有参构造函数后,系统就不再有默认无参构造函数。

如果没有任何构造函数,系统会默认有一个无参构造函数。


























以上是关于JAVA:子类继承父类时的构造方法的主要内容,如果未能解决你的问题,请参考以下文章

java中子类继承父类时是否继承构造函数

java代码执行顺序

Java继承,子类实例化时,调用父类的无参构造方法

S2/JAVA/03-多态

S2/JAVA/03-多态

java类初始化顺序