相信大家已经接触过Java了,看完接口的介绍 我还是一脸懵逼,这是学Java以来第一次感觉吃力的时候,相比之下 感觉接口很重要,现次将我的理解与大家分享。有哪些方面没有说到 还请大家多多谅解。
首先举个简单的猫狗例子
“猫会撒娇 ,狗会看门”。假设这是这两个动物(类)与生俱来的能力(方法),然而有一些个经过特殊训练的猫猫和狗狗 打个比方 他们还会 算数和倒立,这个厉害吧。这些个猫猫狗狗不同于普通的猫狗。有了特殊的技能(方法),这时候为了把他们和普通的猫狗区别开,需要一个标志(接口),这个标志可以表明(含有)他们具有的特殊技能(方法),当他们带上这个标志(实现接口)后就可以达成区别他们的目标。
这里面的标志就是接口的一个特例,但是描述的又不完整,听我细细讲述:
我在想你是否理解接口大体上是干什么的了吧,如果是这样 我们来转述到Java方面:
接口:它是从多个类里面提取出来的特性或者说方法吧(和抽象类有着血缘关系,但是不近)但是他只能提取特性,具体实现特性 还得靠实现类本身
定义接口使用的是interface关键字 而不是class关键字
--------------------------------------------------------------------------------------------
[修饰符] interface 接口名
{
....
}
--------------------------------------------------------------------------------------------
接口里含有的方法只能是抽象方法(必须有),类方法,默认方法。还有常量,内部类,接口,枚举定义
默认方法:default关键字修饰的方法
类方法:static关键字修饰的方法
成员变量(常量):pubic static final 修饰 因为这些修饰符的关系 final修饰符 要求定义即赋值 以后不可再赋值 所以变量也就成为常量。
抽象方法:abstract关键字修饰的方法
既然接口里有抽象方法,我们在抽象类那边学习到抽象方法是没有方法体的,所以接口必须要靠另外一个类实现它的抽象方法
如果这个类实现了这个接口里的所有抽象方法 ,那么这个类就是接口的子类 这就是接口的实现,如果没有实现全部 ,那么这个类(因为没有实现全部抽象方法,所以他继承了上一个接口的抽象方法,所以呐,他就是一个抽象类咯,记得抽象类用什么关键字修饰?嗯哼)就变成了抽象方法。所以他也必须靠其他类来实现。
接口的继承么,通俗的讲,就是一个接口只要有extends关键字,他就可以拥有其他接口的成员啦。
继承接口靠关键字extends,接口实现靠关键字implement
实现类实现接口的格式:
-----------------------------------------------------------------------------------------------------
class 子接口【实现类】 implements 父接口1,父接口2,,,
{
。。。
}
------------------------------------------------------------------------------------------------------
继承的格式:
-----------------------------------------------------------------------------------------------------
interface 子接口 extends 父接口1,父接口2,,,
{
。。。
}
------------------------------------------------------------------------------------------------------
下来看一个实现接口的代码:
//定义动物培训接口
interface AnimalTrain {
public abstract void jump();
}
//抽象类实现接口
abstract class Dog implements AnimalTrain {
}
//具体类实现接口
class Cat implements AnimalTrain {
//实现父类接口的抽象方法
public void jump() {
System.out.println("猫会算数和倒立了");
}
}
class InterfaceDemo {
public static void main(String[] args) {
//AnimalTrain是抽象的; 无法实例化
//AnimalTrain at = new AnimalTrain();
//at.jump();
//多态的方式实现接口
AnimalTrain at = new Cat();
at.jump();
}
}
说了这么多 那接口有什么用呢?
其实前面我已经说了接口的一个功能,你忘了么?
没错,他可以提取各个类的特性,这样你的代码就会变得简单容易看懂。
你若不信 我给你看一个实例:
这是代码:
/*
教练和运动员案例(学生分析然后讲解)
乒乓球运动员和篮球运动员。
乒乓球教练和篮球教练。
为了出国交流,跟乒乓球相关的人员都需要学习英语。
请用所学知识:
分析,这个案例中有哪些抽象类,哪些接口,哪些具体类。
整个分析过程,我是通过画图讲解的。
*/
//定义一个说英语的接口
interface SpeakEnglish {
//说英语
public abstract void speak();
}
//定义人的抽象类
abstract class Person {
private String name;
private int age;
public Person() {}
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//睡觉
public void sleep() {
System.out.println("人都是要睡觉的");
}
//吃饭
public abstract void eat();
}
//定义运动员抽象类
abstract class Player extends Person {
public Player() {}
public Player(String name,int age) {
super(name,age);
}
//学习
public abstract void study();
}
//定义教练抽象类
abstract class Coach extends Person {
public Coach() {}
public Coach(String name,int age) {
super(name,age);
}
//教
public abstract void teach();
}
//定义乒乓球运动员具体类
class PingPangPlayer extends Player implements SpeakEnglish {
public PingPangPlayer(){}
public PingPangPlayer(String name,int age) {
super(name,age);
}
//吃
public void eat() {
System.out.println("乒乓球运动员吃大白菜,喝小米粥");
}
//学习
public void study() {
System.out.println("乒乓球运动员学习如何发球和接球");
}
//说英语
public void speak() {
System.out.println("乒乓球运动员说英语");
}
}
//定义篮球运动员具体类
class BasketballPlayer extends Player {
public BasketballPlayer(){}
public BasketballPlayer(String name,int age) {
super(name,age);
}
//吃
public void eat() {
System.out.println("篮球运动员吃牛肉,喝牛奶");
}
//学习
public void study() {
System.out.println("篮球运动员学习如何运球和投篮");
}
}
//定义乒乓球教练具体类
class PingPangCoach extends Coach implements SpeakEnglish {
public PingPangCoach(){}
public PingPangCoach(String name,int age) {
super(name,age);
}
//吃
public void eat() {
System.out.println("乒乓球教练吃小白菜,喝大米粥");
}
//教
public void teach() {
System.out.println("乒乓球教练教如何发球和接球");
}
//说英语
public void speak() {
System.out.println("乒乓球教练说英语");
}
}
//定义篮球教练具体类
class BasketballCoach extends Coach {
public BasketballCoach(){}
public BasketballCoach(String name,int age) {
super(name,age);
}
//吃
public void eat() {
System.out.println("篮球教练吃羊肉,喝羊奶");
}
//教
public void teach() {
System.out.println("篮球教练教如何运球和投篮");
}
}
class InterfaceDemo {
public static void main(String[] args) {
//测试运动员(乒乓球运动员和篮球运动员)
//乒乓球运动员
PingPangPlayer ppp = new PingPangPlayer();
ppp.setName("王浩");
ppp.setAge(33);
System.out.println(ppp.getName()+"---"+ppp.getAge());
ppp.eat();
ppp.sleep();
ppp.study();
ppp.speak();
System.out.println("----------------");
//通过带参构造给数据(留给你们)
//篮球运动员
BasketballPlayer bp = new BasketballPlayer();
bp.setName("姚明");
bp.setAge(34);
System.out.println(bp.getName()+"---"+bp.getAge());
bp.eat();
bp.sleep();
bp.study();
//bp.speak(); //没有该方法
//测试教练自己做
//乒乓球教练
PingPangCoach pi = new PingPangCoach();
pi.setName("");
pi.setAge();
System.out.println("")
pi.eat();
pi.sleep();
pi.study();
pi.speak();
System.out.println("----------------");
}
}
不知道你看到这有木有弄清一些呢?如果你清除了我会很高兴的,好了故事讲到这里,到了时间讲拜拜。