java:接口

张开发
2026/4/14 10:41:19 15 分钟阅读

分享文章

java:接口
一概述1.1接口是什么父类对子类共性的抽取接口对象的行为标准规范也可以说是某种功能特性我们知道继承普通类和继承抽象类的存在继承本质上就是实现对共性的抽取同时实现代码的复用通过对现实事物抽象成为一个类类内包含这一类事物的属性和行为继承的存在就是将这一类事物的共同属性和行为抽取出来当我们在定义属于这一类事物的类时可以直接继承使用而抽象类的出现是因为父类提供的信息不足以描述一个具体的类因此将父类定义为抽象类间接加上了一层校验防止在代码中不小心使用父类创建并使用父类对象。但是继承也有缺点继承是对共性的抽取不同的对象虽然同属一个类但各自都会有不同的个性。1.2接口的定义访问修饰符 class 类名访问修饰符 interface 接口名二特点2.1接口的成员变量接口的成员属性默认是被 public static final修饰的主要就是意味着成员变量在接口中定义的成员属性默认是静态常量。1、当接口的变量被private protected访问修饰符修饰时编译器直接爆红2在实现类中成员变量只能被调用不可以被修改.3、当变量只被pulic修饰的时候在实现类当中也不可以对其进行修改4、当变量被public static final修饰时三个关键字都是灰色的说明变量是默认被这三个关键字修饰的因此这三个关键字可以不用编写编译器会自动加上的2.2接口的成员方法接口的成员方法默认是被public abstract修饰的也就是说不可以有具体的实现内容这也就意味着接口中的成员方法默认是抽象方法。如图 love()有{}代表有具体的实现但是不符合抽象方法的语法编译器直接爆红方法fly ()后直接引号结尾符合抽象方法的语法。我们可以看出编译器的默认方法修饰符是public abstract ,也就是说在接口当中不可以有普通方法的实现一旦实现编译器直接爆红但是一定要实现普通方法也不是不可以只需要将普通方法修饰成为静态方法即可public static void love{}或者是让当前方法被default修饰。2.3接口中不可含有代码块和构造函数因此在接口中定义的属性都只能够通过就地初始化进行初始化无法通过构造器进行初始化2.4、接口不可以实例化对象接口和抽象类一样都是引用型数据类型但都不可以通过关键字new进行实例化对象的本质上两者提供的信息都不足以描述一个具体的对象就没有必要实例化对象如果误把抽象类或者接口进行实例化对象并使用了那么编译器会直接爆红提示错误因此接口也含有和抽象类一样的校验功能。2.5、接口和类之间使用implements关键字进行连接接口和抽象类一样里面都包含有抽象方法这也就意味着当类实现了接口后需要重写接口里面全部的抽象方法2.6、当类在重写接口中的方法时不可以使用默认的访问权限重写的规则为 1、方法名返回类型参数列表要一致 2、重写必须要在继承机制下 3、重写方法的访问权限必须要大于等于被重写方法的访问权限在接口中的方法默认是被public abstract修饰的那么类当中重写方法的访问权限就必须只能是public。2.7、接口虽然不是类但是接口通过编译了之后也会生成class文件2.9、如果类没有实现接口当中的全部抽象方法那么该类必须要设置为抽象类如果类当中没有实现接口中的全部抽象方法时编译器会爆红直到全部实现之后才不会爆红因此和抽象类一样继承抽象类和实现接口的类只有两种选择要么老老实实全部实现要么就将当前类设置为抽象类。抽象类存在的意义就是为了被继承也就是说即便设、置为抽象类了该抽象类后面也是会被继承的那么还是逃不过实现抽象方法的结果2.10类支持实现多个接口在Java中类不支持多继承类与类之间是单继承一个类只能有一个父类但是在Java中一个类可以实现多个接口。这样就可以解决多继承的问题了java里面不支持c支持class Duck extends Animal implements iRun,iFly{public Duck(String name){super(name);}Overridepublic void fly() {System.out.println(name飞起来);}Overridepublic void run() {System.out.println(name跑着);}}三应用3.1实现多个接口在func方法内部方法不关心传递过来的对象是什么对象方法内部只关心该对象是否有实现当前接口然后当前对象实现了接口那么成功编译如果没有实现当前接口那么编译报错。//接口跑public interface Irun {void run();}//接口游public interface Iswin {void swin();}//接口飞public interface Ifly {void fly();}//接口两栖public interface Isecdwe extends Iswin,Irun{}//接口三栖public interface ITiHabitat extends Irun,Iswin,Ifly{}接口与接口之间可以进行继承多继承//动物类public abstract class Animal {protected String name;protected int age ;public abstract void eat();public Animal(String name, int age) {this.name name;this.age age;}}//狗类public class Dog extends Animal implements Isecdwe{public Dog(String name, int age) {super(name, age);}Overridepublic void eat() {System.out.println(name 在吃狗粮....);}Overridepublic void run() {System.out.println(name 在跑....);}Overridepublic void swin() {System.out.println(name 在游....);}}下面是实现多个接口的调用//MAin类public class Main {public static void funcrun(Irun irun) {irun.run();}public static void funcfly(Ifly ifly) {ifly.fly();}public static void funcsein(Iswin iswin) {iswin.swin();}public static void funcer(Isecdwe isecdwe) {isecdwe.run();isecdwe.swin();}public static void functih(ITiHabitat iTiHabitat) {iTiHabitat.fly();iTiHabitat.run();iTiHabitat.swin();}public static void main(String[] args) {Dog dog new Dog(狗,5);bird birdi new bird(鸟,5);Duck duck new Duck(鸭子,5);}}我们可以看出来方法的参数是接口类型的但是实际上意味着只要你这个类实现了这个接口你就可以进去调用这个方法否则编译报错不是所有的动物都会飞会游这些行为不是动物的共性因此无法将这些行为定义到父类当中最优解就是将这些非共有行为设置为接口只要是符合接口定义的行为规范准则的动物都可以实现接口此时就解决了非共性问题。可以简单理解为父类是共有特性接口是独有特性Java面向对象编程中最常见的用法一个类继承一个父类同时实现多个接口。这样设计有什么好处呢可以让程序员忘记类型有了接口之后类的使用者就不需要再关心具体类型只需要关心当前类是否有实现某个接口具备某种能力。在func方法中参数列表设置为接口类型则该方法就不需要关注传递过来的对象是否是动物只要该对象的类型实现了该接口就可以使用该方法也就是说重新定义一个机器人类只要机器人类实现了该接口则机器人类就可以调用该方法。

更多文章