abstract与interface的区别
abstract的用法:
1 //通过abstract 关键字修饰的类叫抽象类。 2 abstract class Animal 3 { 4 String name; 5 String color; 6 7 abstract public void run ();//抽象方法是没有主体,没有方法的具体实现。 8 9 public void eat (){ 10 11 System.out.println("动物在吃东西"); 12 } 13 14 } 15 16 //一非抽象的类继承了抽象类,必须实现抽象类中的所有方法。 17 class Dog extends Animal 18 { 19 20 //需要重写父类中的run方法 21 22 public void run(){ 23 24 System.out.println(name + "跑的很快"); 25 } 26 } 27 class a 28 { 29 public static void main(String[] args) 30 { 31 32 Dog dog = new Dog(); 33 dog.name = "阿旺"; 34 dog.run(); 35 36 } 37 }
运行结果:
interface的用法:
/* 接口 : Java开发中比较常用。 接口作用 : 用来添加拓展功能。 为什么不用类呢?因为在java中是单继承的,有时候类是不能够满足 需求的 接口定义模式: 用interface关键字来表示接口 结构: interface 接口名{}; //如何实现接口中的方法。需要用实现来完成。 结构: class 类 implements 接口名1,接口名2...{ } java中是支持多实现,一个类可以实现多个接口。 接口作用 : 1.用来拓展功能 2.让程序解耦 3.定义约束 接口的使用注意事项: 1.接口是一个特殊的类,是可以定义属性和方法。 2.属性默认是用final修饰的 : public static final 实际上是一个常量。 3.方法都是抽象的 : abstract public 4.接口不能创建对象。 5.接口没有构造方法。 6.接口是给类去实现的,非抽象类实现接口时,必须将接口中的方法都实现了。 */ //定义一个橡皮擦的接口 interface Eraser { int a = 10; // 在接口定义的变量必须初始化。接口中的变量默认是final修饰的 static int b=0; //这样也是可以的,只要有数值 // int c; //这个没有初始化,会报错 //定义擦字行为 //定义在接口中的方法是不需要实现的 //接口中的方法都是抽象方法。 public void clear(); //默认是用abstract修饰的 } interface Pancil { public void write(); } class EraserAndPencil implements Pancil , Eraser { //一个类如果实现了一个接借口,需要将所有的抽象方法都实现 //写字的方法 public void write() { System.out.println(a+"铅笔可以写字"); } //擦字的方法 public void clear(){ System.out.println("铅笔还可以擦字"); } } class a { public static void main(String[] args) { EraserAndPencil ep = new EraserAndPencil(); ep.write(); ep.clear(); } }
运行效果图上:
在多态中接口的形式
1 /* 2 所谓金矿: 父类指针指向子类对象 3 多态的另一种表现形式: 4 接口的引用类型指向实现类。 // 多态的另一种表现形式。 5 6 实现关系下多态: 7 接口 变量 = new 接口实现类对象。 8 9 */ 10 //定义一个接口 可以做增删改查的功能 11 interface Dao 12 { 13 14 public void add(); 15 public void del(); 16 public void upDate(); 17 public void search(); 18 } 19 20 class UserDao implements Dao 21 { 22 23 public void add(){ 24 System.out.println("添加"); 25 } 26 public void del(){ 27 System.out.println("删除"); 28 } 29 public void upDate(){ 30 System.out.println("修改"); 31 } 32 public void search(){ 33 34 System.out.println("查找"); 35 } 36 37 } 38 39 class a 40 { 41 public static void main(String[] args) 42 { 43 //实现下的多态的表现 44 // Dao 接口 , 接口是不能过创建对象的。 45 Dao d = new UserDao(); // 在Java中用的比较多。 比如:List就是接口 46 d.add(); 47 //多态的形式。 Java实际的例子 48 //List list = new ArrayList(); 49 50 } 51 }
效果图:
结论:
两者的区别:
1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据
成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,
interface表示的是"like-a"关系。
4.接口一般用于在抽象类中没有可供继承的默认实现时(即没有实例变量和默认方法实现)代替该类。
5.abstract class是另一种契约形式,是设计对实现的要求;而接口是服务器对客户端的要求。
6.abstract class是一个基类,不能被实例化;接口是个声明,每个对应接口的类都要实现方法。
7. 一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法
即可,这是抽象类的一个优点
8. 如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为它们所实现的方法名已经不存在了,这是
接口的一个缺点;而抽象类中如果有个非抽象方法改了,就不存在这个问题,只是为子类添加了一个新的方法。
9. 看前面两点,似乎抽象类要比接口有着更多的优点,但它却有着一个难以弥补的缺点:就是一个子类只能有一个父类。A extends B 。
这样A就拥有了B的所有方法和功能,但当A还想拥有C的功能的时候。就不能通过 A extends C 来实现,而需要走一些弯路。目前系统架构
的趋势就是由针对抽象(借口,抽象类)而不是具体编程,并且将功能尽可能的细分。这就需要通过实现多个接口的方式来实现,显然,抽
象类无法提供这样的功能。从系统重构的角度来说,一个具体类抽象出接口是十分方便的。只需要写一个接口,里面定义具体类的所有方法,
然后在为这个具体类implement这个接口就可以了。而抽象类就要复杂的多,比如说 B extends A , C extends B 如果想要为c抽象出一个抽象
类D的话,就需要找到它的最顶层A来从头做起,因为无法做到C extends D