一、接口的定义:关键词: interface abstract
package com.sky.bean;
public interface People {
public abstract void printPeopleType(); //抽象方法,实现类必须得重写它
}
二、接口的实现类:关键词: implements @Override
package com.sky.bean;
public class Student implements People {
@Override
public void printPeopleType() {
System.out.print("\n学生");
}
}
package com.sky.bean;
public class Teacher implements People {
@Override
public void printPeopleType() {
System.out.print("\n老师");
}
}
三、使用接口的好处
1、 对外只是以一个函数名的形式,没有实际实现内容,保护源码
2、实现统一入口,多个实现的扩展
package com.sky.run;
import com.sky.bean.People; //接口
import com.sky.bean.Student;//People接口的实现类 1
import com.sky.bean.Teacher;//People接口的实现类 2
public class Main {
public static void main(String[] args) {
//可扩展成不同的实现
printPeopleType(new Student()); //输出学生
printPeopleType(new Teacher()); //输出老师
}
private static void printPeopleType(People people) {
//统一入口
people.printPeopleType();
}
}
四、 接口的注意事项
1. 接口不能用于实例化对象,但可以声明,后面可以new 实例化它的实现类给这个接口声明对象。
2. 接口没有构造方法。
3. 接口中所有的方法必须是抽象方法。(java新特性,允许接口方法为非抽象!)
4. 接口不能包含成员变量,写了不能使用,因为不能实例化接口,如何调用?除了 static 和 final 变量。因为可以直接通过类名调用!
5. 一个接口实现类可以同时实现多个接口类。
package com.sky.bean;
public class Student implements People,People2 {
@Override
public void printPeopleType() {
System.out.print("\n学生");
}
@Override
public void printPeopleType2() {
System.out.print("\n学生2");
}
}
package com.sky.run;
import com.sky.bean.People; //接口
import com.sky.bean.Student;//People接口的实现类 1
import com.sky.bean.Teacher;//People接口的实现类 2
public class Main {
public static void main(String[] args) {
//可扩展成不同的实现
Student student = new Student();
printPeopleType(student); //输出接口1:People ----学生1
student.printPeopleType2();// 输出接口2:People2 ----学生2
printPeopleType(new Teacher());
}
private static void printPeopleType(People people) {
//统一入口
people.printPeopleType();
}
}
五、与抽象类的区别
1. 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
父类(抽象类)
package com.sky.service;
public abstract class Father {
public String a = " 通过super取得父类的属性值 a";
public void fun1(){
System.out.print("\n 这是 Father.fun1()");
}
}
子类(继承父类)
package com.sky.service;
public class Child extends Father {
//重写
@Override
public void fun1(){
System.out.print("\n 这是 Father.fun1() 在子类被 重写"+super.a);
}
//重载
public void fun1(String str){
System.out.print("\n 这是 Father.fun1() 在子类被 "+str+super.a);
}
public void fun2(){
System.out.print("\n 这是 子类自己独有的方法,非继承方法");
}
}
不能实例化父类,因为它是抽象类,需要通过继承它的子类访问它的属性和方法
Child child = new Child();
child.fun1(); //重写父类的方法
child.fun1("重载"); //重载父类的方法
child.fun2(); //子类新增的方法,非继承
2. 而接口类是什么都没有,就只有一个空壳子!