JAva final、マルチステート、抽象クラス、インタフェースの原理を詳しく解く
1:finalキーワード(把握)(1)は最終的な意味で,クラス,メソッド,変数を修飾することができる.(2)特徴:A:修飾されたクラスは継承できません.B:修飾の仕方は、書き換えられません.C:修飾変数は定数です.(3)面接関連:A:ローカル変数a:基本タイプ値は変更できないb:参照タイプアドレス値は変更できないが、オブジェクトの内容は変更可能なB:初期化タイミングa:一度しか初期化できない.b:よくある値定義の場合.(推奨)
構築方法で.
2:多態(把握)(1)同じオブジェクトが異なる時点で現れる異なる状態.(2)多態の前提:A:継承または実現関係がある.B:書き直す方法があります.C:親または親インタフェースリファレンスが子オブジェクトを指します.Fu f = new Zi(); マルチステートの分類:a:特定のクラスマルチステートclass Fu{}class Zi extends Fu{}Fuf=new Zi();b:抽象クラス多態abstract class Fu{}class Zi extends Fu{}Fuf=new Zi();c:インタフェースマルチステートinterface Fu{}class Zi implements Fu{}Fuf=new Zi();(3)マルチステートのメンバーアクセスフィーチャーA:メンバー変数コンパイル左を見て、実行して左を見て(Fuの中にあるかどうかを見て、メンバー変数は1つのオブジェクトの外在的な特徴を表現するので、メンバーメソッドは内在的に表現します)B:構築メソッドサブクラスの構造はすべてデフォルトで親クラスの無参構造にアクセスして、親クラスのデータに対して初期化C:メンバーメソッドコンパイル左を見て、実行は右を見る(コンパイルはFuにあるかどうかを見て、ない場合はエラーを報告して、ある場合はZiにアクセスする方法、ZiクラスがFuを書き換えた方法)D:静的メソッドコンパイルは左を見て、実行は左を見る(静的メソッドは書き換えと呼ばない、静的とクラスは関係なく、書き換えとは言えないので、質問は左を訪問する)(4)多態のメリット:A:コードのメンテナンス性を高める(継承体現)B:コードの拡張性を高める(マルチステート体現)(5)マルチステートの弊害:親は子の特有の機能を使用できない(すなわち、子があっても親がいない方法は使用できず、書き換えられた方法しか使用できない).
現象:子は親として使用でき、親は子として使用できません.
私はサブクラス特有の機能を使いたいですか?いいですか?いいですよ.どのように使いますか.A:サブクラスオブジェクトの呼び出し方法を作成すればいいです.(いいですが、不合理な場合が多く、新しいオブジェクトが再作成されます.また、メモリが多すぎます.この方法は使用しないでください).B:親の参照を強制的にサブクラスの参照に変換します.(下への転換)オブジェクト間の転換問題:上への転換:Fuf=new Zi();ダウンシフト:Zi z=(Zi)f;//このfはZiに変換可能であることが要求される.3:抽象類(掌握)(1)複数の共通性のあるものを一つの類に抽出するのが継承の仕方である.しかし、この複数の共通性のあるものは、時には、方法が同じであることを宣言することがありますが、方法体です.すなわち,メソッド宣言は同じであるが,具体的なオブジェクトごとに具体的な実装時に内容が異なる.したがって,これらの共通の方法を定義する際には,具体的な方法体を与えることはできない.具体的な方法体がない方法は抽象的な方法である.クラスに抽象メソッドがある場合は、クラスを抽象クラスとして定義する必要があります.(2)抽象クラスの特徴A:抽象クラスと抽象メソッドはキーワードabstractで修飾しなければならないB:抽象クラスには抽象メソッドがあるとは限らないが、抽象メソッドがあるクラスは抽象クラスCに違いない:抽象クラスはインスタンス化できない.具体的なD:抽象クラスのサブクラスa:抽象クラスではないからである.b:具体的なクラスです.このクラスは抽象クラスのすべての抽象メソッドを書き直さなければなりません.(3)抽象クラスのメンバーの特徴:A:メンバー変数には変数があり、定数があるB:構造方法には構造方法があるC:メンバー方法には抽象があり、非抽象(4)抽象クラスのいくつかの小さな問題があるA:抽象クラスには構造方法があり、インスタンス化できないが、構造方法は何の役に立つのか.サブクラスが親データにアクセスするための初期化B:1つのクラスが抽象的な方法がないのに抽象的なクラスとして定義されている場合、何の役に立ちますか?作成オブジェクトC:abstractがどのキーワードと同時に使用できないようにするには、すなわち、1つのメソッドa:final競合を同時に修飾することはできない(final修飾のメソッドは継承できないが、抽象的なメソッドを定義することは、サブクラス継承がそれを実現することを望んでいることであり、これは互いに衝突する)b:private競合(以上の理由)c:staticは意味がない(静的修飾の方法はクラス名で直接呼び出すことができ,抽象的であれば,この方法にはメソッド体がなく,呼び出す意味がなく,コンパイルもエラーを報告する)
4:インタフェース(把握)(1)猫犬のケースを振り返ると、基本的な機能はいくつかしか提供されていません.例えば、猫が火の輪をくぐったり、犬が高跳びをしたりする機能は、動物自体が備えているものではなく、後の培養で訓練されたもので、javaはインタフェース表示を提供しています.(2)インタフェースの特徴:A:インタフェースはキーワードinterfaceでinterfaceインタフェース名{}B:クラス実装インタフェースはimplementsでclassクラス名implementsインタフェース名{}C:インタフェースはD:インタフェースの実装クラスa:抽象クラスをインスタンス化できない.b:インタフェース内のすべての抽象メソッドを書き換える必要がある特定のクラスです.(3)インタフェースのメンバー特徴:A:メンバー変数は定数デフォルト修飾子のみ:public static final B:構築方法構築方法なしC:メンバーメソッドは抽象的なデフォルト修飾子のみ:public abstract(4)クラスとクラス、クラスとインタフェース、インタフェースとインタフェースA:クラスとクラスの継承関係、単一継承のみ、多層継承B:クラスとインタフェースの実現関係、単に実現してもよいし,多く実現してもよい.また、1つのクラスを継承するとともに、複数のインタフェースCを実現することも可能である:インタフェースとインタフェースの継承関係は、単に継承してもよいし、複数継承してもよい
抽象クラスとインタフェースの区别:A:メンバー区别抽象クラス:メンバー変数:変数、定数构筑方法:メンバーメソッドがある:抽象的でも非抽象的でもよい:メンバー変数:定数メンバーメソッドのみ:抽象的B:関系区分クラスとクラス継承、単一継承クラスとインタフェース実装、単一実装、多実現インタフェースとインタフェース継承,単継承,多継承C:設計理念区別抽象類が継承されるのは,「is a」の関係である.抽象クラスで定義されるのは、継承システムの共通機能です.インタフェースが実装されるのは,「like a」の関係である.インタフェースには、継承システムの拡張機能が定義されています.
構築方法で.
2:多態(把握)(1)同じオブジェクトが異なる時点で現れる異なる状態.(2)多態の前提:A:継承または実現関係がある.B:書き直す方法があります.C:親または親インタフェースリファレンスが子オブジェクトを指します.Fu f = new Zi(); マルチステートの分類:a:特定のクラスマルチステートclass Fu{}class Zi extends Fu{}Fuf=new Zi();b:抽象クラス多態abstract class Fu{}class Zi extends Fu{}Fuf=new Zi();c:インタフェースマルチステートinterface Fu{}class Zi implements Fu{}Fuf=new Zi();(3)マルチステートのメンバーアクセスフィーチャーA:メンバー変数コンパイル左を見て、実行して左を見て(Fuの中にあるかどうかを見て、メンバー変数は1つのオブジェクトの外在的な特徴を表現するので、メンバーメソッドは内在的に表現します)B:構築メソッドサブクラスの構造はすべてデフォルトで親クラスの無参構造にアクセスして、親クラスのデータに対して初期化C:メンバーメソッドコンパイル左を見て、実行は右を見る(コンパイルはFuにあるかどうかを見て、ない場合はエラーを報告して、ある場合はZiにアクセスする方法、ZiクラスがFuを書き換えた方法)D:静的メソッドコンパイルは左を見て、実行は左を見る(静的メソッドは書き換えと呼ばない、静的とクラスは関係なく、書き換えとは言えないので、質問は左を訪問する)(4)多態のメリット:A:コードのメンテナンス性を高める(継承体現)B:コードの拡張性を高める(マルチステート体現)(5)マルチステートの弊害:親は子の特有の機能を使用できない(すなわち、子があっても親がいない方法は使用できず、書き換えられた方法しか使用できない).
現象:子は親として使用でき、親は子として使用できません.
私はサブクラス特有の機能を使いたいですか?いいですか?いいですよ.どのように使いますか.A:サブクラスオブジェクトの呼び出し方法を作成すればいいです.(いいですが、不合理な場合が多く、新しいオブジェクトが再作成されます.また、メモリが多すぎます.この方法は使用しないでください).B:親の参照を強制的にサブクラスの参照に変換します.(下への転換)オブジェクト間の転換問題:上への転換:Fuf=new Zi();ダウンシフト:Zi z=(Zi)f;//このfはZiに変換可能であることが要求される.3:抽象類(掌握)(1)複数の共通性のあるものを一つの類に抽出するのが継承の仕方である.しかし、この複数の共通性のあるものは、時には、方法が同じであることを宣言することがありますが、方法体です.すなわち,メソッド宣言は同じであるが,具体的なオブジェクトごとに具体的な実装時に内容が異なる.したがって,これらの共通の方法を定義する際には,具体的な方法体を与えることはできない.具体的な方法体がない方法は抽象的な方法である.クラスに抽象メソッドがある場合は、クラスを抽象クラスとして定義する必要があります.(2)抽象クラスの特徴A:抽象クラスと抽象メソッドはキーワードabstractで修飾しなければならないB:抽象クラスには抽象メソッドがあるとは限らないが、抽象メソッドがあるクラスは抽象クラスCに違いない:抽象クラスはインスタンス化できない.具体的なD:抽象クラスのサブクラスa:抽象クラスではないからである.b:具体的なクラスです.このクラスは抽象クラスのすべての抽象メソッドを書き直さなければなりません.(3)抽象クラスのメンバーの特徴:A:メンバー変数には変数があり、定数があるB:構造方法には構造方法があるC:メンバー方法には抽象があり、非抽象(4)抽象クラスのいくつかの小さな問題があるA:抽象クラスには構造方法があり、インスタンス化できないが、構造方法は何の役に立つのか.サブクラスが親データにアクセスするための初期化B:1つのクラスが抽象的な方法がないのに抽象的なクラスとして定義されている場合、何の役に立ちますか?作成オブジェクトC:abstractがどのキーワードと同時に使用できないようにするには、すなわち、1つのメソッドa:final競合を同時に修飾することはできない(final修飾のメソッドは継承できないが、抽象的なメソッドを定義することは、サブクラス継承がそれを実現することを望んでいることであり、これは互いに衝突する)b:private競合(以上の理由)c:staticは意味がない(静的修飾の方法はクラス名で直接呼び出すことができ,抽象的であれば,この方法にはメソッド体がなく,呼び出す意味がなく,コンパイルもエラーを報告する)
<span style="font-size:18px;">/*
: ,
: , ,
:
:
: ,
: ,
: ( )
:
: ,
: ,
: ( )
, 。 。
, ,
, 。
:
: ,
: ,
: ();
:
:
: ,
: ,
: ();
:
();
:
();
*/
//
abstract class Animal {
//
private String name;
//
private int age;
public Animal() {}
public Animal(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//
public abstract void eat();
}
//
class Dog extends Animal {
<span style="color:#ff0000;">public Dog() {}
public Dog(String name,int age) {
super(name,age);
}</span>
public void eat() {
System.out.println(" ");
}
}
//
class Cat extends Animal {
public Cat() {}
public Cat(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println(" ");
}
}
//
class AbstractTest {
public static void main(String[] args) {
//
Animal a = new Dog();
a.setName(" 1");
a.setAge(3);
System.out.println(a.getName()+"---"+a.getAge());
a.eat();
Animal a2 = new Dog(" 2",3);
System.out.println(a2.getName()+"---"+a2.getAge());
a2.eat();
}
}</span>
4:インタフェース(把握)(1)猫犬のケースを振り返ると、基本的な機能はいくつかしか提供されていません.例えば、猫が火の輪をくぐったり、犬が高跳びをしたりする機能は、動物自体が備えているものではなく、後の培養で訓練されたもので、javaはインタフェース表示を提供しています.(2)インタフェースの特徴:A:インタフェースはキーワードinterfaceでinterfaceインタフェース名{}B:クラス実装インタフェースはimplementsでclassクラス名implementsインタフェース名{}C:インタフェースはD:インタフェースの実装クラスa:抽象クラスをインスタンス化できない.b:インタフェース内のすべての抽象メソッドを書き換える必要がある特定のクラスです.(3)インタフェースのメンバー特徴:A:メンバー変数は定数デフォルト修飾子のみ:public static final B:構築方法構築方法なしC:メンバーメソッドは抽象的なデフォルト修飾子のみ:public abstract(4)クラスとクラス、クラスとインタフェース、インタフェースとインタフェースA:クラスとクラスの継承関係、単一継承のみ、多層継承B:クラスとインタフェースの実現関係、単に実現してもよいし,多く実現してもよい.また、1つのクラスを継承するとともに、複数のインタフェースCを実現することも可能である:インタフェースとインタフェースの継承関係は、単に継承してもよいし、複数継承してもよい
抽象クラスとインタフェースの区别:A:メンバー区别抽象クラス:メンバー変数:変数、定数构筑方法:メンバーメソッドがある:抽象的でも非抽象的でもよい:メンバー変数:定数メンバーメソッドのみ:抽象的B:関系区分クラスとクラス継承、単一継承クラスとインタフェース実装、単一実装、多実現インタフェースとインタフェース継承,単継承,多継承C:設計理念区別抽象類が継承されるのは,「is a」の関係である.抽象クラスで定義されるのは、継承システムの共通機能です.インタフェースが実装されるのは,「like a」の関係である.インタフェースには、継承システムの拡張機能が定義されています.
<span style="font-size:18px;">/*
,
:
:
,
,
:
,
,
, , :
:
,
();
(){}
:
:
,
:
:
:
;
:
*/
//
interface Jumpping {
//
public abstract void jump();
}
//
abstract class Animal {
//
private String name;
//
private int age;
public Animal() {}
public Animal(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// ();
public abstract void eat();
// (){}
public void sleep() {
System.out.println(" ");
}
}
//
class Cat extends Animal {
public Cat(){}
public Cat(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println(" ");
}
}
//
class Dog extends Animal {
public Dog(){}
public Dog(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println(" ");
}
}
//
class JumpCat extends Cat implements Jumpping {
public JumpCat() {}
public JumpCat(String name,int age) {
super(name,age);
}
public void jump() {
System.out.println(" ");
}
}
//
class JumpDog extends Dog implements Jumpping {
public JumpDog() {}
public JumpDog(String name,int age) {
super(name,age);
}
public void jump() {
System.out.println(" ");
}
}
class InterfaceTest {
public static void main(String[] args) {
//
JumpCat jc = new JumpCat();
jc.setName(" A ");
jc.setAge(3);
System.out.println(jc.getName()+"---"+jc.getAge());
jc.eat();
jc.sleep();
jc.jump();
System.out.println("-----------------");
JumpCat jc2 = new JumpCat(" ",2);
System.out.println(jc2.getName()+"---"+jc2.getAge());
jc2.eat();
jc2.sleep();
jc2.jump();
}</span>
}