1. 接口(interface)是抽象方法與常量值的集合;
2. 從本質上來講,接口是一種特殊的抽象類,這種抽象類中只包含常量與方法的定義,而沒有變量和方法的實現;
3. 接口中聲明的屬性默認為:public static final,也只能是:public static final,(接口中成員變量的定義);
4. 接口中只能定義抽象方法,而且這些方法默認為public,也只能是public的;
5. 接口可以繼承其他的接口,並添加新的屬性和抽象方法;
6. 多個無關的類可以實現同一個接口,一個類可以實現多個無關的接口;
7. 與繼承關系類似,接口與實現類之間存在多態性:
多態的三個條件:繼承,重寫,父類引用指向子類對象;
由於Java中沒有多繼承,一個類只能有一個父類。一個父類可以有多個子類,而在子類里可以重寫父類的方法;
用接口可以實現多繼承,一個類或是可以同時實現多個接口;
一般而言,接口有利於代碼的擴展,而繼承則有利於代碼功能的修改
8. Demo
Demo_1
public interface Runner{
int id = 1; // 相當於:public static final int id = 1;
public void start();
public void run();
public void stop();
}
// 正確
Demo_2
interface Singer{
public void sing();
public void sleep();
}
class Sudents implements Singer{
private String name;
public Sudents(String name) {
this.name = name;
}
public void study(){
System.out.println("Studying");
}
public String getName(){
return name;
}
public void sing() { // @Override
System.out.println("Student is Singing");
}
public void sleep() { // @Override
System.out.println("Student is sleping");
}
}
// 正確
Demo_3
interface Singer{
public void sing();
public void sleep();
}
interface Painter{
public void paint();
public void eat();
}
class Student implements Singer{
private String name;
public Student(String name) {
this.name = name;
}
public void study(){
System.out.println("studying");
}
public String getName(){
return name;
}
public void sing() { // @Override
System.out.println("student is singing");
}
public void sleep() { // @Override
System.out.println("student is sleeping");
}
}
class Teacher implements Singer, Painter{
private String name;
public Teacher(String name) {
this.name = name;
}
public String getName(){
return name;
}
public void teach(){
System.out.println("teaching");
}
public void paint() { // @Override
System.out.println("teacher is painting");
}
public void eat() { // @Override
System.out.println("teacher is eating");
}
public void sing() { // @Override
System.out.println("teacher is singing");
}
public void sleep() { // @Override
System.out.println("teacher is sleeping");
}
}
public class Test {
public static void main(String[] args){
Singer s1 = new Student("s1");
s1.sing();
s1.sleep();
Singer t1 = new Teacher("t1"); //相當於繼承中的父類引用指向子類對象
t1.sing();
t1.sleep();
Painter p1 = (Painter) t1; //相當於繼承中的父類引用指向子類對象
p1.paint();
p1.eat();
}
}
// 正確
Demo_3的運行結果:
student is singing
student is sleeping
teacher is singing
teacher is sleeping
teacher is painting
teacher is eating
