Java 상속에서 하위 클래스는 상위 클래스의 생성자를 상속하지 않지만 (암시적 또는 명시적으로) call해야 합니다.
다음 예를 보십시오:
public class TestExtends { public static void main(String[] args) { SonClass s = new SonClass(66); } } class FooClass{ public FooClass() { System.out.println(100); } public FooClass(int count) { System.out.println(count); } } class SonClass extends FooClass{ public SonClass() { } public SonClass(int c) { System.out.println(1234); } }
실행 결과:
100
1234
다음으로, 그러한 결과가 생성되는 이유를 분석하십시오:
프로그램은 SonClass s = new SonClass(66) 행을 실행하고 있습니다. ;
SonClass s = new SonClass(66);
这行时,调用
public SonClass(int c) { System.out.println(1234); //在执行这行时系统会优先调用父类的无参构造函数super(); }
因此子类在执行上面的构造方法时,等价于执行了下面的代码:
public SonClass(int c) { super(); // 必须在第一行调用,否则不能编译 System.out.println(1234); //在执行这行时系统会优先调用父类的无参构造函数super(); }
所以结果为:100 1234
接下来介绍另外一种情况(显式调用),如果子类构造函数是这样写的:
public SonClass(int c) { super(2); // 必须写在第一行,否则不能编译,显式调用父类构造函数后,系统就不在默认调用无参构造函数了 System.out.println(1234); }
执行结构是:2 1234
실행 구조는:rrreee
构造函数是不能继承的,只是用来在子类调用,(如果父类没有无参构造函数,创建子类时,必须在子类构造函数代码体的第一行显式调用父类的有参数构造函数,否则不能编译);
- rrreee
如果父类没有有参构造函数,那么在创建子类时可以不显式调用父类构造函数,系统会默认调用父类的无参构造函数
를 호출하면 하위 클래스가 위 생성자 메서드를 실행할 때 다음 코드를 실행하는 것과 동일합니다.super()
rrreee- 따라서 결과는 다음과 같습니다.
다음으로, 또 다른 이 경우(명시적 호출)를 소개합니다. 하위 클래스 생성자가 다음과 같이 작성되면:
100 1234
2 1234
요약:
생성자는 상속될 수 없으며 하위 클래스를 호출하는 데만 사용됩니다(상위 클래스에 매개변수 없는 생성자가 없으면 하위 클래스를 생성할 때 반드시 하위 클래스 생성자 코드 본문에서 상위 클래스의 첫 번째 줄은 상위 클래스의 매개변수화된 생성자를 명시적으로 호출합니다. 그렇지 않으면 컴파일할 수 없습니다.
부모 클래스에 매개변수화된 생성자가 없으면 필요하지 않습니다. 하위 클래스를 생성할 때 부모 클래스 생성자를 명시적으로 호출합니다. 시스템 부모 클래스의 매개변수 없는 생성자 super()
가 기본적으로 호출됩니다.
위 내용은 Java 상속(하위 클래스가 상위 클래스의 생성자를 상속하는지 여부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!