JAVA基础__接口、抽象类
前景
今天还看了java核心技术的接口部分,一点点,但是感觉这部分上面记载的东西有点不太懂,于是在网上找了个小练习来加深下自己的理解
接口
接口主要来描述类具有的功能。可以看做是一个抽象的类型
接口的特性
1、接口不能被实例化,这点和抽象类是一样的
2、接口的方法会被指定为public stract 接口里面的变量只能使用常量也就是public static final
3、接口中的抽象方法最终被实现接口的实际类来实现
4、接口可以弥补类无法实现多继承的缺陷
5、虽然不能构造接口的对象,但是能使用接口变量来引用实现接口的类的实例对象
6、接口也可以实现多态
小例子,模拟打印机
墨盒:黑色,彩色
纸张:A4,B5
打印机
墨盒接口
package interfaces;
/** * 墨盒接口 * @author dream * */
public interface Ink {
public void ink();
}
纸张接口
package interfaces;
/** * 纸张接口 * @author dream * */
public interface Paper {
public void paper();
}
彩色墨盒
package interfaces;
public class ColorfulInk implements Ink {
@Override
public void ink()
{
System.out.println("选择彩色墨盒");
}
}
黑白墨盒
package interfaces;
public class BlackInk implements Ink {
@Override
public void ink()
{
System.out.println("选择黑白墨盒");
}
}
A4
package interfaces;
public class A4Paper implements Paper {
@Override
public void paper() {
System.out.println("放入A4纸");
}
}
B5
package interfaces;
public class B5Paper implements Paper {
@Override
public void paper()
{
System.out.println("放入B5纸");
}
}
Printer
package interfaces;
public class Printer
{
private Ink ink;
private Paper paper;
public Printer(Ink ink, Paper paper)
{
this.ink = ink;
this.paper = paper;
}
public void print()
{
ink.ink();
paper.paper();
System.out.println("打印机开始工作");
}
}
Test
package interfaces;
public class Test {
public static void main(String[] args)
{
ColorfulInk color = new ColorfulInk();
A4Paper a4 = new A4Paper();
Printer printer = new Printer(color, a4);
printer.print();
}
}
运行结果
选择彩色墨盒
放入A4纸
打印机开始工作
小分析
这个例子简单是简单,却说明了几个小问题
1、接口定义的抽象方法由实现接口的类去实现
2、 接口变量能够去引用一个实现接口的类的实例对象,这就是为什么color这个彩色墨盒的对象能够传递给接口变量ink的原因,不是嘛QAQ
3、 接口的多态,接口变量引用了color对象,运行时候,自动执行的color对象的ink方法,而不是接口的方法。运行时多态也体现出来了
个人感觉在某种程度上确实和抽象类很像啊,下面就来探讨一下这两者的区别
抽象类和接口的区别
抽象类的几点特性
1、抽象类不能被实例化,实例化交给子类
2、抽象方法子类必须重写
3、抽象类中可以有抽象方法也可以有实例方法
4、子类的抽象方法不能与父类的抽象方法重名
5、abstract和final是天敌,final不能被继承,abstract必须被继承
6、abstract不能和private、static、final共同修饰一个方法。因为abstract是需要被子类继承然后重写的,private就不能被继承、static无法被子类重写、final无法被继承
区别:
语法结构
上抽象类中可以有成员数据,各种类型的都OK,也可以有自己的非抽象方法,接口中只能定义抽象方法,和publi static final(就是常量)看上去接口是抽象类的一个特例哈,一个类只能继承一个抽象类,但是可以实现多个接口
设计角度
- 抽象程度:抽象类是从整体上对这个类进行抽象,抽象程度高,而接口只是抽象这个类的某一部分,可以看做是抽象它的一部分行为
- 跨度:抽象类是一组具有相似的类之间,接口可以是没有关系之间的类,有点像python的鸭子类型,比如鸟可以实现飞这个接口,飞机也能实现飞这个接口,但是它们两个类之间可以认为没有多大的关系,但是抽象类就不一样了。
- 设计层次:对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。比如我们只有一个猫类在这里,如果你这是就抽象成一个动物类,是不是设计有点儿过度?我们起码要有两个动物类,猫、狗在这里,我们在抽象他们的共同点形成动物抽象类吧!所以说抽象类往往都是通过重构而来的!但是接口就不同,比如说飞,我们根本就不知道会有什么东西来实现这个飞接口,怎么实现也不得而知,我们要做的就是事前定义好飞的行为接口。所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。
总结
总的来说最重要的是掌握它们的设计理念虽然是两种抽象,但是,一个是is-a的关系一个是like-a的关系,都是概念,但是总结的已经非常清楚了!这个弄明白了,之后才能更好的学习~基础很重要啊!不敢图快,囫囵吞枣咯~不然以后还是很困难的
还没有评论,来说两句吧...