継承
メソッドオーバーロード
:継承メソッドの内容がサブクラスに一致しない場合は、サブクラスで同じメソッドを再定義します.
(継承された概念から親として再定義されたメソデル子)
:メソッドが上書きされると、親オブジェクトのメソッドは非表示になります.子オブジェクトからメソッドを呼び出すと、上書きされた子メソッドが呼び出されます.
:構文は省略できます(@Overrideタグ)が、エラーを減らすことができます.
親と同じ名前の出力メソッドを作成しようとします
(BBクラスと出力クラスで見つけられます)
結果
間違い男.親と子の方法名は同じだけど
内容によって設定可能(メソッドオーバーロードのような感じ)
:BBクラスをBBにオブジェクト化します.印刷()時
親の印刷()メソッドではなく、独自の印刷()メソッドが出力されていることを確認します.
1) A 클래스
// 점 x, y 에 대한 클래스
public class A {
private int x;
private int y;
// 출력 메소드
void Aprint() {
System.out.println("(" + x + "," + y+")");
}
// private로 막아줬으니 값 받고 내보낼 Setter Getter 설정
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
2) AA 클래스
// A를 상속받으며
// 점 x, y, z 에 대한 클래스
public class AA extends A {
private int z;
// 풀력 메소드
// (x,y,z) 찍기
void aaPrint() {
// AA가 A의 자식 클래스라도 private로 막아놨기 때문에 바로 가져올 수 없다
// System.out.println("(" + x + "," + y+ "," + z + ")");
// getter setter 메소드를 가져와 사용해야함
System.out.println(getX());
System.out.println(getY());
System.out.println(z);
}
// z도 private로 막아줬기 때문에 Getter Setter 설정
public int getZ() {
return z;
}
public void setZ(int z) {
this.z = z;
}
}
3) BB 클래스
//
public class BB extends A {
private String color;
// 출력하기
void bbPrint() {
System.out.println(getX());
System.out.println(getY());
System.out.println(color);
}
// 부모와 똑같은 이름의 출력 메소드 작성해보기
// 결과
// : 에러 안남. 부모와 자식의 메소드 이름은 같지만
// 내용이 다르면 설정 가능 (메소드 오버로딩처럼 상속 관계에서도 성립)
// : BB 클래스를 객체화해 BB.Aprint()를 출력했을 때
// 부모의 Aprint() 메소드가 아니라 본인의 Aprint() 메소드가 출력되는 것을 확인
// @Override
// void Aprint() {
// System.out.println(getX());
// System.out.println(getY());
// System.out.println(color);
// }
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
4) 객체 생성 후 출력해보는 main
public class business {
public static void main(String[] args) {
// A 객체 생성해서 10, 20 출력하기
A a = new A();
// 값 넣기
a.setX(10);
a.setY(20);
//출력하기
a.Aprint();
System.out.println("-------------------------------");
// AA 객체 생성해 30, 40, 50 출력하기
AA aa = new AA();
// 값 넣기
aa.setX(30);
aa.setY(40);
aa.setZ(50);
//출력하기
aa.aaPrint();
System.out.println("\n AA에서 A클래스의 Aprint() 메소드를 출력했습니다");
aa.Aprint();
System.out.println("-------------------------------");
// BB 객체 생성해 60, 70, red 출력하기
BB bb = new BB();
// 값 넣기
bb.setX(60);
bb.setY(70);
bb.setColor("red");
// 출력하기
bb.bbPrint();
System.out.println("\n BB에서 A클래스의 Aprint() 메소드를 출력했습니다");
bb.Aprint();
System.out.println("-------------------------------");
}
}
運転結果@Overrideの基本像
デフォルトのObjectクラスを継承して上書きを試みます
1) Object에 이미 정의 된 클래스를 가져와 실행내용 부분만 재정의
//
public class KK extends Object{
// 부모인 Object 클래스의 것을 가져와 내용만 변경한 오버라이딩 부분
// 주석 처리하면 Object 클래스의 실행부분이 나온다
@Override
public String toString() {
// 원래 모습
// return getClass().getName() + "@" +Integer.toHexString(hashCode());
// 재정의
return "지금 오바라이딩 배우는 중 \n 이곳은 자식 클래스 부분" ;
}
}
class Child extends Object{
// Child 클래스는 Object 클래스의 자식 클래스
// 부모 클래스 Object 클래스의 메소드를 재정의해 사용할 수 있다.
// final (static)으로 작성된 메소드가 아니라면 모두 가능
@Override
public boolean equals(Object obj) {
// 원래 모습
// return (this == obj);
// 재정의
return true;
}
}
2) 객체 생성 후 출력 모양 보는 main
//
public class RunClass {
public static void main(String[] args) {
// 객체 생성 후 메소드 호출
KK kk = new KK();
String r = kk.toString();
System.out.println(r);
// 객체 생성 후 메소드 호출
Child ch = new Child();
ch.equals(null);
}
}
運転結果親メソッド(スーパー)
子クラスで親を上書きするメソッドを使用すると、親のメソッドは非表示になり、子クラスを上書きするメソッドのみが使用されます.ただし、サブクラス内で上書きした親を呼び出すメソッドが必要な場合は、スーパーキーが使用されます.
親メンバーへの
super.name
super(各値)
1) 자식 클래스
//
class Two extends One{
static int sa;
int ip;
void twoMethod(String name, int sa) {
// 부모 필드에 있는 name에 넣을것이다
super.name = name;
// two 는 one을 상속 받기 때문에
// 자기 자신의 필드를 먼저 확인하고, 했는데 name이 없으면
// 부모필드의 name을 슬그머니 가져와서 사용함
// 고로 에러는 안나는데
// this와 super는 다르니 그 경로를 잘 기억해둔다
this.name = name;
// static 붙어있는 변수는
// 클래스명.변수명
// 의 형태로 사용한다
Two.sa = sa;
// 오류는 안나지만 권장하지 않는 방밥
// this.sa = sa;
// 메개변수 sa의 값을 부모의 sp에 넣어라
super.sp = sa;
// 부모의 인스턴스 필드에 값 넣기
super.ip = sa;
}
Two(){
// this(10);
// 부모의 명시적 생성자 부분을 호출
super(100);
System.out.println("자식의 기본 생성자");
}
Two(int ip) {
// 자식 클래스의 기본 생성자 안에는 첫 줄에 super()가 생략된 것이다
// 자식 클래스의 기본 생성자 안에 첫줄에 super(매개변수)를 호출하면
// 부모의 명시적 생성자를 호출 할 것이므로
// 부모 클래스의 기본 생성자는 호출되지 않음
// (지우고 출력하는 것과 그냥 출력하는 것과 차이가 없음.
// 왜냐면 지워도 기본으로 super()가 있는데 안보이는 거니까)
super();
System.out.println("자식의 명시적 생성자");
// 지금 있는 (Two) 필드에 있는 ip에 넣을 것이다
this.ip = ip;
// super : 부모 필드에 있는 ip 에 넣은것이다.
super.ip = ip;
}
}
2) 부모 클래스
//
public class Inheritance5 {
public static void main(String[] args) {
// One one = new One();
Two two = new Two(300);
// two.twoMethod("김자바", 100);
}
}
実行結果(2)複数のクラスを接続して使用可能か
1) 메인 클래스
public class Bussiness {
public static void main(String[] args) {
// 하위 클래스 객체 생성
// 하게되면 연결되어있는 최상위-상위-하위 모두 메모리에 올라간다
AA aa = new AA();
}
}
2. 최상위 P 클래스
public class P {
int a = 1;
public P() {
System.out.println("상위 클래스");
}
}
3. 상위 A 클래스
public class A extends P{
int a = 10;
public A() {
System.out.println("하위 클래스");
}
}
4. 하위 AA 클래스
public class AA extends A{
int a = 200;
public AA() {
// 하나 위에있는 A로 가서 값을 가져온다
System.out.println("손녀 클래스 " + super.a);
// AA위에 있는 A의 위에있는 P의 값을 가져오고 싶어도
// 안됨
// System.out.println("손녀 클래스 " + super.super.a);
}
}
実行結果finalクラスとfinalメソッド
各解釈は少し異なりますが、特定のクラス、フィールド、メソッドを継承したくない場合は、このメソッドを使用します.
継承できないfinalクラス
クラスを宣言するときにfinalキーをclassの前にアタッチすると、クラスは最終クラスになるため継承できません.
// final 설정을 해주게 되면
final class One{ }
// 이렇게 사용할 때 에러가 난다
// One은 상속을 받을 수 없는 클래스니까
class two extends One { }
上書きできないfinalメソッド
親宣言の子クラスを継承する場合、親に宣言する最終メソッドは、子クラスで再定義できません.
1) 상위 클래스
public class Car {
//필드
public int speed;
// 메소드
public void speedUp() {
speed +=1;
}
// final 메소드
// =사용은 가능하나, 재정의가 불가한 메소드로 선언
public final void stop() {
System.out.println("차를 멈춤");
speed = 0;
}
}
2) 하위 클래스
public class CarSports extends Car {
@Override
public void speedUp() {
speed += 10;
}
// 상위 메소드에서 final 메소드로 설정해줬기 때문에
// 오버라이딩해 사용할 수 없다
// @Override
// public void stop() {
// System.out.println("스포츠카 멈춤");
// speed = 0;
// }
}
3) 출력해보자
class CarPrint {
public static void main(String[] args) {
// 객체 생성
CarSports cp = new CarSports();
System.out.println(cp.speed);
cp.speedUp();
System.out.println(cp.speed);
cp.stop();
}
}
保護されたアクセス制限
アクセス制限には、public、protected、default、privateの4種類があります.
:クラス、フィールド、作成者、メソッド
:アクセスできないクラスはありません.同じプロジェクト内にいる場合は、
:フィールド、作成者、meso
:サブクラス&同じパッケージにある場合は
:クラス、フィールド、作成者、メソッド
:同じ小包なら
:フィールド、作成者、メソッド
:
protectedは同じパッケージ内でアクセス制限がありません
1) A 클래스
package package1;
public class Protected_A {
protected String field;
protected Protected_A() { }
protected void method() { }
}
2) B 클래스
package package1;
public class Protected_B {
public void method() {
// 상속 관계는 아니지만 같은 패키지에 있으므로 객체화해 사용 가능
Protected_A a = new Protected_A();
a.field = "value";
a.method();
}
}
protectedは他のパッケージでは使用できません
1) A 클래스
package package1;
public class Protected_A {
protected String field;
protected Protected_A() { }
protected void method() { }
}
2) C 클래스
package package2;
import package1.Protected_A;
// 다른 패키지이고, 상속관계도 아닌 protecte 클래스를 사용할 수 없다
public class Protected_C {
public void method() {
// 생성자가 protected 이므로 에러
// Protected_A a = new Protected_A();
//
// a.field = "value";
// a.method();
}
}
継承関係の場合は、他のパッケージも使用できます。
1) A 클래스
package package1;
public class Protected_A {
protected String field;
protected Protected_A() { }
protected void method() { }
}
2) D 클래스
package package2;
import package1.Protected_A;
// 같은 패키지는 아니지만 자식 클래스이기 때문에 A클래스를 사용 가능
public class Protected_D extends Protected_A{
public Protected_D() {
// 부모인 A생성자 호출
super();
// 현재 D 클래스에 field와 method()가 없으므로 this. 사용 가능
// 현재 클래스에 동일명으로 작성된게 있다면 그거부터 찾아가기 때문에
// 사용할 수 없다
this.field = "value";
this.method();
// 부모에 있는 값과 메소드에 넣고 싶은 것이니 super. 도 사용가능
super.field = "value2";
super.method();
}
}
Reference
この問題について(継承), 我々は、より多くの情報をここで見つけました https://velog.io/@cyhse7/자바-메소드-오버라이딩-연습テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol