Javaの研究ノートに考えて
pikzas
2019年7月31日
第IX章インターフェース
知識ポイント
抽象クラスとメソッド1.要約
1.1。抽象クラスをするように設計されて
マルチステートプロセスを達成するために抽象クラスの主な機能は、オブジェクトの親のインスタンスを作成したエラーを回避し、構文のサポートを提供します。
標準的な慣行では、多型、親はサブクラスだけのテンプレートを提供し、サブクラスは、特定の実装を提供します。通常の状況下では、親クラスが親クラスのオブジェクトを作成することは無意味で、クラスです。彼は、実装の方法を指定しませんでした。
1.2抽象メソッドとは何ですか
抽象ボイドF();のみ、そのメソッドを宣言していないが。
1.3抽象クラスとは何ですか
そこには、クラス、抽象クラス、抽象クラスの前に変更されています
1.4特長抽象クラス
- 直接抽象クラスをインスタンス化することはできません、サブクラスは、上方の形質転換によって得られなければなりません
- クラスは抽象クラスの必須として一つ以上の抽象メソッド、そしてクラスが含まれている場合
- クラスは抽象クラス、(従来の方法の任意の数を有することができる)ないかもしれない抽象メソッドである場合
- 抽象メソッド修飾子はプライベートではありません、その禁止が上書き設計されており、抽象クラスはに反しています
- 抽象クラスは、同じ一般的なカテゴリの属性と使用属性を定義することができます。
- あなたは親クラスのすべての抽象メソッドを実装する場合、サブクラスは、抽象クラスを継承していますので、彼は一般的なカテゴリ(もまだ抽象クラスとして宣言され、新しい抽象メソッドも追加することができます)を宣言することができ、それはまた、として宣言することができます抽象クラスが、抽象メソッドが完全に実装されていないが存在する場合、クラスも抽象クラスでなければなりません。
2.インタフェース
インタフェースは、抽象メソッドの極端な形で、すべてのメソッドは、抽象項あります
2.1。設計されたインターフェース
より簡単に多型を達成するために離れて、単一継承よりJAVAブレーク制限は、暗黙的な多重継承を達成するために、(内部)
2.2。インターフェースは何ですか
代わりに、クラスキーワードのインターフェイスキーワード特性を有することができるカテゴリを示すと、(メソッド名をパラメータと戻り値のリストを決定するために提供される)のみ抽象メソッドを持つことができるではなく、任意の実装に。
2.3インターフェイス機能
- インターフェース修飾子修飾子に基づく公開し、デフォルトとすることができ、効果は同じ一般的なカテゴリです。
- デフォルトのインターフェイスは、それが直接インタフェースポイントの属性で使用することができますので、あなたがプロパティに変更を加えることができない、のpublic static final属性です。そして、あなたはコンパイルエラーを促すメッセージが表示されます、プライベートの保護またはデフォルトアクセス修飾子を追加することはできません。
- デフォルトのインターフェイスメソッドは、パブリック抽象的で、公共abstract修飾子は、デフォルトで書いていない、あなたは、これらのプライベート保護のデフォルトのモディファイアを追加することはできません。
3.JAVAで多重継承
JAVAクラスは、単一のエンティティから継承することができ、またはクラスは抽象クラスであるが、より多くの複数のインターフェイスを実装することができます。
public class Actor {
public void fight(){
System.out.println("do nothing");
};
}
public interface CanFight {
void fight();
}
public interface CanFly {
void fly();
}
public interface CanSwim {
void swim();
}
public class ActActor extends Actor implements CanFight,CanFly,CanSwim {
@Override
public void fly() {
}
@Override
public void swim() {
}
}
public class Test {
public static void a(Actor actor) {
actor.fight();
}
public static void b(CanFight canFight) {
canFight.fight();
}
public static void c(CanFly canFly) {
canFly.fly();
}
public static void d(CanSwim canSwim ) {
canSwim.swim();
}
public static void main(String[] args) {
ActActor actActor = new ActActor();
a(actActor);
b(actActor);
c(actActor);
d(actActor);
}
}
Actorクラスが達成されているので、()メソッドはしませんでしたActActorに実装され、上記の例(注)の戦いでは、これは
戦いが続いActActorない、Actorクラス()メソッドは、非公開に変更されましたCanFightと等価になる場合戦い()メソッドは、コンパイルエラーを達成するために行います。
Actorクラスは、()メソッドを戦うませんが、俳優のクラスは人間のクラスが戦うた人間、()メソッドを継承する場合、その時間も可能です。
ここでの例では、2つのインターフェイスの有用性を示します
- サブクラスは、より柔軟な、異なる基本クラスにコードをアップキャストすることができ
- インタフェースは、コンパイラは、不正使用を防ぐことができ、インスタンス化することはできません。
4.インターフェイスとインターフェイス、クラスとのインターフェースとの間の関係
クラスがインターフェイスを実装することができ、インタフェースが継承することができ、多重継承インターフェースにインターフェースすることができます
public interface Monster {
void menace();
}
/**
* 接口之间用继承
*/
public interface DangerousMonster extends Monster {
void destory();
}
public interface Lethal {
void kill();
}
/**
* 接口可以多继承接口,只要用逗号隔开就行。
*/
public interface Vampire extends DangerousMonster,Lethal {
void drinkBlood();
}
public class VeryBadVampire implements Vampire {
@Override
public void drinkBlood() {
}
@Override
public void destory() {
}
@Override
public void kill() {
}
@Override
public void menace() {
}
}
5.名前の衝突が発生することができるインターフェースの組み合わせを
クラスの親とのインタフェースの実装クラスは、もはや方法を行うことができ、同様の方法を持っている場合ことを思い出してください。
過負荷を生じる、同じ方法を有しており、複数のインタフェースを同時にカバーする場合は、この時間は、エラーが発生するかもしれません。
public interface InterfaceA {
void f();
}
public class Father {
public int f(){}
}
/**
* 如下写法的子类会提示编译错误,因为方法必须override,但是又会与父类的方法冲突(同名,同参数列表,就返回值不同,不是overload,所以会提示编译错误)
*/
public class Son extends Father implements InterfaceA {
}
前記インターフェースは、パブリック静的最終的なデフォルト属性(NO含むが、具体的には、デフォルトです)
界面特性は、基本データ型である場合、それらは資本を持っている、コンパイラ定数であり、代替の使用を列挙するために使用することができ
、最終的に定義されたドメインのインターフェイスを空ではないが、定数式を初期化することができる
これらの特性をインタフェースにおけるそれらの値を格納するためのインターフェース、静的記憶領域の一部ではありません
import java.util.Random;
public interface RandVals {
Random RAND = new Random(47);
int RANDOM_INT = RAND.nextInt(10);
long RANDOM_LONG = RAND.nextLong() * 10;
}
7.ネストされたインターフェース
クラスまたはインタフェースが他のインタフェース内にネストされてもよいです
- 公共、パッケージへのアクセス、より多くの民間へのアクセスに加えて、クラス内でネストインタフェース、
public class OuterClass {
//1.类内部接口可以是包访问权限
interface B{
void f();
}
//1.1. 对应的实现类可以是public的
public class BImpl implements B{
public void f(){}
}
//1.2. 对应的实现类可以是private的
private class BImpl2 implements B{
public void f(){}
}
//1.3. 对应的实现类可以是默认访问权限的
class BImpl3 implements B{
public void f() {
}
}
//2. 类内部接口可以是包访问权限
public interface C{
void f();
}
//2.1. 对应的实现类可以是public的
public class CImpl implements C{
public void f(){}
}
//2.2. 对应的实现类可以是private的
private class CImpl2 implements C{
public void f(){}
}
//2.3. 对应的实现类可以是默认访问权限的
class CImpl3 implements C{
public void f() {}
}
//2. 类内部接口可以是private的
private interface D{
void f();
}
//2.1. 对应的实现类可以是public的
public class DImpl implements D{
public void f(){}
}
//2.2. 对应的实现类可以是private的
private class DImpl2 implements D{
public void f(){}
}
//2.3. 对应的实现类可以是默认访问权限的
class DImpl3 implements D{
public void f() {}
}
}