интерфейс
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();
}
}
Интерфейс может быть отделен:
Любой интерфейс имеет вызывающего и реализующего. Интерфейс может разъединить
вызывающего и реализующего. Вызывающий записывает вызов для интерфейса, а реализующий записывает реализацию для интерфейса.
Разработка больших проектов обычно разделяет проект на модуль. Для модулей
интерфейс между модулями и модулями принят, чтобы уменьшить степень связи.