2のオブジェクト指向機能:継承
継承の利点:
①コードの再利用性向上、コードの冗長性を減らす
②拡張機能を容易にし
、以下の多型のために③提供前提条件
遺伝形式は:
クラスAがB {}延び
Aサブクラス派生クラスであるが、サブクラス
Bが親クラス、スーパークラス、基本クラスで、スーパークラスが
継承を反映:Aのサブクラスは、親クラスBから継承されると、考えサブクラスaは、親クラスBのすべての属性とメソッドが宣言だ。特に、親クラスには、専用のプロパティとメソッドを宣言し、サブクラスを親クラスを継承した後、まだサブクラスは親クラスがプライベート継承を考えます構造、しかしので、パッケージの影響のために、それは、サブクラス内で直接呼び出すことはできません。
サブクラスが継承した後、親クラスにも拡張を実現するために独自のプロパティとメソッドを宣言することがあります。
相続に関する規定:
1は、サブクラスが唯一の直接の親を持つことができ、Javaの単一継承である;
2、直接のサブクラスは親クラスが直接の親と呼ばれる、間接的な継承は、親クラスが間接的な親と呼ばれる継承します。 ;サブクラスは親クラスを継承した後、あなたは、直接および間接の親のすべての属性とメソッドは、親クラスで宣言され得る
3、サブクラスは親のみを継承することができますが、親はサブクラスに継承することもできるが、
4、親が明示的にクラスはjava.lang.Objectクラスから継承するクラスを宣言していない場合は、すべてのクラスはjava.lang.Objectクラスに直接的または間接的に継承し、すべてでありますJavaクラスはjava.lang.Objectクラスで宣言された属性とメソッドを持っています。
package com.atguigu.java;
public class Creature {
public void breath(){
System.out.println("呼吸");
}
}
package com.atguigu.java;
public class Person extends Creature{//Person中虽然没有定义breath方法
//但从Creature中继承得到了该方法
String name;
private int age;
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("吃饭");
sleep();
}
private void sleep(){
System.out.println("睡觉");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
書き換えの方法:(オーバーライド/上書き)
書き換え:サブクラスは親クラスを継承した後、同じ名前のメソッドは、パラメータの親クラスでオーバーライドすることができます。
アプリケーション:あなたがオブジェクトのサブクラスを作成した場合、書き換えた後、オブジェクトのサブクラスを通じて児童のパラメータと同じ名前を持つ親クラスのメソッドを呼び出し、サブクラスのメソッドが実際に実行上書きされます。
所定の書き換え:
Method文を:許可修飾戻り型メソッド名(パラメータリスト)が例外{}型スロー
点注:
①方法サブクラスを親クラスのメソッド名とパラメータリストをオーバーライド書き換えられるために、同じ名前のメソッドとメソッドのパラメータリスト、
権限のオーバーライドメソッド②サブクラス修飾子が親クラスに書き換えられ未満ではありません。特殊な状況、サブクラスがオーバーライドできる親クラスは、プライベート権威として宣言しました方法。
戻り値の型ボイドが、サブクラスは親クラス③オーバーライドメソッドオーバーライドされたメソッドの戻り値の型のみ無効とすることができます。
④親クラスは、オーバーライドされたメソッドの戻り型がA型である、サブクラスのメソッドのオーバーライド戻り型がA型であること及びサブクラスを入力することです。
⑤親クラスのメソッドを上書きする値を返すデータ型の基本的なタイプである、方法サブクラスはまた、基本データ型の同じタイプをオーバーライドすることができます。
⑥例外のタイプサブクラススローオーバーライドは、親クラスが例外型オーバーライドされたメソッド(特に例外処理に話す)スローさより大きくありません。
⑦パラメータを持つ親クラスのサブクラスと同じ名前のは、非静的に宣言(書き換えを検討)、または静的(書き換えない)宣言されているいずれか。
public class Student extends Person{
String major;
public Student(){
}
public Student(String major){
this.major = major;
}
public void study(){
System.out.println("学习。专业是:" + major);
}
//对父类中的eat()进行了重写
public void eat(){
System.out.println("学生应该多吃有营养的食物");
}
public void show(){
System.out.println("我是一个学生");
}
public String info(){
return null;
}
// public int info1(){
// return 1;
// }
// public void walk(int distance){
// System.out.println("重写的方法");
// }
public void walk(int distance) {
System.out.println("重写的方法");
}
}
プロセス全体のサブクラスオブジェクト・インスタンス
図1は、その結果から、 :(継承)
がプロパティまたはメソッドは、親クラス内で宣言され、取得した後に、サブクラスは、親クラスを継承します。
オブジェクトのサブクラスを作成し、ヒープスペースでは、親クラスで宣言されたすべてのプロパティをロードします。
2、プロセスの観点から:
私たちは、サブクラスによって、サブクラスのオブジェクトのコンストラクタを作成するとき、私たちはコールまで、直接または間接の親クラスのコンストラクタを呼び出し、その後、親クラスの親クラスのコンストラクタを呼び出します...クラスjava.lang.Objectの中空引数のコンストラクタまで。そのため、親クラスローダのすべての構造、私は構造化親クラスでメモリを見ることができるので、サブクラスのオブジェクトを考慮すると呼ばれることができるの。
クリア:オブジェクトのサブクラスを作成し、親クラスのコンストラクタを呼び出すが、あまりにもオブジェクトを作成するために、最初から最後まで、新しいサブクラスのオブジェクトです。
superキーワードを使用します
。1、スーパーとして理解:親クラス
2、呼び出すために使用することができるスーパー:プロパティ、メソッド、コンストラクタ
3、スーパーの使用:コールのプロパティとメソッド
- 3.1我々は、メソッドまたはコンストラクタをサブクラス化することができます。「スーパー。プロパティ」または「スーパー。方法」アプローチを使用することにより、プロパティやメソッドの呼び出し親クラスは明示的に宣言しました。しかし、通常の状況下では、我々はオミットに慣れている「スーパー」。
- 3.2特殊なケース:「スーパープロパティを」親クラスとサブクラスは、同じ名前のプロパティを定義するとき、私たちは、呼び出していることを示す、サブクラス、明示的に使用しなければならないアプローチで宣言された親クラスのプロパティを呼び出したいですこれは、親クラスの宣言のプロパティです。
- 3.3特殊ケース:「スーパー方法」サブクラスは、将来的に親クラスをオーバーライドするとき、私たちは親クラスのメソッドがオーバーライドされたメソッドの呼び出しサブクラスで欲しい、あなたが明示的に使用しなければならないマナー、メソッドが親クラスを書き換えると呼ばれていることを示しています。
4. スーパーコンストラクタを呼び出します
- 4.1当社は、明示的にサブクラスがコンストラクタで指定されたコンストラクタで宣言された親を呼んで、「スーパー(パラメータリスト)」メソッドを使用することができます
- 4.2「スーパー(パラメータリスト)、」使用は、サブクラスのコンストラクタの1行目に宣言する必要があります!
- 4.3今後のコンストラクタクラスのための「この(パラメータリスト)」または「スーパー(パラメータリスト)が」だけでなく、両方の、いずれかを選択することができます
- 最初の行コンストラクタは、明示的な声明「この(パラメータリスト)」で4.4または「スーパー(パラメータリスト)」、デフォルトは親クラスが中空の引数のコンストラクタと呼ばれている:スーパー()
- クラスのコンストラクタの4.5複数、少なくともクラスのコンストラクタが使用する「スーパーは、(パラメータリスト)」、親クラスのコンストラクタを呼び出します
public class SuperTest {
public static void main(String[] args) {
Student s = new Student();
s.show();
System.out.println();
s.study();
Student s1 = new Student("Tom", 21, "IT");
s1.show();
System.out.println("************");
Student s2 = new Student();
}
}