我的体会是,接口的出现是为了弥补Java继承而来的,终极目的是提高代码复用率和统一规范方法的命名,一个只能继承于一个父类,但可以有多个接口。接口只能有常量属性和抽象方法的声明一定不能实现。
1.接口的定义:
[public] interface 接口名[extends 父接口列表]{
//常量的声明
[public] [static][ final]数据类型 常量名 = 常量值;
//抽象方法的声明
[public] [abstract] 返回类型 方法名(参数列表);
}
a.这里的方括号是可选项,常量缺省为public static final ,抽象方法缺省为 public abstract,它只能被一个包中的其它类和接口使用.
b.在类中实现接口时,该接口的所有方法必须被实现,如果该方法没有被实现(也要全部重写一遍),说明该类是个抽象类,继承该类的子类也得实现那个接口所有的抽象方法,逃不掉的。
c,接口不能有构造方法。
2.接口的实现
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
}
实例:
Person.java
package shunli.li.jiekou;
public class Person { //定义了一个人类
private String name; //姓名
private int age; //年龄
public void speak(Person person) {} //讲语言
}
Show.java
package shunli.li.jiekou;
public interface Show { //这是一个接口,抽象方法是show(),省略了public abstract 关键字,但具有一样效果
void show(); //展示方法
}
Studentl.java
package shunli.li.jiekou;
public class Student extends Person implements Show{ //定义了一个学生类,继承人类,接口是展示
static final String ID = "Student"; //身份是学生
public void show() { //展示方法
System.out.println("我 正在回到老师问题");
}
public void speak(Student student) { //从”父类“人类那里继承的讲语言
System.out.println("我会讲中文");
}
public Student() { //构造方法
super(); //调用父类构造方法完成构造
}
}
Teacher.java
package shunli.li.jiekou;
public class Teacher extends Person implements Show{ //老师类,其于同上
private static final String ID = "teacher";
public Teacher() {
super();
}
public void show() {
System.out.println("我正在给学生上课");
}
public void speak(Teacher teacher) {
System.out.println("我不仅可以讲中文还能讲英文");
}
}
Test.java
package shunli.li.jiekou;
import java.lang.reflect.Array;
public class Test { //测试类
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu1 = new Student(); //构造学生1
Teacher tea1 = new Teacher(); //构造教师1
stu1.speak(stu1); //调用学生speak()方法
stu1.show(); //调用Student类show()方法
tea1.speak(tea1); //调用spenak()方法
tea1.show(); //调用Teacher类show()方法
}
}
由此可见,统一规范了同类方法的命名,列如展示都叫show,因为不止人可以show,所以show不是人类所特有的,不便放在人类这个类中,当然这里更好的是再举个宠物类之类的,然后它们也可以用接口Show就更直观了。换句话说,接口只是统一命名规范,并不讲谁实现,怎么实现。