接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。
一、接口简介
1.定义
接口是抽象类和常量定义的集合。
从本质上讲,接口是一种特殊的抽象类,这个抽象类中只有常量和方法的定义,没有变量和方法的实现。
2.出现的意义
解决java多继承问题,更好的使用多态,例如:防盗门既有门的特性(开、关),也有锁的特点(开锁、上锁),由于java继承具有单根性,则防盗门可以继承门,实现锁的方法,则可满足要求。
二、接口的特性
1.接口不可被实例化;
由于接口未实现具体的功能,实例化了也没有什么意义。
2.实现类必须实现接口的所有方法;
在定义接口时只关心实现类具备哪些能力,而不关心具体实现的方法。具体实现方法在具体的类中实现。
3.一个类可以实现多个无关的接口,多个无关的类可以实现同一个接口;
一个人可以具备打羽毛球的能力,也可以具备编程的能力了。(打羽毛球和编程看做两个不同的能力)
程序员可以喝咖啡,农民也可以喝咖啡。(喝咖啡看做具备的一种能力)
4.接口与实现类之间存在多态性;
*5.接口中的变量都是静态常量。
三、接口定义(interface)、实现(implements)、使用
(一)定义(interface)
接口只是提供了形式(确定方法名、参数列表和返回类型),而未提供任何具体实现,多实现接口用逗号隔开。
实现的具体格式如下:
<修饰符> class [extends]
[implements][,]]{
}
如下:
class Worker extends Person1 implements takeCareOfPets{...}
注意事项:
接口中声明属性默认为public static final(也只能是public static final,这个可以避免C++中多继承中,取属性值的混乱,static变量是存储在数据区的,多个对象获取时,读取的是同一块内存),定义时public static final可以省略不写。
接口中只能定义public的抽象方法;
接口可以继承其它的接口,并添加新的属性和抽象方法。
四、实例
class Person1{
public String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
interface takeCareOfPets{
public void feeds();
public void plays();
}
class Worker extends Person1 implements takeCareOfPets{
public String petName;
Worker(String name ,String petName){
this.petName = petName;
this.name= name;
}
public void feeds(){
System.out.println("工人"+name +"為他的寵物"+this.petName+"饅頭");
};
public void plays(){
System.out.println("工人"+name +"陪他的寵物"+this.petName+"軋馬路");
};
}
class Farmer extends Person1 implements takeCareOfPets{
public String petName;
Farmer(String name ,String petName){
this.petName = petName;
this.name= name;
}
public void feeds(){
System.out.println("農民"+name +"為他的寵物"+this.petName+"自家种的蔬菜");
};
public void plays(){
System.out.println("農民"+name +"陪他的寵物"+this.petName+"逛自家的院子");
};
}
class Student0 extends Person1 implements takeCareOfPets{
public String petName;
Student0(String name ,String petName){
this.petName = petName;
this.name= name;
}
public void feeds(){
System.out.println("學生"+name +"為他的寵物"+this.petName+"食堂的飯菜");
};
public void plays(){
System.out.println("學生"+name +"陪他的寵物"+this.petName+"逛學校");
};
}
public class takeCarePet {
public static void main(String[] args) {
Worker w0 = new Worker("賈","貓咪寶貝");
w0.feeds();w0.plays();
Farmer f1 =new Farmer("異","大黃");
f1.feeds();f1.plays();
Student0 s1 = new Student0("並","SweetHeart");
s1.feeds();s1.plays();
}
}
运行结果: