[TIL]JAVA-上書き(上書き)


💡Day 11オーバーライド


この文章は南宮星のjava定式3/eをもとに学習内容を整理した文章です.
クリーンアップソース:https://github.com/qudalsrnt3x/javaStandard

超光速とは?


サブクラスにのみスーパークラスメソッドの新しい内容を作成します.

上書き条件

  • の名前は同じでなければなりません.
  • パラメータは同じでなければなりません.
  • 返却タイプは同じでなければなりません.
  • 祖先クラスのメソッドと宣言子は一致する必要があります.

    ただし、アクセス制御者(accessmodifier)と例外(exception)は、限られた条件で異なる変更しかできません。

  • アクセス制御者は、祖先クラスメソッドの数より小さい
  • に変更することができる.
    public, protected, (default), private
    
    조상 클래스의 접근 제어자가 protected면
    자손 클래스의 접근 제어자는 protected or public이어야 한다.
  • 祖先レベルの方法よりも多くの例外を宣言することはできません.
  • class Parent {
        void parentMethod() exception IOException, SQLException {
        	...
        }
    }
    
    class Child extends Parent {
    
        @Overriding
        void parentMethod() {
        	...
        }
    }
  • アクセス制御者は、その祖先クラスメソッドよりも小さい範囲に変更できません.
  • 例外は、祖先の等級の方法よりも多く宣言することはできません.
  • インスタンスメソッドを静的メソッドに変更することはできません.逆も同様です.
  • 過負荷vs過負荷


    過負荷の既存の新しいメソッドを定義する(new)
    継承メソッドを上書きする内容の変更(change,modify)
    class Parent {
        void parentMethod(){}
    }
    
    class Child extends Parent {
    
        void parentMethod(){} // 오버라이딩
        void parentMethod(int i) {} // 오버로딩
    }

    ✏️super


    子クラスで親から継承されたメンバーを参照する参照変数.
  • 祖先クラスから継承されたメンバーも子孫クラス独自のメンバーであるためsuperの代わりに使用できます.
  • superは、
  • 祖先クラスのメンバーと子孫クラスのメンバーが繰り返し定義され、互いに区別する必要がある場合にのみ使用されます.
  • class SuperTest {
        public static void main(String[] args) {
        	Child c = new Child();
            c.method();
        }
    }
    
    class Parent {
        int x = 10;
    }
    
    class Child extends Parent {
        void method(){
        	System.out.println("x = " + x);
            System.out.println("this.x = " + this.x);
            System.out.println("super.x = " + super.x);
        }
    }
    実行結果
    x = 10
    this.x = 10
    super.x = 10

    変数もメソッドもsuperを呼び出すことができます

    class Point {
        int x;
        int y;
        
        String getLocation(){
        	return "x : " + x + ", y : " + y;
        }
    }
    
    class Point3D extends Point {
        int z;
        
        @Override
        String getLocation(){
        	return super.getLocation() + ", z : " + z;
            // 부모의 메소드 호출
        }
    }

    *スタティックメソッド(クラスメソッド)は、インスタンスには関係ありません。したがって,これと同様にsuperも静的メソッドでは使用できず,インスタンスメソッドでのみ使用できる.


    ▼▼super()-先祖類の創建者


    this()と同様にsuper()も構造関数です.
    同じクラスの他のジェネレータを呼び出す
    super()親クラスの作成者を呼び出す
    public class PointTest {
        public static void main(String[] args) {
            Point3D p3 = new Point3D(1, 2, 3);
        }
    }
    
    class Point {
        int x, y;
    
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        String getLocation() {
            return "x :" + x + ", y :" + y;
        }
    }
    
    class Point3D extends Point {
        int z;
    
        Point3D(int x, int y, int z) {
            // 생성자 첫 줄에 다른 생성자를 호출하지 않기 때문에 컴파일러는
            // super()를 삽입한다.
            this.x = x;
            this.y = y;
            this.z = z;
        }
    
        String getLocation() {
            return super.getLocation() + ", z :" + z;
        }
    }
    実行結果
    PointTest.java:22: cannot resolve symbol
    symbol : contructor Point()
    location: class Point
    Point3D(int x, int y, int z) {
    ^ 
    1 error
    コンストラクション関数がない場合、コンパイラは基本コンストラクション関数を指定します.Pointクラスでコンストラクション関数が指定されているため、基本コンストラクション関数はありません.
    Point 3 Dクラスの作成者に祖先クラスの作成者Point()が見つからない
    Point3D(int x, int y, int z) {
        super(x, y);
    }
    祖先クラスのジェネレータをsuper(x,y)で呼び出す.
    祖先クラスのメンバー変数は、祖先の作成者によって初期化されるべきです.