接口的引出
继续回到我们的猫狗案例,我们想想狗一般就是看门,猫一般就是作为宠物了,对不。但是,现在有很多的驯养员或者是驯兽师,可以训练出:猫钻火圈,狗跳高,狗做计算等。
而这些额外的动作,并不是所有猫或者狗一开始就具备的,这应该属于经过特殊的培训训练出来的,对不。
所以,这些额外的动作定义到动物类中就不合适,也不适合直接定义到猫或者狗中,因为只有部分猫狗具备这些功能。
所以,为了体现事物功能的扩展性,Java中就提供了接口来定义这些额外功能,并不给出具体实现,将来哪些猫狗需要被培训,只需要这部分猫狗把这些额外功能实现即可。
接口的特点
由此可见:
A:具体类多态(几乎没有)
B:抽象类多态(常用)
C:接口多态(最常用)
<span style="color: #008000;">*/<span style="color: #008000;">//<span style="color: #008000;">定义动物培训接口,这里没有class
<span style="color: #0000ff;">interface<span style="color: #000000;"> AnimalTrain {
<span style="color: #0000ff;">public <span style="color: #0000ff;">abstract <span style="color: #0000ff;">void<span style="color: #000000;"> jump();
}
<span style="color: #008000;">//<span style="color: #008000;">抽象类实现接口
<span style="color: #0000ff;">abstract <span style="color: #0000ff;">class Dog <span style="color: #0000ff;">implements<span style="color: #000000;"> AnimalTrain {
}
<span style="color: #008000;">//<span style="color: #008000;">具体类实现接口
<span style="color: #0000ff;">class Cat <span style="color: #0000ff;">implements<span style="color: #000000;"> AnimalTrain {
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> jump() {
System.out.println("猫可以跳高了"<span style="color: #000000;">);
}
}
<span style="color: #0000ff;">class<span style="color: #000000;"> InterfaceDemo {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
<span style="color: #008000;">//<span style="color: #008000;">AnimalTrain是抽象的; 无法实例化
<span style="color: #008000;">//<span style="color: #008000;">AnimalTrain at = new AnimalTrain();
<span style="color: #008000;">//<span style="color: #008000;">at.jump();
<span style="color: #000000;">
AnimalTrain at = <span style="color: #0000ff;">new<span style="color: #000000;"> Cat();
at.jump();
}
}
接口的成员特点
</span><span style="color: #ff0000;">//<a href="/tag/cuowu/" target="_blank" class="keywords">错误</a>: 需要<标识符>。接口没有构造<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>。
</span><span style="color: #008000;">//</span><span style="color: #008000;"> public Inter() {}
</span><span style="color: #ff0000;">//接口<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>不能带有主体
</span><span style="color: #008000;">//</span><span style="color: #008000;">public void show() <span style="color: #ff0000;">{}
</span></span><span style="color: #008000;">//</span><span style="color: #008000;">abstract void show(); </span><span style="color: #008000;">//</span><span style="color: #008000;">默认public</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> show(); <span style="color: #ff0000;">//默认abstract。只能是抽象<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>。默认修饰符:public abstract</span>
<span style="color: #000000;">}
<span style="color: #ff0000;">//接口名+Impl这种格式是接口的实现类格式/<span style="color: #008000;">
class InterImpl implements Inter {
public InterImpl() {
super();
}
}
<span style="color: #008000;">/
<span style="color: #0000ff;">class
InterImpl <span style="color: #0000ff;">extends Object <span style="color: #0000ff;">implements<span style="color: #000000;"> Inter {<span style="color: #0000ff;">public<span style="color: #000000;"> InterImpl() {
<span style="color: #0000ff;">super<span style="color: #000000;">();
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> show() {}
}
<span style="color: #008000;">//<span style="color: #008000;">测试类<span style="color: #0000ff;">class<span style="color: #000000;"> InterfaceDemo2 {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
<span style="color: #008000;">//<span style="color: #008000;">创建对象
Inter i = <span style="color: #0000ff;">new<span style="color: #000000;"> InterImpl();
System.out.println(i.num);
System.out.println(i.num2);
<span style="color: #008000;">//<span style="color: #008000;">i.num = 100;
<span style="color: #008000;">//<span style="color: #008000;">i.num2 = 200;
<span style="color: #008000;">//<span style="color: #008000;">System.out.println(i.num); <span style="color: #ff0000;">//无法为最终变量num分配值。只能是常量,并且是静态的。
<span style="color: #008000;">//<span style="color: #008000;">System.out.println(i.num2);<span style="color: #008000;">//<span style="color: #008000;">无法为最终变量num2分配值
<span style="color: #000000;"> System.out.println(Inter.num);
System.out.println(Inter.num2);
System.out.println("--------------"<span style="color: #000000;">);
}
}
类与类,类与接口,接口与接口的关系
<span style="color: #0000ff;">public <span style="color: #0000ff;">abstract <span style="color: #0000ff;">void<span style="color: #000000;"> show2();
} <span style="color: #0000ff;">interface Sister <span style="color: #0000ff;">extends<span style="color: #000000;"> Father,Mother {
}
<span style="color: #008000;">//<span style="color: #008000;">class Son implements Father,Mother <span style="color: #008000;">//<span style="color: #008000;">多实现
<span style="color: #0000ff;">class Son <span style="color: #0000ff;">extends Object <span style="color: #0000ff;">implements<span style="color: #000000;"> Father,Mother {
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> show() {
System.out.println("show son"<span style="color: #000000;">);
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> show2() {
System.out.println(</span>"show2 son"<span style="color: #000000;">);
}
}
<span style="color: #0000ff;">class<span style="color: #000000;"> InterfaceDemo3 {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
<span style="color: #008000;">//<span style="color: #008000;">创建对象
Father f = <span style="color: #0000ff;">new<span style="color: #000000;"> Son();
f.show();
<span style="color: #008000;">//<span style="color: #008000;"> f.show2(); <span style="color: #008000;">//<span style="color: #008000;">报错
<span style="color: #000000;">
Mother m = <span style="color: #0000ff;">new<span style="color: #000000;"> Son();
<span style="color: #008000;">//<span style="color: #008000;">m.show(); <span style="color: #008000;">//<span style="color: #008000;">报错
<span style="color: #000000;"> m.show2();
}
}
抽象类与接口的区别:
B:关系区别
类与类
继承,单继承
类与接口
实现,单实现,多实现
接口与接口
继承,单继承,多继承
C:设计理念区别
抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。
猫狗案例,加入跳高的额外功能
分析:从具体到抽象
猫:
姓名,年龄
吃饭,睡觉
狗:
姓名,年龄
吃饭,睡觉
由于有共性<a href="/tag/gongneng/" target="_blank" class="keywords">功能</a>,所以,我们抽取出一个<a href="/tag/fulei/" target="_blank" class="keywords">父类</a>:
动物:
姓名,年龄
吃饭();
睡觉(){}
猫:继承<a href="/tag/zidong/" target="_blank" class="keywords">自动</a>物
狗:继承<a href="/tag/zidong/" target="_blank" class="keywords">自动</a>物
跳高的额外<a href="/tag/gongneng/" target="_blank" class="keywords">功能</a>是一个新的扩展<a href="/tag/gongneng/" target="_blank" class="keywords">功能</a>,所以我们要定义一个接口
接口:
跳高
部分猫:实现跳高
部分狗:实现跳高
实现;
从抽象到具体
使用:
使用具体类
<span style="color: #008000;">*/<span style="color: #008000;">//<span style="color: #008000;">定义跳高接口
<span style="color: #0000ff;">interface<span style="color: #000000;"> Jumpping {
<span style="color: #008000;">//<span style="color: #008000;">跳高功能
<span style="color: #0000ff;">public <span style="color: #0000ff;">abstract <span style="color: #0000ff;">void<span style="color: #000000;"> jump();
}
<span style="color: #008000;">//<span style="color: #008000;">定义抽象类
<span style="color: #0000ff;">abstract <span style="color: #0000ff;">class<span style="color: #000000;"> Animal {
<span style="color: #008000;">//<span style="color: #008000;">姓名
<span style="color: #0000ff;">private<span style="color: #000000;"> String name;
<span style="color: #008000;">//<span style="color: #008000;">年龄
<span style="color: #0000ff;">private <span style="color: #0000ff;">int<span style="color: #000000;"> age;
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Animal() {}
</span><span style="color: #0000ff;">public</span> Animal(String name,<span style="color: #0000ff;">int</span><span style="color: #000000;"> age) {
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
</span><span style="color: #0000ff;">this</span>.age =<span style="color: #000000;"> age;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name) {
</span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getAge() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> age;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setAge(<span style="color: #0000ff;">int</span><span style="color: #000000;"> age) {
</span><span style="color: #0000ff;">this</span>.age =<span style="color: #000000;"> age;
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">吃饭(); -- 抽象</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> eat();
</span><span style="color: #008000;">//</span><span style="color: #008000;">睡觉(){}</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> sleep() {
System.out.println(</span>"睡觉觉了"<span style="color: #000000;">);
}
}
<span style="color: #008000;">//<span style="color: #008000;">具体猫类
<span style="color: #0000ff;">class Cat <span style="color: #0000ff;">extends<span style="color: #000000;"> Animal {
<span style="color: #0000ff;">public<span style="color: #000000;"> Cat(){}
</span><span style="color: #0000ff;">public</span> Cat(String name,<span style="color: #0000ff;">int</span><span style="color: #000000;"> age) {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(name,age);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">重写抽象那个<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> eat() {
System.out.println(</span>"猫吃鱼"<span style="color: #000000;">);
}
}
<span style="color: #008000;">//<span style="color: #008000;">具体狗类
<span style="color: #0000ff;">class Dog <span style="color: #0000ff;">extends<span style="color: #000000;"> Animal {
<span style="color: #0000ff;">public<span style="color: #000000;"> Dog(){}
</span><span style="color: #0000ff;">public</span> Dog(String name,age);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">重写抽象那个<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> eat() {
System.out.println(</span>"狗吃肉"<span style="color: #000000;">);
}
}
<span style="color: #008000;">//<span style="color: #008000;">有跳高功能的猫
<span style="color: #008000;">//<span style="color: #008000;">继承Cat类,又继承跳高接口
<span style="color: #0000ff;">class JumpCat <span style="color: #0000ff;">extends Cat <span style="color: #0000ff;">implements<span style="color: #000000;"> Jumpping {
<span style="color: #0000ff;">public<span style="color: #000000;"> JumpCat() {}
</span><span style="color: #0000ff;">public</span> JumpCat(String name,age);
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> jump() {
System.out.println(</span>"跳高猫"<span style="color: #000000;">);
}
}
<span style="color: #008000;">//<span style="color: #008000;">有跳高功能的狗
<span style="color: #008000;">//<span style="color: #008000;">继承Dog类,又继承跳高接口
<span style="color: #0000ff;">class JumpDog <span style="color: #0000ff;">extends Dog <span style="color: #0000ff;">implements<span style="color: #000000;"> Jumpping {
<span style="color: #0000ff;">public<span style="color: #000000;"> JumpDog() {}
</span><span style="color: #0000ff;">public</span> JumpDog(String name,age);
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> jump() {
System.out.println(</span>"跳高狗"<span style="color: #000000;">);
}
}
<span style="color: #0000ff;">class<span style="color: #000000;"> InterfaceTest {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
<span style="color: #008000;">//<span style="color: #008000;">定义跳高猫并测试
JumpCat jc = <span style="color: #0000ff;">new<span style="color: #000000;"> JumpCat();
jc.setName("哆啦A梦"<span style="color: #000000;">);
jc.setAge(3<span style="color: #000000;">);
System.out.println(jc.getName()+"---"+<span style="color: #000000;">jc.getAge());
jc.eat();
jc.sleep();
jc.jump();
System.out.println("-----------------"<span style="color: #000000;">);
JumpCat jc2 </span>= <span style="color: #0000ff;">new</span> JumpCat("加菲猫",2<span style="color: #000000;">);
System.out.println(jc2.getName()</span>+"---"+<span style="color: #000000;">jc2.getAge());
jc2.eat();
jc2.sleep();
jc2.jump();
</span><span style="color: #008000;">//</span><span style="color: #008000;">定义跳高狗并进行测试的事情自己完成。</span>
<span style="color: #000000;"> }
}