English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、Javaのsuperキーワードについてサンプルを使用して学びます。
Javaのsuperキーワードは、子クラスで親クラスのメンバー(属性、コンストラクタ、メソッド)にアクセスするために使用されます。
superキーワードについて学ぶ前に、以下を確認してください。Java 상속.
サブクラスでオーバーライドされた親クラスのメソッドを呼び出します。
超クラス(superclass)とサブクラス(subclass)が同じ名前の属性を持っている場合、超クラスの属性(フィールド)にアクセスします。
サブクラスのコンストラクタから明示的に超クラスの無パラメータ化コンストラクタまたはパラメータ化コンストラクタを呼び出します。
これらすべての用途について詳しく説明しましょう。
超クラスとサブクラスで同じ名前のメソッドが定義されている場合、サブクラスのメソッドが超クラスのメソッドをオーバーライドします。これはメソッドオーバーライド.
class Animal { //メソッド public void display(){ System.out.println("저는 동물입니다."); } } class Dog extends Animal { //メソッドオーバーライド @Override public void display(){ System.out.println("I am a dog"); } public void printMessage(){ display(); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printMessage(); } }
출력 결과
I am a dog
この例では、Dogクラスのオブジェクトdog1、そのメソッドprintMessage()を呼び出すことができます。その後、该方法はdisplay()ステートメントを実行します。
display()が二つのクラスで定義されているため、DogのクラスメソッドがAnimalのクラスメソッドをオーバーライドしています。したがって、子クラスのdisplay()が呼び出されます。
超クラスのオーバーライドメソッドを呼び出す必要がある場合はどうなりますか?
Animalの重载メソッドdisplay()を呼び出す必要がある場合、super.display()を使用します。
class Animal { //メソッド public void display(){ System.out.println("저는 동물입니다."); } } class Dog extends Animal { //メソッドオーバーライド @Override public void display(){ System.out.println("I am a dog"); } public void printMessage(){ //これはオーバーライドされたメソッドを呼び出します display(); // これは親クラスのメソッドを呼び出します super.display(); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printMessage(); } }
출력 결과
I am a dog 저는 동물입니다
ここでは、上記のプログラムがどのように動作するかを説明します。
超クラスとサブクラスは同じ名前の属性を持つことができます。superキーワードを使用して超クラスの属性にアクセスします。
class Animal { protected String type="動物"; } class Dog extends Animal { public String type="哺乳動物"; public void printType() { System.out.println("저는 '" + type); System.out.println("저는 한 마리 '" + super.type); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printType(); } }
输出输出
输出 " 저는 동물입니다
:
在这个实例中,我们在超类Animal和子类Dog中定义了相同的实例字段类型。1。然后我们创建了Dog类的对象dog
。然后,使用此对象调用printType()方法。
在printType()函数内部, - type
指的是子类Dog的属性。 - super.type
指超类Animal的属性。 + type);因此,System.out.println("我是 "输出 ",并且,System.out.println("我是一只 " + super.type);打印输出 "저는 동물입니다.
众所周知,创建类的对象时,将自动调用其默认构造函数。
자식 클래스 생성자에서 부모 클래스 생성자를 명시적으로 호출하려면 super()를 사용합니다. 이는 super 키워드의 특별한 형태입니다.
주의: super()는 자식 클래스 생성자에서만 사용할 수 있으며, 첫 번째 문장이어야 합니다.
class Animal { //Animal 클래스의 기본적이거나 파라미터가 없는 생성자 Animal() { System.out.println("저는 동물입니다."); } } class Dog extends Animal { // Dog 클래스의 기본적이거나 파라미터가 없는 생성자 Dog() { //부모 클래스의 기본 생성자를 호출 super(); System.out.println("I am a dog"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); } }
출력 결과
저는 동물입니다 I am a dog
여기서, Dog 클래스의 객체 dog1이 클래스가 생성될 때, 기본적이거나 파라미터가 없는 생성자를 자동으로 호출합니다.
자식 클래스 생성자에서 super() 문장이 부모 클래스 생성자를 호출하고 그 안의 문장을 실행합니다. 따라서 얻는 결과"저는 동물입니다".
그런 다음, 프로그램 흐름이 자식 클래스 생성자로 돌아와 나머지 문장을 실행합니다. 따라서 "저는 dog입니다."가 출력됩니다.
그러나 super()를 사용할 필요는 없습니다. 자식 클래스 생성자에서 super()를 사용하지 않더라도 컴파일러는 부모 클래스의 기본 생성자를 은닉적으로 호출합니다.
컴파일러가 자동으로 super()를 호출하면 왜 명시적으로 호출하고, 중복 코드를 사용해야 하나요?
자식 클래스 생성자에서 부모 클래스 생성자를 호출해야 할 때파라미터화된 생성자(파라미터가 있는 생성자)이므로 명시적으로 사용해야 합니다.
파라미터가 있는 super()항상자식 클래스의 생성자 본문내부의첫 번째 문장그렇지 않으면 컴파일 오류가 발생합니다.
class Animal { //기본적이거나 파라미터가 없는 생성자 Animal() { System.out.println("저는 동물입니다."); } //파라미터화된 생성자 Animal(String type) { System.out.println("Type: ")+type); } } class Dog extends Animal { //기본 생성자 Dog() { //부모 클래스의 파라미터화된 생성자 호출 super("Animal"); System.out.println("I am a dog"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); } }
출력 결과
Type: Animal I am a dog
컴파일러는 자동으로 파라미터가 없는 생성자를 호출할 수 있습니다. 하지만 파라미터가 있는 생성자를 호출할 수는 없습니다.
파라미터화된 생성자를 호출해야 한다면, 서브 클래스 생성자에서 명시적으로 정의해야 합니다. 위의 코드에서와 같이:
super("Animal");
위의 예제에서는 super("Animal")를 사용하여 파라미터화된 생성자를 명시적으로 호출했습니다. 이 경우 컴파일러는 부모 클래스의 기본 생성자를 호출하지 않습니다.