欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-01-18 21:37:22
Java学习日记9——接口接口:某种特征的约定,接口也是引用类型定义接口:interface,所有的方法都是public abstract实现接口:implements,可以实现多重继承,与类的继承关系无关。以下解析来自菜鸟教程|Java接口。有删减,点击链接可以查看原文。给出一个公式:[可见度] interface 接口名称 [extends 其他的接口名] { // 声明变量 // 抽象方法}接口有以下特性:接口是隐式抽象的,当声明一个接口的时候,不必使...

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修饰符

本文地址:https://blog.csdn.net/weixin_44005494/article/details/107691707