接口与接口多继承

java 专栏收录该内容
15 篇文章 0 订阅

接口的的定义格式:

public/default interface 接口名字{接口体}

注意:

  1. 接口的访问修饰符只能是public或者不写(default);
  2. 接口可以使用extends关键字多继承
  3. 接口中的属性只能是常量,总是被public static final修饰,不写也是;
  4. 接口中的方法只能是:public abstract,不写也是;
  5. 子类通过implements关键字实现接口,且可以实现一个或多个接口;
  6. 接口不能实例化对象,但可以用来声明引用对象类型;
  7. 如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法,且重写的方法的访问权限必须是public
  8. 抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法
  9. jdk1.7之前,接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法
  10. jdk1.8之后,接口中包含static 或者default修饰的方法(与普通类的成员方法类似);
  11. 接口中static修饰的方法只能通过接口名.方法名去调用,所以不用担心方法名重复的问题
  12. 接口中default修饰的方法:如果实现了多个接口,这些接口中default修饰的方法有同名的,那么子类就必须重写这个方法,否则报错。当子类实现接口的同时又继承了某个父类,而父类中有与之同名的成员方法时,就会使用父类的成员方法。如果同名的是父类的静态方法,就会报父类静态方法与接口的方法冲突的错
  13. 接口回调:可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法

示例代码:

//Flyer.java

public interface Flyer {
	int FLY_HEIGHT=1000;
	void fly();
}

//Honey.java

public interface Honey {
	int HONEY_RATE=100;
	void honey();
}

//AirVehicle.java

public abstract class AirVehicle implements Flyer{
	public abstract void light();
}

//Vehicle.java

public class Vehicle extends AirVehicle{

	@Override
	public void fly() {
		System.out.println("我是飞行器,我可以飞");
		
	}

	@Override
	public void light() {
		System.out.println("我是飞行器,我可以发光");
		
	}

}

//SuperMan.java

public class SuperMan extends AirVehicle implements Flyer,Honey {

	@Override
	public void honey() {
		System.out.println("我是超人,我是善良的");
		
	}

	@Override
	public void fly() {
		System.out.println("我是超人,我能飞");
		
	}

	@Override
	public void light() {
		System.out.println("我是超人,我能发光");
		
	}
	
}

//Main.java
public class Main {
	public static void main(String [] args) {
		AirVehicle a=new SuperMan();
//		Flyer d=new SuperMan();跟a上转型为AirVehicle类似,只能调用Flyer接口中有的方法和属性
		SuperMan b = new SuperMan();
		Vehicle c= new Vehicle();/*Vehivle类继承了AirVehicle抽象类,而AirVehicle抽象类声明实现了
Flyer接口,所以AirVehicle直接拥有了fly抽象方法和常量FLY_HEIGHT,这些和light抽象方法一起传递给了Vehicle*/
		a.fly();
		a.light();
/*		a.honey(); 非法,a上转型成为了AirVehicle类型,AirVerhicle中没有honey方法,
但因为AirVerhicle是抽象类,声明实现Flyer接口,所以它就直接拥有了fly方法*/
		b.fly();
		b.light();
		b.honey();
		c.fly();
		c.light();
//		d.fly();合法,接口回调
//		d.honey();非法
		System.out.println("a.FLY_HEIGHT:"+a.FLY_HEIGHT);
//		System.out.println("a.HONEY_RATE:"+a.HONEY_RATE);非法
		System.out.println("b.FLY_HEIGHT:"+b.FLY_HEIGHT);
		System.out.println("b.HONEY_RATE:"+b.HONEY_RATE);
		System.out.println("c.FLY_HEIGHT:"+c.FLY_HEIGHT);
	}
}

//运行结果:
我是超人,我能飞
我是超人,我能发光
我是超人,我能飞
我是超人,我能发光
我是超人,我是善良的
我是飞行器,我可以飞
我是飞行器,我可以发光
a.FLY_HEIGHT:1000
b.FLY_HEIGHT:1000
b.HONEY_RATE:100
c.FLY_HEIGHT:1000

测试default方法与static方法的代码:

//接口TestInter
public interface TestInter {
	static void fun() {
		System.out.println("我是TestInter的staic方法");
	}
	default void fun1() {
		System.out.println("我是TestInter的default方法");
	}
//	private void fu2() {
//		System.out.println("kdjaklfjkl");
//	}
}
//接口TestInter2
public interface TestInter2 {
	static void fun() {
		System.out.println("我是TestInter2的static方法");
	}
	default void fun1() {
		System.out.println("我是TestInter2的default方法");
	}
}
//子类TestInterface
public class TestInterface  implements TestInter,TestInter2{
	public static void main(String[] args) {
		TestInterface test=new TestInterface();
		test.fun1();
		TestInter.fun();
//		TestInter.fun1();
	}

	@Override
	public void fun1() {
		// TODO Auto-generated method stub
		TestInter.super.fun1();
	}
}

//运行结果:
我是TestInter的default方法
我是TestInter的static方法

 

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值