【Dongle】【Java】基础(四)之接口

       通过这次学习J2SE,发现了很多之前不知道或从来没注意的细节,而恰恰这些细节却是关键所在呢,对以后实践有着不可替代的意义。

       之前,只知道接口只是用来实现的,而在深入的了解就是一问三不知了。这让我对这次学习更印象深刻了,就如老师说过:“学习是反复的,不是一蹴而就的”。

接口实现

       多个类可以实现相同的接口,一个类也可以实现多个接口。拿代码解释吧:

interface Singer {
	public void sing();
	public void sleep();
}

interface Painter {
	public void paint();
	public void eat();
}

class Student implements Singer {
	private String name;
	Student(String name){
		this.name = name;
	}
	public void study(){
		System.out.println("studying");
	}
	public String getName(){
		return name;
	}
	public void sing(){
		System.out.println("student is singing");
	}
	public void sleep(){
		System.out.println("student is sleeping");
	}
}
class Teacher implements Singer,Painter {//可以实现多个接口,每个接口间用“,”连接;实现多个接口,就必须将每个接口的抽象方法都要实现
	private String name ;
	public String getString(){
		return name;
	}
	
	Teacher(String name ){
		this.name = name;
	}
	public void teach(){
		System.out.println("teaching");
	}
	public void sing(){
		System.out.println("teacher is singing");
	}
	public void sleep(){
		System.out.println("teacher is sleeping");
	}
	public void paint(){
		System.out.println("teacher is painting");
	}
	public void eat(){
		System.out.println("teacher is eating");
	}
}

上面有两个接口,一个是Singer接口,另一个是Painter接口。

       存在类Student、Teacher,这两个都实现了Singer接口:多个类可以实现同一个接口。

       类Teacher实现了Singer接口和Painter接口:一个类可以实现多个接口(接口实现用implements;继承用Extends)。

       对于类实现接口,必须实现接口内定义的方法,而多重实现就是讲多个接口内的方法都要实现。例如Student必须实现Singer接口中的sing()和sleep()两个方法,而Teacher必须实现Singer和Painter两个接口中的sing()、sleep()、paint()和eat()四个方法。


运行结果如下:



接口继承

       接口之间也是可以继承的:

interface Protectable {
	public void beProtected();
}

interface A extends Protectable {//要实现A,就必须实现A和Protectable两个接口
	void m();
	double getMoney();//与Valuable接口中的方法相同,可以被编译成功
	//void getMoney();//与Valuable接口中的方法名相同,但是返回值不同,则编译不会成功,产生了方法混淆,调用的时候不能清除说明
}

       

      接口继承和类继承是相似的,所以又说接口是一种特殊的抽象类(因为接口的方法只定义不实现)。那么会给类实现产生什么影响呢?


class Hen implements A {
	public void m(){}
	public void beProtected(){}
	
	//此方法产生混淆,编译失败
	//public void getMoney(){	}	
	public double getMoney(){
		return 1.0;
	}
}
       类Hen实现接口A,相当于即实现接口A,又实现接口Protectable。相当于一个类实现了多个接口,只不过这两个接口之间存在了继承关系,那么类就可以直接实现一个接口便可以间接的实现了另一个接口。


接口问题

       一边学习接口实现,一边就在思考如果两个接口中定义了相同的方法,结果会怎样?想着想着,视频中也就给出了提示。

      当如果方法相同(方法名、参数个数、参数类型、返回值都相同),编译也会成功,证明两个接口对于这个方法都可见。但是,如果两个方法的返回值不相同,其它都相同,那么编译就会出错,因为方法产生了混淆:

public interface Valuable {
	public double getMoney();
}

interface Protectable {
	public void beProtected();
}

interface A extends Protectable {//要实现A,就必须实现A和Protectable两个接口
	void m();
	double getMoney();//与Valuable接口中的方法相同,可以被编译成功
	void getMoney();//与Valuable接口中的方法名相同,但是返回值不同,则编译不会成功,产生了方法混淆,调用的时候不能清除说明
}

class Hen implements A {
	public void m(){}
	public void beProtected(){}
	
	//此方法产生混淆,编译失败
	public void getMoney(){	}	
	public double getMoney(){
		return 1.0;
	}
}
编译异常:


    

      所以实现多个接口时一定要仔细注意方法问题哦!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值