クラスの継承
- キーワード識別の継承を拡張
- スーパー()文の親クラスのコンストラクタを呼び出すために、あなたはまた、親クラスのメソッドのメンバーを呼び出すためにsuperキーワードを使用することができますが、サブクラスは親クラスのプライベートメンバメソッドを呼び出すためのアクセス許可を持っていません
- 親クラスのメソッドをオーバーライドすると、唯一の権利をsteeled
- 継承されたメソッドをオーバーライドのみ戻り値の型は、サブクラスの戻り型(JDK5)の親である変更
- ファーストクラスのオブジェクトの例コンストラクタパラメータが自動的に(送信パラメータが必要)が起動することができず、サブユニットの親クラス・オブジェクトおよびパラメータ設定方法が自動的に呼び出されるインスタンス
- 継承の機構では、親の子オブジェクトは、この親のオブジェクトを含むことになるサブクラスオブジェクトを作成し、子供が親クラスは、子クラス・オブジェクト内部(サブから元、外部からの後者の、同じで作成するオブジェクトサブオブジェクト)を含む親クラス・オブジェクト
- あなたが最後のアクションのファイナライズサブクラス()メソッドを確保する必要性をクリーンアップするオブジェクトのファイナライズ()メソッドを使用している場合は、メモリがオブジェクトのガベージコレクションによって占められ、オブジェクトのすべての部分ができることを確実にするために、親クラスのファイナライズ()メソッドを呼び出すことです正常終了
- 静的メソッドは、最終的な方法は、書き換え可能ではない、静的メソッドを書き換えなければなりません
package ex10_Interface;
class Parent {
public Parent() {
System.out.println("调用父类的Parent()构造方法");
}
protected void doSomething() { //父类protected方法
//do Something
}
protected Parent doIt() { //父类protected方法,返回Partent类型
return new Parent();
}
}
class SubParent extends Parent {
public SubParent() {
super(); //使用super()调用父类构造方法
super.doSomething(); //使用super关键字调用父类成员方法
System.out.println("调用子类的SubParent()构造方法");
}
public void doSomethingNew() { //子类新增方法
//do something new
}
public void doSomething() { //重写父类方法,修改权限为public
//do Something
}
public Subroutine doIt() { //重写父类方法,返回SubParent类型
return new Subroutine();
}
}
public class Subroutine extends SubParent {
public Subroutine() { //自动调用父类构造方法
System.out.println("调用子类的Subrountine()方法");
}
public static void main(String[] args) {
Subroutine s = new Subroutine();
}
}
Objectクラス
- すべてのクラスはクラスjava.lang.Objectを継承します
- 等、任意のクラスのメソッド)(クローンオブジェクトクラスをオーバーライドすることができ、ファイナライズ()()に等しい、のtoString()、のgetClass()、通知()、のnotifyAll()、待機()メソッドと缶のように書き換えることがありません、方法のこれらのタイプは、最終のために定義されているので、
- getClass()クラス名を取得する方法は、現在(クラスを含み、取得したコンテキスト)を実行して、戻り値は、クラスの一例である、のgetClass()。のgetName()クラスの名前を返します。
- toString()メソッドは、オブジェクトの形式で文字列を返します
- 等号()メソッドではなく、より多くのコンテンツよりも、2つのオブジェクトの参照を比較する==のデフォルトの実装では、コンテンツの真の比較を達成するためには、カスタムクラスのオーバーライドのequals()メソッドが必要
package ex10_Interface;
public class Test {
public void myMethod(Test t) {
System.out.println(t);
}
public String toString() { //getClass()自动获取当前类名
return "在" + getClass().getName() + "中重写toString()方法";
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(t); //自动调用toString方法
String s1 = "123";
String s2 = "123";
System.out.println(s1.equals(s2)); //返回true
Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1.equals(t2)); //返回false,默认使用==比较引用
//对象类型转换
Test t3 = new Test2();
Test2 t4 = (Test2) t3; //向下转型
// System.out.println(t3 instanceof Anything); //t3不是Anthing的对象,报错
//多态
Test2 tt2 = new Test2();
Test3 tt3 = new Test3();
t1.myMethod(tt2); //不同子类的对象调用父类的方法,向上转型
t1.myMethod(tt3);
tt2.myMethod(tt2); //使用父类对象或者子类对象调用都可以
tt2.myMethod(tt3);
}
}
class Test2 extends Test {}
class Test3 extends Test {}
class Anything {
}
オブジェクトの型変換
- アップキャスト
- サブクラスはインスタンス化された方法のアップキャストにパラメータとして親クラスのオブジェクトに渡された親クラス、サブクラスのオブジェクトが渡され、サブクラスのオブジェクトを呼び出すことができますオブジェクト
- サブクラスはインスタンス化親クラスタイプ(アップキャスト)の変数に割り当てることができるオブジェクト
- 愁い
- 親クラスの型の変数上方への遷移サブクラスの割り当てオブジェクトのインスタンスは、あなたはキャストを使用する必要があり、変数のサブクラスの親クラスタイプを変換する(親クラスをサブクラス、明示的な型変換であることをコンパイラに指示します)タイプ、直接割り当ては文句を言うでしょう
- 複数のオブジェクトの特定の特性は、以下でより抽象的なオブジェクトは、親ならば、オブジェクトの特徴の広い範囲が問題になるようにオブジェクトのプロパティの狭い範囲を変換し、ダウンキャストを行う際に、特性を有しています新しいサブクラスのオブジェクトのうち、オブジェクトに割り当てられ、異常ClassCastExceptionがキャスト
- INSTANCEOFを使用してオブジェクトの種類を判定する
- 下方遷移を行うことができる場合、オブジェクトは、サブクラスのインスタンスであるかどうかを決定します。instanceofはBと、無関係なクラスが与えられている、ブール型を返します
- また、クラスが実装インタフェースがあるかどうかを判断することができます
オーバーロードされたメソッド
異なるパラメータ、異なるタイプ、異なるオーダータイプ、パラメータ...可変長(配列として可変長パラメータ)の数
ポリモーフィズム
サブクラスの同様の方法の達成は、親クラスでは、オブジェクトのサブクラスは、すべての親クラスが親クラスの子オブジェクトで継承したら、あなたはパラメータとして親クラスのオブジェクトに親クラスを呼び出すことができます達成しますこの方法は、サブクラスオブジェクトの変換パラメータが上向きに渡さ。
抽象クラスとインタフェース
- 使用すると、メソッドが抽象メソッド本体ではありませんインスタンス化オブジェクトできないので、抽象メソッドは、それが上書きされない限り、抽象メソッドではない抽象クラスの継承を行わなければならない意味を持たない抽象的定義や抽象クラスの抽象メソッド、抽象クラスをキーワード非抽象クラスの抽象メソッドを定義することができ、抽象クラスを継承する以外には意味がありません
- 抽象クラスのすべての抽象メソッド、抽象クラスが実装しなければならない継承、いくつかのサブクラスはJavaは、インタフェースの概念を同時に継承する複数の親クラスが存在しないことができ、抽象メソッドを実装する必要はありませんので、。インターフェイスは、すべてのインターフェイスのメソッドは、その方法ではありません拡張する抽象クラスです。
- 修飾子権限を使用することができ、公開鍵は、同じ名前のファイルに定義されているキーワードを定義するインターフェイスを使用するインタフェースは、クラスと同様に、インタフェースのメソッドは、publicとして宣言されていない場合でも、パブリックまたは抽象的な形として定義する必要がありますそれはまた、公開されています
- 任意フィールドは、インタフェース自動静的および最終に定義されています
- コンマカーニーを使用して実装をインタフェース、複数のインターフェースを使用して実装された場合
- インタフェースは、インタフェースの継承することができ、使用が延びています
package ex10_Interface;
interface drawTest { //定义接口
void draw(); //定义方法,省略了public和abstract,其他不被编译器认可
}
interface drawTest2 extends drawTest {
void draw2(); //接口的继承
}
class A {
}
class B extends A implements drawTest { //多个接口使用逗号隔开
public void draw() { //由于该类实现了接口需要覆盖接口定义的方法
System.out.println("B类继承A类,实现接口drawTest,B.draw()");
}
}
class C extends A implements drawTest {
public void draw() {
System.out.println("C类继承A类,实现接口drawTest,C.draw()");
}
}
public class UseInterface {
public static void main(String[] args) {
System.out.println("----------------------------");
drawTest inf = new B(); //接口也可以进行向上转型
drawTest inf2 = new C();
inf.draw();
inf2.draw();
B b = new B(); //也可以直接使用对象调用成员方法
b.draw();
}
}