天天都会写接⼝(interface),但它的⽤途和好处有多少⼈能
说得清楚?
点击上⽅ ""关注, 星标或置顶⼀起成长
每天凌晨00点00分, 第⼀时间与你相约
每⽇英⽂
Never get too attached to anyone becau attachments leads to expectations and expectations leads to disappointments.
不要太过于依赖⼀个⼈,因为依赖,所以期望;因为期望,所以会失望。
每⽇掏⼼话
正是因为有了残疾,我们才有、有希望,当我们为和希望⽽付出同时,就已经拥有⼀个完美的⾃我了。
来⾃:nvd11 | 责编:乐乐
链接:blog.csdn/nvd11/article/details/41129935
往⽇回顾:
正⽂
孕检试纸
⼀. 对接⼝的三个疑问
很多初学者都⼤概清楚interface是什么, 我们可以定义1个接⼝, 然后在⾥⾯定义⼀两个常量(static final) 或抽象⽅法.
然后以后写的类就可以实现这个接⼝, 重写⾥⾯的抽象⽅法.
个人学期总结
很多⼈说接⼝通常跟多态性⼀起存在.
接⼝的⽤法跟抽象类有点类似.
但是为何要这么做呢.
1. 为什么不直接在类⾥⾯写对应的⽅法, ⽽要多写1个接⼝(或抽象类)?
2. 既然接⼝跟抽象类差不多, 什么情况下要⽤接⼝⽽不是抽象类.
3. 为什么interface叫做接⼝呢? 跟⼀般范畴的接⼝例如usb接⼝, 显卡接⼝有什么联系呢?
⼆. 接⼝引⽤可以指向实现该接⼝的对象
我们清楚接⼝是不可以被实例化, 但是接⼝引⽤可以指向1个实现该接⼝的对象.
也就是说.
假如类A impletments 了接⼝B
男人的香气那么下⾯是合法的:
B b = new A();
也可以把A的对象强制转换为 接⼝B的对象
A a = new A90;
B b = (B)a;
这个特性是下⾯内容的前提.推荐:⼀百期⾯试题汇总
三. 抽象类为了多态的实现.
第1个答案⼗分简单, 就是为了实现多态.
下⾯⽤详细代码举1个例⼦.
先定义⼏个类,
动物(Animal) 抽象类
爬⾏动物(Reptile) 抽象类 继承动物类
哺乳动物(Mammal) 抽象类 继承动物类
⼭⽺(Goat) 继承哺乳动物类
⽼虎(Tiger) 继承哺乳动物类
兔⼦(Rabbit) 继承哺乳动物类
蛇(Snake) 继承爬⾏动物类
农夫(Farmer) 没有继承任何类 但是农夫可以给Animal喂⽔(依赖关系)
3.1 Animal类
这个是抽象类, 显⽰也没有"动物" 这种实体
类⾥⾯包含3个抽象⽅法.
1.静态⽅法getName()
2.移动⽅法move(), 因为动物都能移动. 但是各种动物有不同的移动⽅法, 例如⽼虎和⼭⽺会跑着移动, 兔⼦跳着移动, 蛇会爬着移动.关注公众号程序员⼩乐回复关键字“Python进阶”获取Python学习进阶资料。
作为抽象基类, 我们不关⼼继承的实体类是如何移动的, 所以移动⽅法move()是1个抽象⽅法. 这个就是多态的思想.
3.喝⽔⽅法drink(), 同样, 各种动物有各种饮⽔⽅法. 这个也是抽象⽅法.
代码:
abstract class Animal{
public abstract String getName();
public abstract void move(String destination);
public abstract void drink();
}
3.2 Mammal类
这个是继承动物类的哺乳动物类, 后⾯的⽼虎⼭⽺等都继承⾃这个类.
Mammal类⾃然继承了Animal类的3个抽象⽅法, 实体类不再⽤写其他代码.
abstract class Mammal extends Animal{
}
3.3 Reptile类溶解度四要素
这个是代表爬⾏动物的抽象类, 同上, 都是继承⾃Animal类.
abstract class Reptile extends Animal{
}
3.4 Tiger类
⽼虎类就是1个实体类, 所以它必须重写所有继承⾃超类的抽象⽅法, ⾄于那些⽅法如何重写, 则取决于⽼虎类本⾝.
class Tiger extends Mammal{
private static String name = "Tiger";
public String getName(){
return this.name;
}
public void move(String destination){
System.out.println("Goat moved to " + destination + ".");
}
public void drink(){
System.out.println("Goat lower it's head and drink.");
}
}
如上, ⽼虎的移动⽅法很普通, 低头喝⽔.
3.5 Goat类和 Rabbit类
这个两个类与Tiger类似, 它们都继承⾃Mammal这个类.
class Goat extends Mammal{
private static String name = "Goat";
public String getName(){
return this.name;
}
常熟
public void move(String destination){
System.out.println("Goat moved to " + destination + ".");
}
public void drink(){
System.out.println("Goat lower it's head and drink.");
}
}
兔⼦: 喝⽔⽅法有点区别
class Rabbit extends Mammal{
private static String name = "Rabbit";
public String getName(){
return this.name;
}
public void move(String destination){
System.out.println("Rabbit moved to " + destination + ".");
}
public void drink(){
System.out.println("Rabbit put out it's tongue and drink.");
}
}
3.6 Snake类
蛇类继承⾃Reptile(爬⾏动物)
移动⽅法和喝⽔⽅法都跟其他3动物有点区别.
class Snake extends Reptile{
private static String name = "Snake";
public String getName(){
return this.name;
}
public void move(String destination){
System.out.println("Snake crawled to " + destination + ".");
}
public void drink(){
System.out.println("Snake dived into water and drink.");
}
}
3.7 Farmer 类
Farmer类不属于 Animal类族, 但是Farmer农夫可以给各种动物, 喂⽔. Farmer类有2个关键⽅法, 分别是
bringWater(String destination)
把⽔带到某个地点
另1个就是feedWater了,
feedWater这个⽅法分为三步:
⾸先是农夫带⽔到饲养室,(bringWater())
接着被喂⽔动物⾛到饲养室,(move())
资本主义接着动物喝⽔(drink())
Farmer可以给⽼虎喂⽔, 可以给⼭⽺喂⽔, 还可以给蛇喂⽔, 那么feedWater()⾥的参数类型到底是⽼虎,⼭⽺还是蛇呢.实际上因为⽼虎,⼭⽺, 蛇都继承⾃Animal这个类, 所以feedWater⾥的参数类型设为Animal就可以了.
Farmer类⾸先叼⽤bringWater("饲养室"),⾄于这个动物是如何⾛到饲养室和如何喝⽔的, Farmer类则不⽤关⼼.
因为执⾏时, Animal超类会根据引⽤指向的对象类型不同 ⽽ 指向不同的被重写的⽅法. 这个就是多态的意义.
代码如下:
class Farmer{
public void bringWater(String destination){
System.out.println("Farmer bring water to " + destination + ".");
}
public void feedWater(Animal a){ // polymorphism
this.bringWater("Feeding Room");
a.drink();
鸡几岁}
}
3.7 执⾏农夫喂⽔的代码.
下⾯的代码是1个农夫依次喂⽔给⼀只⽼虎, ⼀只⽺, 以及⼀条蛇
public static void f(){
Farmer fm = new Farmer();
Snake sn = new Snake();
Goat gt = new Goat();
Tiger tg = new Tiger();
fm.feedWater(sn);
fm.feedWater(gt);
fm.feedWater(tg);
}
农夫只负责带⽔过去制定地点, ⽽不必关⼼⽼虎, 蛇, ⼭⽺它们是如何过来的. 它们如何喝⽔. 这些农夫都不必关⼼.
中石化加油卡办理只需要调⽤同1个⽅法feedWater.
执⾏结果: