Java学习日记9——接口(长文预警)

Java学习日记9——接口(长文预警)

接口:某种特征的约定,接口也是引用类型

定义接口:interface,所有的方法都是public abstract
实现接口:implements,可以实现多重继承,与类的继承关系无关。
以下解析来自菜鸟教程|Java接口。有删减,点击链接可以查看原文。给出一个公式:

[可见度] interface 接口名称 [extends 其他的接口名] {
        // 声明变量
        // 抽象方法
}

接口有以下特性:
接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
接口中的方法都是公有的。

定义一个接口

/* 文件名 : Animal.java *///动物
interface Animal {
   public void eat();
   public void run();
}

其实接口和继承有相似之处,只不过在接口定义时,定义的所有方法都是空的,这些方法需要在实现接口的地方进行实现(编写具体代码)。

实现一个接口
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
实现一个接口的语法,可以使用这个公式:

/* 文件名 : MammalInt.java *///哺乳动物
public class MammalInt implements Animal{
   public void eat(){
      System.out.println("Mammal eats");
   }
   public void run(){
      System.out.println("Mammal running");
   } 
   public int noOfLegs(){
      return 0;
   }
   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.run();
   }
}

重写接口中声明的方法时,需要注意以下规则:

 1.类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
 2.类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
 3.如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

在实现接口的时候,也要注意一些规则:

 1.一个类可以同时实现多个接口。
 2.一个类只能继承一个类,但是能实现多个接口。
 3.一个接口能继承另一个接口,这和类之间的继承比较相似。

接口的继承

单继承:一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承和类的继承都使用extends关键字,子接口继承父接口的方法。

多重继承:在Java中,类的多继承是不合法,但接口允许多继承。在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。例如:

public interface basketball extends Sports, Event;

以上的程序片段是合法定义的子接口,与类不同的是,接口允许多继承,而 Sports及 Event 可能定义或是继承相同的方法

标记接口

最常用的继承接口是没有包含任何方法的接口。标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。

标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

例如:java.awt.event 包中的 MouseListener 接口继承的 java.util.EventListener 接口定义如下:

package java.util;
public interface EventListener{

}

没有任何方法的接口被称为标记接口。标记接口主要用于以下两种目的:

1.建立一个公共的父接口:
正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。

2.向一个类添加数据类型:
这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。

看到这里,应该不止我一个人心里有很多疑问?

1.既然建立的接口是都是空方法,具体的实现还要在类里面实现,那接口到底有什么用?

:接口不是用来多继承的,它更多的目的是定制一个标准,实现解耦。定义一个接口就是定义了一个标准,使用这个接口的类就是标准的使用者,实现了这个接口的类就是这个标准的实现者。接口的出现,把使用者和实现者之间的直接联系转化为间接联系,把强耦合转换为弱耦合,从而实现解耦的目的。所以这里不能称为是空方法,因为空方法的意思是有实现体,只不过实现体是空操作。实际上接口没有定义任何实现体。具体的实现体都是在实现接口的类中,接口只是定义了这些方法的调用方式。

 你当然也可以不用接口,直接在类里面写方法,但是如果你的一组方法需要在很多类里实现,那么把它们抽象出来,做成一个接口规范,不是更好么?

2.如果多个接口,在同一个程序中都实现相同的方法,不冲突吗?接口跟多继承有什么关系?

:首先,为什么Java不能使用多继承呢?假设一个场景,两个父类中都存在同名方法test,如果使用多继承,子类在调用test方法时不知道应该调用哪个父类中的test方法。那接口为什么能多继承(多实现)?因为接口中是抽象类,在实现类中可以覆盖接口中同名的方法,实现类不会出现同名方法。

3.对于已经封装的包,只知道接口,我又不知道具体的方法,我怎么实现?

:接口里定义了方法的输入输出,这些都是协议,具体的实现都在每个类中。对于很多只需要抽象接口的地方,不需要知道具体的类是什么,只要这个类实现了这个接口就可以了。

最后附上一个完整的例程吧!以帮助大家理解!

其实程序很好理解,别被这么长的代码吓到了!!!!!!

/*person.java文件内容,定义众多接口*/
package learning3;
//定义接口person
public interface person {
	public void say();
	public void eat();
}
//定义接口student,且继承自person
interface student extends person{
	public void studytime();
}
//定义接口worker,继承person
interface worker extends person{
	public void worktime();
}
//定义接口college,继承了person和student,多重继承
interface college extends person,student{
	public void grade();
}
/*interfacetestperson.java文件内容,定义很多类,实现前面定义的接口方法*/
package learning3;

public class interfacetestperson {
//主程序入口
	public static void main(String [] args) {
		people m = new people("Siri","betary");
		primarystudent p = new primarystudent("张同学","帅气",88);
		collegestudent c = new collegestudent("陈同学","可爱",520,99);
		workers w = new workers("小爱","WIFI",9999);
		m.say();m.eat();
		w.say();w.eat();w.worktime();
		p.say();p.eat();p.studytime();
		c.say();c.eat();c.studytime();c.grade();
	}
}
//下面是具体的接口实现类,很好理解!!!
class people implements person{
	String name ;
	String food;
	public people(String name, String food) {//类的构造方法
		this.food = food;
		this.name = name;	
	}
	public void say() {
		System.out.println("hello! my name is:"+name);
	};
	public void eat() {
		System.out.println("I am eating +"+food);
	};
}
class primarystudent implements student{
	String name;
	String food;
	double studytime;
	public void say() {
		System.out.println("hello!I am a primary student, my name is:"+name);
	};
	public void eat() {
		System.out.println("I am eating "+food);
	};
	public void studytime() {
		System.out.println("I have studyed "+studytime +"min");
	};
	public primarystudent(String name,String food,double studytime) {
	//类的构造方法
		this.name = name;
		this.food = food;
		this.studytime = studytime;
	}
}
class collegestudent implements college{
	String name;
	String food;
	double studytime;
	double grade;
	public void say() {
		System.out.println("hello!I am a college student, my name is:"+name);
	};
	public void eat() {
		System.out.println("I am eating "+food);
	};
	public void studytime() {
		System.out.println("I have studyed "+studytime +"min");
	};
	public void grade() {
		System.out.println("my grade is :"+grade);
	};
	public collegestudent(String name,String food,double studytime,double grade) {
	//类的构造方法
		this.name = name;
		this.food = food;
		this.studytime = studytime;
		this.grade = grade;
	}
}
class workers implements worker{
	String name;
	String food;
	double worktime;
	public void say() {
		System.out.println("hello!I am a worker,my name is:"+name);
	};
	public void eat() {
		System.out.println("I am eating "+food);
	};
	public void worktime() {
		System.out.println("I have worked "+worktime +"min");
	};
	public workers(String name,String food,double worktime) {
	//类的构造方法
		this.name = name;
		this.food = food;
		this.worktime = worktime;
	}
}

最终执行结果为:

hello! my name is:Siri
I am eating +betary
hello!I am a worker,my name is:小爱
I am eating WIFI
I have worked 9999.0min
hello!I am a primary student, my name is:张同学
I am eating 帅气
I have studyed 88.0min
hello!I am a college student, my name is:陈同学
I am eating 可爱
I have studyed 520.0min
my grade is :99.0

如果你对Java有兴趣,可以了解一下前面几期的基础知识!下面附上链接:

Java编程基础认知:Java学习日记1——基础认知
Java面向对象编程认识:Java学习日记2——面向对象编程认知
Java程序的基本结构认识:Java学习日记3——程序类型与构成认知
Java的输入输出方法总结:Java学习日记4——Java输入输出方法总结
Java的数据类型、变量、常量、运算符:Java学习日记5——数据类型、变量、常量、运算符、数组
Java学习日记6——类、字段、方法、this的使用:Java学习日记6——类、字段、方法、this的使用
Java学习日记7——类的继承、super使用规则:Java学习日记7——类的继承、super使用规则
Java学习日记8——public、static、private、final、abstract、protected修饰符:Java学习日记8——public、static、private、final、abstract、protected修饰符

你可能感兴趣的:(Java学习日记)