Java接口
一个类只能有一个父类,一个类能实现多个接口。
接口声明
interface 接口名{
//接口体
}
1、接口体中抽象方法和static常量
interface Printable{
public static final int MAX=100; //等价于int MAX=100;
public abstract void ass(); //等价于void add();
public abstract float sum(float x,float y); //等价于float sum(float x,float y);
}
注:JDK8之前,接口体中只有abstract方法
2、接口体中的default实例方法(JDK8后才有)
interface Printable{
public default int max(int a,int b){ //default方法
return a>b?a:b;
}
}
3、接口体中的static方法(JDK8后才有)
interface Printable{
public static void f(){ //static方法
System.out.println("注意是从java SE8开始的");
}
}
注
a、不可用static和abstract同时修饰一个方法,defaul不能和static修饰一个方法
b、接口里不会有变量
c、接口里abstract方法不能有方法体
//错误写法
interface Printable{
public abstract void ass(){}; //或者void add(){};
//接口里abstract方法不能有方法体
}
d、接口里default方法可以有方法体,或者说在接口里写实例方法后,还要写方法体,就要加上default
4、接口的使用
可以用接口中的static常量和static方法
//可以用接口中的static常量和static方法
Printable.MAX; //接口名调用static常量
Printable.f(); //接口名调用static方法,
类实现接口
//A类实现Printable和Addable接口
class A implements Printabel,Addable{
}
//Animal的子类Dog类实现Eatable和Sleepable接口
class Dog extends Animal implements Eatable,Sleepable{
}
注
a、一个类实现了某个接口,就拥有了接口中的static常量和default方法。也可以重写default方法,但要去掉default关键字
b、类实现某接口,但类不拥有接口的static方法
c、一个非abstract类实现了某个接口,则这个类必须重写所有abstract方法。即去掉abstract修饰给出的方法体
d、一个abstract类实现某个接口,则该类可重写接口abstract方法或直接拥有接口的abstract方法
接口中的方法的访问权限都是public ,所以重写是不能省略public
public interface Printable {
public final int MAX = 100; //等价写法:int MAX=100;
public abstract void on(); //等价写法:void on();
public abstract float sum(float x ,float y);
public default int max(int a,int b) { //default方法
return a>b?a:b;
}
public static void f() {
System.out.println("注意是从Java SE 8开始的");
}
}
public class AAA implements Printable { //非abstract类实现接口Printable
public void on(){ //必须重写接口的abstract方法on,不能省略public
System.out.println("打开电视");
}
public float sum(float x ,float y){//必须重写接口的abstract方法sum,不能省略public
return x+y;
}
}
public class Example5_14 {
public static void main(String args[]) {
AAA a = new AAA();
System.out.println("接口中的常量"+AAA.MAX);
System.out.println("调用on方法(重写的):");
a.on();
System.out.println("调用sum方法(重写的):"+a.sum(12,18));
System.out.println("调用接口提供的default方法"+a.max(12,78));
Printable.f(); //接口调用static方法
//a.f(); 由于a不能拥有static方法f,所以不能调用,会报错
}
}
类AAA重写default方法,其他的不变
public class AAA implements Printable { //非abstract类实现接口Printable
public void on(){ //必须重写接口的abstract方法on,不能省略public
System.out.println("打开电视");
}
public float sum(float x ,float y){//必须重写接口的abstract方法sum,不能省略public
return x+y;
}
public int max(int a,int b) { //重写default方法
System.out.println("这是a重写的default方法");
return a>b?a:b;
}
}
强调
a、在关键字interface前加上public 则称为public接口,该接口可被任何一个类声明实现。如果不加public 则称为友好接口,可被在同一个包下的类声明实现
b、如果父类实现某接口,那么子类就自然实现了该接口
c、接口可以被继承,可通过extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是public 则子接口可继承父接口的全部方法和常量
接口回调
定义:接口回调是指可以把某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类重写的接口方法以及接口中的default方法
interface ShowMessage {
void 显示商标(String s);
default void f() {
System.out.println("default方法");
}
}
class TV implements ShowMessage {
public void 显示商标(String s) {
System.out.println(s);
}
}
class PC implements ShowMessage {
public void 显示商标(String s) {
System.out.println(s);
}
}
public class Example5_15 {
public static void main(String args[]) {
ShowMessage sm=null; //声明接口变量
sm=new TV(); //接口变量中存放对象的引用
sm.显示商标("长城牌电视机"); //接口回调。
sm.f(); //接口回调
sm=new PC(); //接口变量中存放对象的引用
sm.显示商标("联想奔月5008PC机"); //接口回调
sm.f(); //接口回调
}
}
理解接口
理解的关键点
1、接口可以抽象出重要的行为标准,该行为标准用抽象方法来表示
2、可以把实现接口的类的对象的引用赋值给接口变量,该接口变量可以调用被该类实现的接口方法,即体现该类根据接口中的行为标准给出具体的行为
abstract class MotorVehicles { //抽象类
abstract void brake();
}
interface MoneyFare { //接口
void charge();
}
interface ControlTemperature { //接口
void controlAirTemperature();
}
class Bus extends MotorVehicles implements MoneyFare { //Bus继承MotorVehicles,实现MoneyFare
void brake() { //非抽象类Bus重写父类MotorVehicles的抽象方法brake
System.out.println("公共汽车使用毂式刹车技术");
}
public void charge() { //bus重写接口MoneyFare的方法
System.out.println("公共汽车:一元/张,不计算公里数");
}
}
class Taxi extends MotorVehicles implements MoneyFare,ControlTemperature { //Taxi继承MotorVehicles,实现MoneyFare和ControlTemperature
void brake() { //非抽象类Taxi重写父类MotorVehicles的抽象方法brake
System.out.println("出租车使用盘式刹车技术");
}
public void charge() { //Taxi重写接口MoneyFare的方法
System.out.println("出租车:2元/公里,起价3公里");
}
public void controlAirTemperature() { //Taxi重写接口ControlTemperature的方法
System.out.println("出租车安装了Hair空调");
}
}
class Cinema implements MoneyFare,ControlTemperature {
public void charge() { //Cinema重写接口MoneyFare的方法
System.out.println("电影院:门票,十元/张");
}
public void controlAirTemperature() { //Cinema重写接口controlAirTemperature的方法
System.out.println("电影院安装了中央空调");
}
}
public class Example5_16 {
public static void main(String args[]) {
Bus bus101 = new Bus();
Taxi buleTaxi = new Taxi();
Cinema redStarCinema = new Cinema();
MoneyFare fare; //声明MoneyFare接口变量fare
ControlTemperature temperature; //声明ControlTemperature接口变量temperature
fare = bus101; //接口变量MoneyFare存放对象的引用bus101
bus101.brake();
//bus101.charge(); bus101也可调用Bus重写的接口方法
fare.charge();
fare = buleTaxi;
temperature = buleTaxi;
buleTaxi.brake();
fare.charge();
temperature.controlAirTemperature();
fare = redStarCinema;
temperature = redStarCinema;
fare.charge();
temperature.controlAirTemperature();
}
}
接口与多态
有接口产生的多态就是指不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在回调接口方法就可能具有多种形态
public interface Advertisement {
public void showAdvertisement();
public String getCorpName();
}
public class AdvertisementBoard {
Advertisement adver ;
public void setAdvertisement(Advertisement adver){
this.adver = adver;
}
public void show() {
if(adver != null){
System.out.println("广告牌显示"+adver.getCorpName()+"公司的广告词:");
adver.showAdvertisement();
}
else {
System.out.println("广告牌无广告");
}
}
}
public class PhilipsCorp implements Advertisement { //PhilipsCorp实现Avertisement接口
public void showAdvertisement(){
System.out.println("@@@@@@@@@@@@@@@@@@@@@@");
System.out.println("没有最好,只有更好");
System.out.println("@@@@@@@@@@@@@@@@@@@@@@");
}
public String getCorpName() {
return "飞利普" ;
}
}
public class LenovoCorp implements Advertisement { //LenovoCorp实现Avertisement接口
public void showAdvertisement(){
System.out.println("**************");
System.out.println("让世界变得很小");
System.out.println("**************");
}
public String getCorpName() {
return "联想集团" ;
}
}
public class Example5_17 {
public static void main(String args[]) {
AdvertisementBoard board = new AdvertisementBoard();
board.setAdvertisement(new LenovoCorp());
board.show();
board.setAdvertisement(new PhilipsCorp());
board.show();
}
}
abstract类与接口的比较
1、abstract类的接口都可以有abstract方法
2、接口中只能有常量,不能有变量。而abstract类中既可以有常量,也可以有变量
3、abstract类中也可以有非abstract方法(不是default方法,还带有方法体的方法),但不可以有default实例方法。接口不可以有非abstract方法,但可以有default实例方法