java中的接口和抽象类
2016-04-10 15:45
375 查看
最近看了一篇介绍接口和抽象类的文章,发现还不错。以下是对文章的总结和自己写的一个事例。总结的可能有些粗糙,建议直接看原文,文章地址:http://www.jiagoushuo.com/article/1000074.html#rd?sukey=ecafc0a7cc4a741b8d173e3714b0d37aed2569a28a62b5eb357b1573f19c80eef74baa1c870e39b9068f6b8bb5f6709c
抽象类和普通类的区别
![](http://img.blog.csdn.net/20160410152620513?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
现在有个鸟类,鸟的属性有种类,颜色,重量等,鸟的行为有吃,飞。但是有的鸟类只会奔跑不会飞(鸵鸟)。这时如果我们在一个Birds类中去定义飞和奔跑的行为,分别让只会飞的鸟和只会奔跑的鸟都去继承这个类,好像有些不太妥当。我们可以这样解决:定义一个抽象类,属性包括种类、颜色、重量,行为包括吃。在定义一个Fly接口,包含一个方法fly()。在定义一个Run接口,包含一个run()方法。如果只是会飞的鸟我们就继承Birds类,实现Fly接口。如果只是会奔跑的鸟我们就实现Birds类,实现Run接口。如果继承Birds类,实现了Fly和Run接口,那就是又会飞又会奔跑的鸟。实现代码如下:
上例可以看见将HummingBird的实例赋给了Birds类型的变量hummingBirds,这样使用hummingBirds是调用不到fly(),需要进行强制转换。其实我们也可以创建一个FlyBirds抽象类,这类继承了Birds类,实现了Fly接口,然后HummingBird在继承FlyBird类,这样就可不需要强制类型转换就可以调用fly()方法。其实我想说的是:实际编程的情况要比这个示例复杂得多,我们需要根据自己的情况和需求,灵活运用,而不是生搬硬套。像面向对象、设计模式这类的东西需要在理解的基础上,在结合自己的情况,灵活运用。
抽象类和普通类的区别
![](http://img.blog.csdn.net/20160410152424104?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
抽象类和接口的区别
事例
根据自己的理解写的一个实例。现在有个鸟类,鸟的属性有种类,颜色,重量等,鸟的行为有吃,飞。但是有的鸟类只会奔跑不会飞(鸵鸟)。这时如果我们在一个Birds类中去定义飞和奔跑的行为,分别让只会飞的鸟和只会奔跑的鸟都去继承这个类,好像有些不太妥当。我们可以这样解决:定义一个抽象类,属性包括种类、颜色、重量,行为包括吃。在定义一个Fly接口,包含一个方法fly()。在定义一个Run接口,包含一个run()方法。如果只是会飞的鸟我们就继承Birds类,实现Fly接口。如果只是会奔跑的鸟我们就实现Birds类,实现Run接口。如果继承Birds类,实现了Fly和Run接口,那就是又会飞又会奔跑的鸟。实现代码如下:
package com.zxy.Test20160410; public abstract class Birds { private String type; private String color; private double weight; public Birds(String type, String color, double weight){ this.setType(type); this.setColor(color); this.setWeight(weight); } public abstract void eat(); public void print(){ System.out.println("种类:"+this.getType()); System.out.println("颜色:"+this.getColor()); System.out.println("重量:"+this.getWeight()); } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } }
package com.zxy.Test20160410; public interface Fly { void fly(); }
package com.zxy.Test20160410; public interface Run { void run(); }
package com.zxy.Test20160410; /** * 蜂鸟 * @author hsoft3 * */ public class HummingBird extends Birds implements Fly { public HummingBird(String type, String color, double weight){ super(type, color, weight); } @Override public void fly() { System.out.println("我是"+this.getType()+",我会fly。"); } @Override public void eat() { System.out.print("我是"+this.getType()+",我吃花蜜。"); } }
package com.zxy.Test20160410; /** * 鸵鸟 * @author hsoft3 * */ public class OstrichBirds extends Birds implements Run { public OstrichBirds(String type, String color, double weight) { super(type, color, weight); } @Override public void run() { System.out.println("我是"+this.getType()+",我会奔跑。"); } @Override public void eat() { System.out.println("我是"+this.getType()+",我吃草。"); } }
package com.zxy.Test20160410; public class Test { public static void main(String [] args){ //蜂鸟 Birds hummingBirds = new HummingBird("蜂鸟", "彩虹色", 2.3); hummingBirds.print(); hummingBirds.eat(); Fly f = (Fly) hummingBirds; f.fly(); //鸵鸟 OstrichBirds ostrichBirds = new OstrichBirds("鸵鸟", "灰色", 200.2); ostrichBirds.print(); ostrichBirds.eat(); ostrichBirds.run(); System.out.println("是否会飞=>"+(hummingBirds instanceof Fly)); } }
上例可以看见将HummingBird的实例赋给了Birds类型的变量hummingBirds,这样使用hummingBirds是调用不到fly(),需要进行强制转换。其实我们也可以创建一个FlyBirds抽象类,这类继承了Birds类,实现了Fly接口,然后HummingBird在继承FlyBird类,这样就可不需要强制类型转换就可以调用fly()方法。其实我想说的是:实际编程的情况要比这个示例复杂得多,我们需要根据自己的情况和需求,灵活运用,而不是生搬硬套。像面向对象、设计模式这类的东西需要在理解的基础上,在结合自己的情况,灵活运用。
相关文章推荐
- fastjson处理接口时的一个问题
- 局域网与广域网接口标准
- RJ-45接口信号定义
- DVI 视频接口图文解析
- Ruby类继承、抽象类、类拓展混入、代理类实例
- 如何设置域名接口
- 通过C#实现自动售货机接口
- C#中IEnumerable接口用法实例分析
- C#中实现判断某个类是否实现了某个接口
- C#隐式/显示实现接口方法详解
- C#实现两接口中同名方法实例分析
- C#中实现Fluent Interface的三种方法
- 解析abstract与override究竟可不可以同时使用
- 详解C#中的接口属性以及属性访问器的访问限制
- C#中的ICustomFormatter及IFormatProvider接口用法揭秘
- C#接口实现方法实例分析
- Android编程学习之抽象类AbsListView用法实例分析
- 基于C# 中可以new一个接口?的问题分析
- C#中实现抽象类里建立静态方法
- 关于设计原则