抽象类和接口的区别

这个也是很多笔试或者面试中经常出现的一个问题

首先我们要理解抽象类是什么

在面向对象领域中,万物皆对象,同时所有的对象都是通过类来描述。但是并不是所有的类都是来描述对象的

比如说new Animal(),这是产生了一个新的类,但是animal是什么,我们不知道,他没有具体的动物的概念,所以他是一个抽象类。需要cat、dog这种具体的动物来进行描述

  抽象类需要其他具体的类来支撑。

  在面向对象领域中,由于抽象的概念在问题领域没有对应的具体概念,所以表现抽象概念的抽象类不能被实例化。

  抽象类体现类数据抽象,是实现多态的机制,这组抽象方法的具体由它的派生类来实现。抽象类的存在就是为了继承

  抽象类的注意点:

   1、抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。

         2、抽象方法必须由子类来进行重写。

         3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

         4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。

         5、子类中的抽象方法不能与父类的抽象方法同名。

         6、abstract不能与final并列修饰同一个类。

实例:

 1 public abstract class Animal {  
 2     public abstract void eat();  
 3 }  
 4   
 5 public class Cat extends Animal{  
 6   
 7     @Override  
 8     public void eat() {  
 9         System.out.println("猫吃鱼...");  
10     }  
11 }  
12   
13 public class Dog extends Animal{  
14   
15     @Override  
16     public void eat() {  
17         System.out.println("狗吃骨头...");  
18     }  
19   
20 }  
21   
22 public class Test {  
23   
24     public static void main(String[] args) {  
25         Animal a1 = new Cat();  
26         Animal a2 = new Dog();  
27           
28         a1.eat();  
29         a2.eat();  
30     }  
31 }  
32   
33 --------------------------------------------------------------------  
34 Output:  
35 猫吃鱼...
36 狗吃骨头...
   Animal a1 = new Cat();  
   Animal a2 = new Dog(); 
向上转型
接口
接口本身不是类,所以不能被实例化,我们只能new它的实现类

实现该接口的实现类必须要实现接口的所有方法。

implement实现接口,接口实际上类似抽象类的一种延续,Java中的单继承,但是接口可以多实现

 在使用接口过程中需要注意如下几个问题:

         1、Interface的所有方法访问权限自动被声明为public。确切的说只能为public,当然你可以显示的声明为protected、private,但是编译会出错!

         2、接口中可以定义“成员变量”,或者说是不可变的常量,因为接口中的“成员变量”会自动变为为public static final。可以通过类命名直接访问:ImplementClass.name。

         3、接口中不存在实现的方法。

         4、实现接口的非抽象类必须要实现该接口的所有方法。抽象类可以不用实现。

         5、不能使用new操作符实例化一个接口,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象。可以使用 instanceof 检查一个对象是否实现了某个特定的接口。例如:if(anObject instanceof Comparable){}。

         6、在实现多接口的时候一定要避免方法名的重复。

 
原文地址:https://www.cnblogs.com/Darius-Bennett/p/7849556.html