抽象クラス
抽象クラスとは何ですか?
抽象クラスは実際には親クラスです。抽象クラスは、すべてのサブクラスが共有する必要のある形式を定義しますが、実装されていません。代わりに、各サブクラスは、独自のパーソナライズされた機能、つまりパーソナライズされたカスタマイズを実現します。
では、インターフェースとは何ですか?
この抽象クラスと言えば。また、実装可能でサブクラスに継承できるメソッドもいくつかありますが、インターフェイスにはサブクラスに継承できるメソッド実装がなく、すべて定義済みのメソッドです。
では、インターフェースの用途は何ですか?継承または使用できませんか?
実生活では、多くのテレビシリーズや映画は、リリースされると多くのショットを失います。なぜですか?これは、国家広播電影局が基準を定めているためです。たとえば、服の襟をそれより低くしたり、画面を血まみれにしたり、暴力を振るったりすることはできません。基準を下げる責任はありません。映画を作る人はこの基準を達成する責任がなければなりません。したがって、これは実際の基準と実装の関係です。実際、インターフェースはプログラムの基準です。
1つは、抽象クラス、インターフェイス、および内部クラスです。
抽象クラスと抽象メソッド
●抽象クラスとは、特定の実装詳細の親クラスを定義せずに、すべてのサブクラスで共有されるフォームのみを定義することです。
(親クラスは実際にはサブクラスの達成を支援する方法を知りませんが、これらの関数は必要なので、サブクラスを自立に依存して定義を与える必要がありました。抽象クラスをいつ使用するのですか?将来、親クラスの一部の関数がサブクラスの実装に役立たない限り、親クラスは抽象クラスとして定義されます)
●構文:パブリック抽象クラスクラス名...
●抽象クラスでは、メソッド定義のみがあり、実装の詳細がないメソッドは抽象メソッドと呼ばれます。
●構文:[アクセス修飾子]抽象戻り値タイプメソッド名(;
● class抽象メソッドが含まれている場合、そのクラスはabstractキーワードを使用して抽象クラスとして宣言する必要があります。
●クラスが抽象クラスを継承する場合、その抽象メソッドを書き直す必要があります(クラスも抽象クラスとして宣言されている場合を除く)。サブクラスは異なる場合があります実現。
話を聞いて抽象を学ぶ
package day08;
/**
* 封装父亲属性和功能的类
* 因为内部包含抽象方法所以也要定义为抽象类
*/
public abstract class Father {
/**
* 父亲养育儿女的方法
* 儿女可以无条件继承
* @return 养育的结果
*/
public String raise(){
return "学业有成,成家立业";
}
/**
* 父亲请求子女帮忙偿还债务
* 也就是说,父亲自己无法完成
* @return 每个子女负担债务
*/
public abstract double pay();
}
長男のクラスをカプセル化する
package day08;
/**
* 封装大儿子的类
*/
public class Child1 extends Father{
//编译错误:因为只要继承了抽象类,就必须重写父类的抽象方法!
// 解决: 鼠标方法在错误上,选择add unimplemented method
@Override
public double pay() {
return 10;//大儿子给10万
}
}
次男クラスをカプセル化する
package day08;
/**
* 封装二儿子的类
*/
public class Child2 extends Father{
@Override
public double pay() {
return 25;//二儿子给25万
}
}
末っ子のクラスをカプセル化する
package day08;
/**
* 封装小儿子的类
*/
public class Child3 extends Father{
@Override
public double pay() {
return 7.5;//小儿子给7.5万
}
}
少女のクラスをカプセル化する
package day08;
/**
* 封装小女儿的类
*/
public class Child4 extends Father{
@Override
public double pay() {
return 5;//小女儿给5万
}
}
テストカテゴリ:
覚えておいてください!抽象クラスはインスタンス化できません
package day08;
public class Test {
public static void main(String[] args) {
//Father f=new Father(); 编译错误:切记!抽象类不能实例化
//因为抽象类都是不完整的!
//要想使用抽象类中的普通方法,只能通过子类对象继承后调用
//父亲抚养4个孩子成人
Child1 c1=new Child1();
Child2 c2=new Child2();
Child3 c3=new Child3();
Child4 c4=new Child4();
System.out.println("大儿子"+c1.raise());
System.out.println("二儿子"+c2.raise());
System.out.println("小儿子"+c3.raise());
System.out.println("小女儿"+c4.raise());
//结论:子类可以继承抽象类中的已实现方法和继承普通父类完全一样。
}
}
結論:サブクラスは抽象クラスに実装されたメソッドを継承でき、通常の親クラスとまったく同じです。
事例:父親が4人の子供を一緒に呼んだ
package day08;
public class Test {
public static void main(String[] args) {
Child1 c1=new Child1();
Child2 c2=new Child2();
Child3 c3=new Child3();
Child4 c4=new Child4();
System.out.println("大儿子"+c1.raise());
System.out.println("二儿子"+c2.raise());
System.out.println("小儿子"+c3.raise());
System.out.println("小女儿"+c4.raise());
//结论:子类可以继承抽象类中的已实现方法和继承普通父类完全一样。
//父亲将4个儿女叫到一起
//程序中,集中保存东西,都是使用数组
//问题1:4个儿女对象,数据类型不相同,怎么放到同一个数组中呢?
//解决:父类型的引用,可以指向任何子类的对象
//完全可以将数组元素的类型,统一定义为父类型
Father[] children={
c1,c2,c3,c4};
System.out.println("大儿子 | 二儿子 | 三儿子 | 小女儿");
//因为每个孩子都帮父亲实现了pay方法。可以循环调用每一个孩子的pay方法
for (int i = 0; i < children.length; i++) {
//问题2:children中每个元素是什么类型?凭什么可以调用子类实现的pay方法?
//原因:children中的每一个元素都是Father父类
//子类都重写了父类抽象方法pay,所以父类型的引用,
//可以调用子类对象重写的父类方法
System.out.print(children[i].pay()+"万 ");
}
System.out.println();
System.out.println("---------分割线--------");
//父亲公布的遗产:
for (int i = 0; i < children.length; i++) {
System.out.print(children[i].pay()*5+"万 ");
}
}
}
親クラスが不完全であるため、抽象クラスをインスタンス化できません。
父father = new Father(); //コンパイルエラー
さらに、クラスに抽象メソッドがない場合でも、抽象を使用してクラスを変更することもできます。その効果は、クラスがインスタンス化されるのを防ぐことです。
抽象VS決勝:
抽象クラス:継承するために生まれます!継承がなければ意味がありません。
最終:継承を禁止するために特に使用されます!抽象クラスの意味は正反対です!
したがって:abstractとfina |はクラスを同時に変更できません
抽象クラスの重要性は次のとおりです。
-サブクラスに共通の型を提供します
-継承の意味-サブクラス内の繰り返されるメンバーを
カプセル化します(重複を避けるため)-継承の意味-抽象メソッドを定義し、サブクラスが親クラスが機能を完了するのを助ける義務があることを規定します抽象的な意味