Java-интерфейс Notes-интерфейс

интерфейс

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();
	}
}

Независимо от восходящего или нисходящего преобразования между двумя типами должны существовать отношения наследования. Без отношения наследования компилятор сообщит об ошибке, но это предложение не относится к интерфейсу.
Если вы хотите, чтобы ссылка родительского типа вызывала метод, специфичный для подтипа, лучше использовать синтаксис преобразования ссылки родительского типа в объект подтипа.

Переход между интерфейсами без наследования
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();
    }
}

Интерфейс может быть отделен:

Любой интерфейс имеет вызывающего и реализующего. Интерфейс может разъединить
вызывающего и реализующего. Вызывающий записывает вызов для интерфейса, а реализующий записывает реализацию для интерфейса.
Разработка больших проектов обычно разделяет проект на модуль. Для модулей
интерфейс между модулями и модулями принят, чтобы уменьшить степень связи.

рекомендация

отwww.cnblogs.com/zy200128/p/12726663.html