栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java基础--接口

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java基础--接口

接口

需求:需要飞到北京出差

飞机、鸟、超人不能归于一个类属,但是具有相同的特性:会飞的。所以引入一个新概念叫做接口,可以用于规范实现接口的类中必须接口中的抽象方法。接口可以理解为一种契约

使用关键字interface定义接口

public interface 会飞的 {         public void 起飞 ();         public void 巡航飞行 ();         public void 降落 (); }

接口不能直接使用,必须有相对应的实现类

public class 飞机类 implements 会飞的 { // 共性是通过实现接口来表示的         private String name ; // 名称,这是类属的属性,这里可以定义字节类的成员,和接口无关         //如果当前类不是抽象类,则必须实现接口中的所有抽象方法         @Override         public void 起飞 () {                 System . out . println ( " 使劲的跑,一抬头就飞起来了 " );         }         @Override         public void 巡航飞行 () {                 System . out . println ( " 使劲的烧油 ..." );         }         @Override         public void 降落 () {                 System . out . println ( " 我对准 ..." );         } }

通过接口定义变量,使用具体类的实例,进行调用

会飞的 obj = new 飞机类 (); obj . 起飞 (); obj . 巡航飞行 (); obj . 降落 ();

引入接口的目的在于隔离实现

public void 出差 ( 飞机 obj ){} 这种写法当前类和飞机是耦合的,如果需要坐超人出差,则必须修改源代码 public void 出差 ( 会飞的 obj ){} 当前类只是和接口耦合,任何实现了接口的对象都可以作为参数进行传入

使用接口而不是使用具体的类,则可以实现在实现接口的多个具体实现类之间进行更换,例如定义出超人类

什么是接口

在Java中不支持多继承,因为会出现调用的不确定性,所以java将多继承机制进行改良,在java中变成了多实现。一个类可以实现多个接口,一个接口可以继承多个接口

package com.yan2;

public class Test2 {

	public static void main(String[] args) {
		A2 aa = new A2();
		aa.pp();
	}

}

interface IA2 {
	public default void pp() {
		System.out.println("IA2...pp");
	}
}

interface IB2 {
	public default void pp() {
		System.out.println("IB2...pp");
	}
}

interface IC2 extends IA2, IB2 {
	@Override
	default void pp() {
		IA2.super.pp();
	}
}

class A2 implements IA2, IB2 {
	@Override
	public void pp() {
		IA2.super.pp();
		System.out.println("A2...pp");
		IB2.super.pp();
	}
}

接口是一种特殊的抽象类,接口只能被abstract或者public修饰

没有构造器方法

没有属性,只能定义常量

可以包含抽象方法,也可以没有抽象方法

接口中的方法只能被public、default、abstract、static修饰

  • 一般情况下接口中之定义抽象方法
  • 定义的方法默认为公开的抽象方法

抽象方法必须在实现类中提供实现

可以使用default关键字给抽象方法提供默认实现,有默认实现的方法在实现类中的重新定义,也可以不重新定义

接口允许多重继承

一个类在继承另一个类的同时,还可以实现多个接口

允许一个类实现多个接口,但是每个接口的抽象方法都必须提供实现,否则是抽象类。提供的实现也可以是是继承

接口的出现避免了单继承的局限性,这样定义 C 接口则拥有 A+B 的所有定义,可以使用 A 和 B 接口以及父类D 声明变量类型,直接 new T 。但是约束时,用谁声明变量编译器系统识别就是谁这种类型,也就意味只能调用识别类型中的方法,不能调用其他方法
package com.yan4;

public class Test5 {
	public static void main(String[] args) {
		A a1 = new A();
		A a2 = new B();
		B b = new B();
		C c = new C();
		D d = new D();
		System.out.println("(1)" + a1.show(b));
		System.out.println("(2)" + a2.show(d));
		System.out.println("(3)" + b.show(c));
		System.out.println("(4)" + b.show(d));
	}
}

class A {
	public String show(C obj) {
		return ("A and C");
	}

	public String show(A obj) {
		return "A and A";
	}
}

class B extends A {
	public String show(B obj) {
		return "B and B";
	}

	public String show(A obj) {
		return "B and A";
	}
}

class C extends B {
}

class D extends B {
}
声明接口的语法

访问修饰符   interface   接口名{   }   一般建议接口名称使用形容词

如果定义 public 接口,则规则和定义 public 类一致,要求接口名称和文件名称一致 外部的接口只能使用 public 、默认这两个范围限定词;如果定义内部接口则可以使用 4 大范围限定词 接口实际上提供了同一的操作界面(方法),如果是 JDK1.8- 版本则一个方法也不实现,等待某类或某几个类去实现它的方法【接口中的所有方法必须是抽象的】。如果使用的是JDK1.8+ 允许使用default在接口中定义默认实现,这个实现允许在实现类中重新定义覆盖
接口中没有属性,只能定义常量,它提供一些常量,实现它的类可以共享这些常量 接口可以给出访问控制符,用 public 修饰的是公共接口,到处可见;如果定义接口没有范围限定词,则只能在同包中访问
接口中只能定义常量和抽象方法
接口中只能定义公共的常量,接口中的属性默认是 public static final 类型的,必须是 public static final类型的 接口中只能定义公共的抽象方法 , 只有在 JDK1.8+ 中可以使用 default 关键字定义方法实现。接口中的方法默认是public abstract 类型的,而且必须是 public abstract 类型的。只有在 JDK1.8+ 中可以使用default 关键字定义方法默认实现,同时允许在实现类中覆盖重新定义 接口不能被实例化,只能通过实现类所实现,但是可以用于声明变量的类型。         接口 变量名=new 实现接口类 () ; 接口没有构造函数 接口中的抽象方法必须在非抽象子类中提供实现,这个实现可以是继承来的
接口的特殊特征
一个类只能有一个父类! 一个类可以实现多个接口! 一个接口可以继承多个接口
接口的作用
统一访问 解耦 通过接口可以隔离具体实现 解耦就是在使用者和实现者之间没有关系。 无论实现者如何改变实现,对于使用者使用不会变化
接口和抽象类的异同点
相同点:都是不断向上抽取而来的 不同点:
  • 抽象类需要被继承,而且只能单继承
  • 接口需要被实现,而且可以多实现
抽象类中可以定义抽象方法和非抽象方法,子类继承后可以直接使用非抽象方法 接口中可以定义抽象方法和 default 方法,抽象方法必须由子类去提供实现; JDK1.8+ 中允许接口中的方法有默认实现,实现类中可以直接使用默认实现,允许覆盖定义 抽象类的继承是 is a 关系,在定义该体系的基本共性内容 接口的实现是 like a 关系,在定义体系额外功能 接口中只能定义常量,而且必须被初始化,抽象类中可以定义属性,允许在声明时直接初始化,也可以不初始化,同时允许定义常量 接口中的公共方法应该全部是抽象的, JDK1.8+ 版本中可以通过 default 关键字定义方法的默认实现,允许定义静态方法,JDK1.9 开始可以定义私有方法;抽象类中可以有抽象方法也可以有普通方法
如何使用接口
一般使用接口隔离具体实现,可以将类之间的相互依赖变为类对接口的依赖。例如出差类和会飞的东西是通过会飞的接口进行隔离,这样不管出差类需要修改或者会飞的东西需要修改,都不会相互影响 如果一组相关的类中有公共的方法和特殊的方法,可以使用抽象类,在抽象类中固化公共的方法【算法骨架】,而无需具体子类重复实现;但是在抽象类中无法实现的方法可以延迟到子类中再实现。例如排序器BubbleSorter ,其中抽象类 BubbleSorter 固化了所使用的冒泡排序算法,而将无法实现的 bigger 比较算法延迟到BubbleSorter 的子类 PigSorter 中实现,同时 PigSorter 中也不需要重新定义排序算法 最佳软件开发实践:先定义接口规范调用方法,在使用抽象类实现接口定义公共方法,最后再定义具体子类实现所有的方法
接口和抽象类的使用场景
从设计层面看,抽象类体现继承关系 is a ,它主要描述类的从属关系或者父子关系,抽象类和它的派生类之间是典型的IS-A 关系,即子 is a 父。 interface 可以多实现,而且不要求实现者和 interface 定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。它主要描述的是类型间的行为合同,接口和它的实现类之间是典型的 CAN-DO关系,即子 can do 父。 为什么接口需要默认方法 在接口添加默认方法不需要修改实现类,接口新增的默认方法在实现类中直接可用。 另外还要注意默认方法冲突问题。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031075.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号