オブジェクト向けプログラミング(Java)-継承
17407 ワード
継承された定義と利点
継承
Inheritance
は、既存のクラスを再利用することによって新しいクラスを作成する方法です.継承によってクラスを実装すると、少ないコードで新しいクラスを記述し、コードを共同で管理できるため、コードの追加や変更が便利です.これらの特性はコードの再利用性を向上させ,重複データを排除し,プログラミング効率とメンテナンスに大きな貢献をした.使用方法
public ParentApp{
void parentMethod() {}
}
public class ChildApp extends ParentApp {
// 해당 클래스는 상속을 받은 클래스의 메서드도 사용할 수 있어요
// 그렇기에 ParentApp을 확장한다는 의미로 `extends`라는 키워드를 기입해요
// 'Child extends Parent', `자식은 부모를 확장한다`
// void parentMethod() {}
void method() {}
}
このうちParentApp
とChildApp
は継承関係に属し、継承されたParentApp
は親類に属し、継承されたChildApp
は子供類に属する.他の方法でも以下のように表現します.親→to→基
Base
、前super
、祖先子→to→子
sub
、派生Derived
、子孫継承関係を画像で表すと以下のようになります.
クラスは楕円、矢印は継承クラス→to→継承クラスとして表示されます.このように絵で表現された継承階層も
Inheritance Hierarchy
と呼ばれていますクラス間の関係-has-a、is-a
クラスは継承によって関係を確立し、既存のコードを再利用できます.
extends
キーワードで構成された関係をis-aと呼ぶリレーションシップによる再使用に加えて、他の方法もあります.例は以下の通りです.
class Point { int x, y; }
class Circle {
// 상속이 아닌 인스턴스 변수로서 관계를 맺어요
Point point;
int radius;
}
継承としてではなく変数として関係を築いた一般的に知られている概念で説明すると、Point
はx,yの概念である.さらに、Circle
はx、y座標および半径の長さを有し、Circle
自体はPoint
ではなく、Point
の概念である.もちろん
Circle extends Point
は機能的に動作するのは同じですしかし、これは私たちが理解しにくい構造であり、Point
の概念が変化すれば、Circle
も同時に変化する.あなたたち二人は独立して運営しなければなりません.したがって、Circle
は、Point
を「所有」するように実現されるべきである.クラスが1つのクラスにインスタンス変数として存在する関係をhas-a関係と呼ぶ.結論:類で文を作る場合「~は~」の文が成立すると,
is-a
,「~は~」の文が成立し,has-a
関係に現れる.単一継承
C++などの他のオブジェクト向け言語では、複数の親から
Multiple Inheritance
を継承できますが、Javaでは単一の継承のみが許可されます.public class ABC extend A, B, C // 이렇게 안되요!
{}
複数の継承を許可すると、複雑な機能を処理できるクラスを作成できますが、関係が複雑になり、メンテナンスが困難になるという欠点があります.最大の問題は、継承された複数のクラスが同じメソッドを持っている場合、「ファジイ」が発生し、エラーが発生することです.class A { void method(){} }
class B { void method(){} }
// 누구 method()를 사용해야 하는 걸까요?
class AB extends A, B {}
もちろん,この問題を解決する方法は重複名を除去することである.しかし、丹念に編成されたコードから名前を変えるのは難しい.だからJavaはいっそ多重継承を阻止して、私たちにもっと信頼できるコードを書くことができます.もちろん,多重継承に類似した文法も存在する.後で処理しますハハ.
Objectクラス-すべてのクラスの親
Object
クラスは、すべてのクラスが階層図の最上位レベルを継承する祖先クラスです.他のクラスから継承されないすべてのクラスは、Object
クラスから自動的に継承されます.クラスを宣言した場合は、
toString()
、getHashCode()
などの機能をクラスで使用できます.Object
等級を引き継いだので可能です.全部で11の基本的な方法を提供します.class App // extends Object // 자바가 알아서 상속시켜줘요
オーバーライド(Override)
overriding
Overriding
とは、親から継承されたメソッドの内容を変更する操作を指す.継承メソッドは使用できますが、サブクラスを変更する場合に便利です.class Father{
void introduce() { "나는 아빠다" }
}
class Son extends Father {
@Override // 이렇게 명시해주면 부모 클래스에
// 해당 메서드가 없으면 컴파일 에러 처리해요
// 이름이 틀려서 상속이 잘못되는 것을 방지해요
void introduce() { "나는 아들이다" }
}
上書き条件
上書きは新しいメソッドの内容にすぎず、メソッドの宣言は祖先と完全に一致しなければならない.成立条件は以下の通り.
Covariant return type
が追加され、条件が緩和され、戻りタイプをサブクラスのタイプに変更できるようになった.class Parent {
//it contain data member and data method
}
class Child extends Parent {
// 반환형이 부모지만, 자식 클래스도 반환이 가능해요
public Parent methodName() {
return new Parent(); // 이걸 쓰거나
또는
return Child(); // 이걸 써도 되요
}
}
これらの条件を一言で要約すると、宣言が完全に一致しなければならないことを意味します.しかし、アクセス制御者access modifier
および例外exception
は、限られた条件下で異なるコンテンツを適用することができる.1.アクセス制御者が祖先クラスの方法より狭くできない
親で定義された方法の制御者が
protected
である場合、protected
およびpublic
として宣言するしかない.private
はだめです.2.親メソッドより多い数の例外は宣言できません.
コードで説明したほうが便利だと思います.
class Parent{
void method() throws IOException, SQLException;
}
class Child extend Parent{
// 정상! 예외 수가 적네요
void method() throws IOException;
// 정상! 예외 수가 적네요
void method() throws IOException, SQLException;
// 비정상! 예외 수가 많아요
void method() throws IOException, SQLException, TestException;
}
しかし、そう簡単に例外の個数だけを計算するわけではない.たとえば、Exception
という例外クラスは、すべての例外のトップクラスの親です.したがって、Exception
は、放出された異常数が親の異常数以下であっても、すべての異常に対応するため、「異常数が親以下であるべき」という条件を満たすことができず、コンパイルエラーを引き起こす.class Parent{
void method() throws IOException, SQLException;
}
class Child extend Parent{
// 비정상!
void method() throws Exception;
}
3.インスタンスメソッドをクラスメソッドまたはその逆に変更することはできません.static void method()
だからvoid method()
に変えられない反対も同じ意味過負荷vs.過負荷
名前は紛らわしいからだが、違いは明らかだ.整理すると、
過負荷
Overloading
:新しいメソッドの定義(new)上書き
Overriding
:継承メソッドの内容を変更(change)super
子クラスでは、祖先クラスから継承されたメソッドまたは変数を参照するために使用される参照変数です.メンバー変数と地域変数を区別するときに
this
を使用するように、super
を使用して親変数とメソッドを使用できます.class A {
int a = 10;
void method() { a 출력 }
}
class B extend A {
int a = 20;
@Override
void method() { b 출력 }
void useMethod() {
super.method(); // 10 출력
this.method(); or method(); // 20 출력
}
}
super()-親作成者
this()
と同様に、super()
も生成者である.相違がある場合は、親を継承する作成者を呼び出すために使用します.this()
と同様に、ジェネレータロジックの最初の行で宣言する必要があります(オブジェクト向けプログラミング-作成者を参照).また、すべてのサブクラス作成者は、自分の他の作成者または親作成者を呼び出す必要があります.親作成者を宣言して、正しい初期化を起動します.もちろんJava強制もあります
したがって、サブクラスコンストラクタ呼び出しは、継承関係を遡及し、まず最上位
Object
クラスのコンストラクタを実行し、次いで昇順し、コンストラクタロジックを実行する.class A {
A(int a) {}
}
class B {
B(int a) {
super(a); // 없으면 컴파일 에러!
}
}
Reference
この問題について(オブジェクト向けプログラミング(Java)-継承), 我々は、より多くの情報をここで見つけました https://velog.io/@redgem92/Java-객체지향-프로그래밍-상속テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol