インターフェース
1.インターフェースは参照データ型
2.インターフェースは完全に抽象的(抽象クラスは半抽象的)であるか、またはインターフェースが特別な抽象クラスであると言える
3.インターフェースの構文:[修飾子リスト]インターフェースインターフェース名{}
4.インターフェースクラスとインタフェースとの間の支持多重継承とのインタフェースとの間
のインタフェースのみ定数及び抽象メソッドが含まれている5、コンストラクタが存在しない
6 インターフェース要素が変更公共の全てさ
7 の抽象メソッドはインターフェースで定義されている:public abstract
修飾します演算子は省略できます
- インターフェースで定数を定義する場合:
public static final
修飾子は省略できます - コンパイラのコンパイル時に自動的に追加されます
インターフェースの基本的な使い方
1.クラスとクラスは継承と呼ばれ、クラスとインターフェースは実装と呼ばれます(「実装」は「継承」と理解できます)
- 継承は
extends
キーワードで行われます - 実装は
implements
キーワード
2 を使用して行われます。非抽象クラスがインターフェースを実装する場合、インターフェース内のすべての抽象メソッドを実装する必要があります(オーバーライド)
interface MyMaths{
//这里要知道常量和方法都是省略了关键字的
double PI = 3.14;
int sum(int a ,int b);
int sub(int a, int b);
}
class MyMathsImpl implements MyMaths{
//方法覆盖(这里通常叫做实现)
public int sum(int a, int b){
return a + b;
}
public int sub(int a, int b){
return a - b;
}
}
public class InterfaceTest{
public static void main(String[] args){
//多态
MyMaths m = new MyMathsImpl();
int a = m.sum(1, 2);
System.out.println(a);
}
}
クラスは複数のインターフェースを実装(継承)できますか?
はい、このメカニズムはJavaクラスを構成し、クラスは単一継承のみをサポートします。
interface A{
void m1();
}
interface B{
void m2();
}
interface C{
void m3();
}
class D implements A,B,C{
public void m1(){
System.out.println("m1...");
}
public void m2(){
System.out.println("m2...");
}
public void m3(){
System.out.println("m3...");
}
}
public class InterfaceTest{
public static void main(String[] args){
//多态
//父类型引用指向子类型对象
A a = new D();
B b = new D();
C c = new D();
//接口之间没有继承关系,是否可以强制类型转换(接口转型)
//属于骚操作,明明没有继承关系,还能转型,现阶段还是不要去记它,用处不大
B b1 = (B)a;
b1.m2();
//如果想让a调用m2方法,还是直接向下转换成D即可
D d = (D)a;
d.m2();
}
}
上向きまたは下向きの変換に関係なく、2つのタイプの間には継承関係が必要です。継承関係がないと、コンパイラーはエラーを報告しますが、この文はインターフェースには適用されません。
親型参照でサブタイプ固有のメソッドを呼び出す場合は、親型参照をサブタイプオブジェクトに変換する構文を使用することをお勧めします。
継承のないインターフェース間の遷移
interface K{
}
interface M{
}
class E implements M{
}
public class InterfaceTest{
public static void main(String[] args){
M m = new E();
K k = (K)m;
}
}
インターフェースとインターフェースの間に継承関係はなく、継承関係もありません。型変換を強制することもできます。コンパイラはエラーを報告しません
が、実行時にClassCastExceptionが発生する可能性があることに注意してください。
継承と実装の両方が存在する場合、コードはどのように記述する必要がありますか?
道具の前で後ろに伸びる
class Animal{
}
//可飞翔的接口,接口通常提取的是行为动作
interface Flyable{
void fly();
}
class Cat extends Animal implements Flyable{
public void fly(){
System.out.println("飞翔的小猫");
}
}
//如果不想让它飞,可以不实现Flyable的接口
class Snake extends Animal{
}
//想飞就插入Flyable接口
class Pig extends Animal implements Flyable{
public void fly(){
System.out.println("飞翔的小猪");
}
}
public class Test{
public static void main(String[] args){
//多态
Flyable f = new Cat();
f.fly();
Flyable f1 = new Pig();
f1.fly();
}
}
この例は、インターフェースの「プラグイン可能な」機能を具体化します。これにより、分離するプログラム間の相関関係が減少します。
開発におけるインターフェースの役割
- インターフェースは完全に抽象的です
- 抽象指向プログラミングは、次のように変更されています。
- インターフェースにより、プラグイン可能です。プラグイン可能とは、拡張力が非常に強く、溶接されていないことを意味します
- マザーボードとメモリに直接スロットがあります。このスロットにはインターフェイスがあります。メモリモジュールが壊れている場合は交換できます。これは高スケーラビリティ(低カップリング)と呼ばれます
文を要約するには:
OCPの原則に沿って、プログラムの結合度を下げ、プログラムの拡張力を提供できるインターフェース指向プログラミングインターフェース
の使用は、ポリモーフィックメカニズムと切り離せません
//接口 -菜单
public interface FoodMeau {
public void shihongshi();
public void rousi();
}
//接口的实现
//西餐师傅
//厨师是接口的实现者
public class AmericanCooker implements FoodMeau{
public void shihongshi(){
System.out.println("西餐师傅做的西红柿炒蛋");
}
public void rousi(){
System.out.println("西餐师傅做的鱼香肉丝");
}
}
//中餐厨师
public class ChineseCooker implements FoodMeau{
public void shihongshi(){
System.out.println("中餐师傅做的西红柿炒蛋,超好吃的");
}
public void rousi(){
System.out.println("中餐师傅做的鱼香肉丝,超好吃的");
}
}
//接口的调用者 -顾客
public class Customer {
//顾客手里有一个菜单
//Customer has a FoodMenu
//记住:以后凡是能够使用 has a 来描述的,统一以属性的方式存在
//回顾:凡是能用 is a来描述的,都可以设置为继承
private FoodMeau foodMeau;
//Constructor
public Customer() {
}
public Customer(FoodMeau foodMeau) {
this.foodMeau = foodMeau;
}
//setting and getter
public FoodMeau getFoodMeau() {
return foodMeau;
}
public void setFoodMeau(FoodMeau foodMeau) {
this.foodMeau = foodMeau;
}
//提供点菜的方法
public void order(){
FoodMeau f = getFoodMeau();
f.shihongshi();
f.rousi();
}
}
public class Test {
public static void main(String[] args) {
//建立厨师对象
FoodMeau cooker1 = new ChineseCooker();
FoodMeau cooker2 = new AmericanCooker();
//建立顾客对象
Customer c = new Customer(cooker1);
//顾客点菜
c.order();
//如果想要点西餐
c.setFoodMeau(cooker2);
c.order();
}
}
インターフェースは分離することができます:
どのインターフェースにも呼び出し元と実装元があります。インターフェースは、呼び出し元と実装元を分離できます。呼び出し元はインターフェースの呼び出しを記述し、実装
者はインターフェースの実装を記述します。
大規模なプロジェクトの開発では、通常、プロジェクトをモジュールに分割します。モジュールの場合、
モジュールとモジュール間のインターフェースを採用して、結合度を下げます。