[15]接口

[15]接口当抽象类中的方法全是抽象时 可用接口 interface 来表示 接口中的成员 1 定义变量 但是变量必须由固定的修饰符修饰 public static final 所以接口中的变量也称常量 2 定义方法 public abstract 如果缺少编译器会自动加上

大家好,我是讯享网,很高兴认识大家。

当抽象类中的方法全是抽象时,可用接口interface来表示

接口中的成员:
1.定义变量,但是变量必须由固定的修饰符修饰,public static final所以接口中的变量也称常量
2.定义方法,public abstract(如果缺少编译器会自动加上)
接口中的成员全是public

接口的特点:
1.接口不可以创建对象
2.子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化
继承表示Sub...
接口表示...Imps

类与类之间的关系是继承(is a),类与接口之间的关系是实现(like a)。实现接口通过implements

那么从以上我们可以看出,用接口来完成的,抽象类也可以完成。那为什么还要用接口呢?

【接口中最重要的体现】

解决多继承的弊端:多继承时,当多个父类有相同功能时,子类调用会产生不确定性
多继承时父类中功能有主体,调用时不确定运行哪个主体内容
接口中的方法没有方法体,由子类来明确

 

class A{ public void show(){} } class B extends A{ public void show(){} } class C extends B{ public static void main(String[] args){ C c=new C(); c.show();//此时产生了不确定因素。一般调用近的那个 } }

讯享网

而接口

讯享网interface A{ public abstract void show(); } interface B{ public abstract void show(); } class C implements A,B{ public void show(){} public static void main(String[] args){ C c=new C(); c.show();//此时方法体内容子类来确定 } }

接口避免了单继承的局限性。

继承定义了事物的基本功能。(父类有的功能,子类继承后,就会有父类的功能)

接口定义了事物的扩展功能。

class Phone{ public void call(){ System.out.println("打电话"); } } interface PlayGameImpl{ public abstract void play(); } interface class SmartPhone extends Phone implements PlayGameImpl{ public void call(){ super.call(); } public void play(){ System.out.println("玩游戏"); } }

接口支持多继承

讯享网interface A{ public abstract void show1(); } interface B{ pubic abstract void show2(); } /* 接口也可继承多个接口 */ interface C extends B,A{ public abstract void show3(); } class Inter implements C{ public void show1(){} public void show2(){} public void show3(){} public static void main(String[] args){ Inter i=new Inter(); i.show1(); i.show2(); i.show3(); } }

抽象类中能否拥有抽象方法?是可以有的。

仅不让实例化。 

interface AImpl{ public abstract void show1(); public abstract void show2(); public abstract void show3(); public abstract void show4(); } /* 如果这里直接实现此接口,那么如果Inter类只需要一个show1(),就要也把所有的方法重写一遍,复用性差 所以需要一个类先实现接口。 */ /* 这个类可以被实例化,但是这个类没有实例化的意义,虽说有方法体,但是方法体是空的。和抽象方法类 似,所以为了不被实例化,用abstract来表示。private这个类虽然也可以,不被实例化,但是无法继 承从而重写方法。 */ abstract class SubA{ public void show1(){} public void show2(){} public void show3(){} public void show4(){} } class Inter extends SubA /*implements Aimpl*/{ public static void main(Srting[] args){ /* public void show1(){ System.out.println("show1 run"); } public void show1(){} public void show1(){} public void show1(){} } */ //接下来我们只要继承这个没有抽象方法的类 public void show1(){ System.out.println("show1 run"); } }

接口和抽象类的区别:

机器狗是狗的一种。是is a关系,狗抽象,但是机器狗可以具体。所以机器狗继承于抽象类狗

而发光,是机器狗特有的功能。狗并不具备。很多东西都可以发光,比如机器猫(不是动漫的那种,动漫的那种貌似也可以好像,emmmmm偏题了)。


讯享网

比如机器猫和机器狗都会发光,但和发光并不是is a关系。当然你可以这么写,编译器会通过。但是还要继承充电功能?和设计思路上不符合。

发光和充电是机器狗的扩展功能。用接口实现

讯享网interface ShineImpl{ public abstract void shine(); } interface ChargeImpl{ public abstract void charge(); } abstract class Dog{ public abstract void shout(); public abstract void eat(); } class EDog extends Dog implements ShineImpl{ public void shout(){ System.out.println("汪汪"); } public void eat(){ System.out.println("用嘴吃"); } public void shine(){ System.out.println("闪光"); } public void charge(){ System.out.println("充电"); } } class Demo{ EDog edog=new EDog(); edog.shout(); edog.eat(); edog.shine(); }

再举个例子:

//需求:会多门语言 public abstract class Person{ private String name; public Person(String name){ this.name=name; } public abstract void speak(); } /* public interface LanguageImpl{ public abstract void speakCN(); public abstract void speakEN(); public abstract void speakJE(); } public abstract class SubLanguage implements LanguageImpl{ public void speakCN(){ System.out.println("说中文"); } public void speakEN(){ System.out.println("说英文"); } public void speakJE(){ System.out.println("说日语"); } } */ interface EnglishImpl{ public abstract void speakEN(){ System.out.println("说英文"); } } interface ChineImpl{ public abstract void speakCN(){ System.out.println("说中文"); } interface JapanaseImpl{ public abstract void speakJE(){ System.out.println("说日语"); } } //中国人只会说中文吗?我们还可以学英语,日语,韩语等等。继承?办不到抽象类?可以 //但是你每次会说英文,就必须会所有其他的语言。每个人都是神童?所以用接口实现 //可以通过接口引变抽象类或是写三个接口 public class Chinese extends Person implements EnglishImpl,ChineImpl{ public Chinese(String name){ super(name); } public void speak(){ System.out.println("说话"); } public void speakEN(){ System.out.println("说英文"); } public void speakCN(){ System.out.println("说中文"); } } public Demo{ public static void main(String[] args){ Chinese c=new Chinese("lgb"); c.speakCN(); c.speakEN(); } }

 

 

小讯
上一篇 2025-01-18 23:04
下一篇 2025-01-25 15:07

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/19887.html