抽象クラスと内部クラス
1つの抽象的なクラス
(1)抽象的方法
- 抽象で飾られています。
- メソッドの定義のみで、特定の実装(特定のメソッド本体)はありません。つまり、{}中括弧でさえ;セミコロンで直接終了しません。
/**
* 定一个抽象类,动物类的抽象属性与行为
* @author Administrator
*
*/
public abstract class Animal {
//定义两个方法,描述动物吃的食物和叫声的区别
abstract void eat();
abstract void cry();
}
(2)抽象クラス
- 抽象で飾られています。
- 抽象メソッドを含むクラスは、抽象クラスである必要があります。
- インスタンス化できません。
- 抽象クラスは継承する必要があります。
4.1。それを書き直す方法---------------不完全で完了
4.2。抽象クラスでの抽象クラスの定義---------一般的には使用されません。
-
/** * 定一个抽象类,动物类的抽象属性与行为 * @author Administrator * */ public abstract class Animal { //定义两个方法,描述动物吃的食物和叫声的区别 abstract void cry(); abstract String eat(); }
-
/** * 动物狗的食物与叫声 */ public class Dog extends Animal { @Override public void cry() { System.out.println("汪汪"); } @Override public String eat() { return "狗吃骨头"; } }
-
/** * 动物猫的食物与叫声 */ public class Dog extends Animal { @Override public void cry() { System.out.println("喵喵~"); } @Override public String eat() { return "猫吃鱼"; } }
-
/** * 动物模拟器 */ public void play(Animal animal) { System.out.print(animal.eat()); animal.cry(); } }
-
/** * 动物模拟器 */ public class Mains { public static void main(String[] args) { Moni moni = new Moni(); moni.play(new Dog()); moni.play(new Cat()); } }
- 結果:
(3)抽象クラスの意味
-
1.共通の属性と動作メソッドを封印し、抽象修飾子を追加してクラスに格納し、属性をプライベート化し、動作を公開します。-----------コードの再利用
-
2.すべての派生クラス(サブクラス)に統一されたタイプを提供します----------上向きのモデリング。
public class Mains { public static void main(String[] args) { Moni moni = new Moni(); Animal a = new Dog(2);//向上造型 moni.play(new Dog(7)); moni.play(new Cat(6)); a.cry(); a.getAge(); } } //结果显示: 狗吃骨头汪汪~,今年7岁 猫吃小鱼喵喵~,今年6岁 汪汪~,今年2岁
-
3.すべての派生クラスに統一された入り口を提供するための抽象的なメソッドを含めることができます。派生クラスの動作は異なりますが、入り口は同じです
-
上図の動物属性(年齢)は私有化され、年齢が動物に出力されます。
2、内部クラス
(1)メンバー内部クラス
- 応募率は低いですが、ご理解ください。
- 外側のクラスは外側の外側のクラスと呼ばれ、内側の内側のクラスは内側の内側のクラスと呼ばれます。
- 通常、内部クラスは外部クラスにのみサービスを提供し、外部からの可視性はありません。
- 内部クラスオブジェクトは通常、外部クラスで作成されます。
- 外部クラス(プライベートを含む)に直接アクセスできる内部クラスのメンバーは、
それを作成した外部クラスオブジェクトへの暗黙の参照を持っています。
例えば:外部クラス名.this。 - 静的メソッドと静的変数は、内部クラスの本体で宣言することはできません。
//成员内部类的演示
public class InnerClassDemo {
public static void main(String[] args) {
A w1 = new A();
//a w2 = new a(); //内部类对外不具备可见性
}
}
class A{
//外部类
int i = 0;
private String name;
a w3 = new a();
class a{
//内部类
int j = 0;
void showname() {
System.out.println(name);
System.out.println(A.this.name);
System.out.println(this.j); //this指的是a对象
}
}
}
(2)匿名の内部クラス
- 1)クラス(派生クラス)のオブジェクトを作成する場合、オブジェクトが1回だけ作成される場合、
クラスに名前を付ける必要はなく、匿名内部クラスと呼ばれます。 - 2)匿名の内部クラスの外部変数にアクセスする場合
、変数はfinalである必要があります(JDK1.8より前に必要、1.8は不要)
//匿名内部类的演示
public class NstInnerClassDemo {
public static void main(String[] args) {
//1)创建了Aoo的一个派生类,但是没有名字
//2)创建了该派生类的一个对象,名为o1
//3)大括号中的为派生类的类体
Aoo o1 = new Aoo() {
};
//1)创建了Aoo的一个派生类,但是没有名字
//2)创建了该派生类的一个对象,名为o2
//3)大括号中的为派生类的类体
Aoo o2 = new Aoo() {
};
int num = 5;
//1)创建了Boo的一个派生类,但是没有名字
//2)创建了该派生类的一个对象,名为o3
//3)大括号中的为派生类的类体
Boo o3 = new Boo() {
void show() {
System.out.println("showshow");
System.out.println(num); //JDK1.8之前,要求num必须是final的
}
};
o3.show();
}
}
abstract class Boo{
abstract void show();
}
abstract class Aoo{
}
ヒント:クラスが抽象クラスまたはインターフェイスである限り、サブクラスのメソッドは匿名の内部クラスを使用して実装できます(たとえば、マルチスレッドを実装するには、Threadクラスを継承するか、Runnableインターフェイスを継承する必要があります)
フォローアップの内容をお待ちください。すぐに来てください!書くのは簡単ではありません。3Q親指を立てて
くださいエラーがある場合はコメントしてください
すべての章のカタログはここにある:https://blog.csdn.net/qq_41254299/article/details/106638651
再印刷のためのソースを記入してください:https://blog.csdn.net/qq_41254299
この記事はからである[Superclover_のブログ]