抽象类与接口的区别及其原因?

抽象类与接口的区别是什么?想必大家对这个问题都不陌生,也是让很多人头疼的问题之一!因为我们面试之前都会巩固复习这个问题,但是时隔不久又会忘记,主要的原因是没有了解抽象类和接口的实质及作用。

抽象类:

抽象类的产生:在java面向对象设计编程中,抽象类产生于类的继承;如Student类和Teacher类都可以继承Person类,而现实生活中有具体的学生(Student)、教师(Teacher),而没有一种叫人类(Person)的人,所以Person类就属于抽象中的概念,

进而Person类不具有实例化的意义,通常就会把Person类定义为抽象类来限制其实例化。

抽象类和抽象方法的定义:

 1 /**
 2  * 父类Person
 3  * @author bianxc
 4  */
 5 public abstract class Person {
 6 
 7     protected String name = "";
 8     protected int age = 0;
 9     
10     public Person(String name, int age) {
11         this.name = name;
12         this.age = age;
13     }
14 
15     /**
16      * 抽象方法,展示个人信息
17      */
18     public abstract void showInfo();
19     
20     /**
21      * 抽象类中可以有抽象方法,也可以有方法实现
22      */
23     public void otherMethod() {
24         System.out.println("我是方法实现");
25     }
26 }
27 
28 /**
29  * 子类Student
30  * @author bianxc
31  */
32 public class Student extends Person {
33     
34     private String grade = "";
35 
36     public Student(String name, int age, String grade) {
37         super(name, age);
38         this.grade = grade;
39     }
40 
41     @Override
42     public void showInfo() {
43         System.out.println("姓名:" + super.name + ",年龄:" + ","
44                 + "年龄:" + super.age + ",年级:" + this.grade);
45     }
46 }

 

注意:抽象类中可以有零到多个抽象方法。当父类中定义了抽象方法,则子类(非抽象类)必须重写该抽象方法,否则子类必须定义为抽象类。

总结:

1.抽象类不能被实例化

2.抽象类中可以有零到多个抽象方法,也可以有普通方法

3.如果一个类中包含抽象方法,那么类必须定义为抽象类

4.抽象类中可以有构造方法

接口:

接口的产生:java面向对象中,类的继承属于 is a 关系,只支持单继承;如果学生又具有一种特殊行为考试,就不能让Student类继承Person类又继承exam类。

接口的定义:

 1 /**
 2  * 考试接口
 3  * @author bianxc
 4  */
 5 public interface Exam {
 6 
 7     void test();
 8 }
 9 
10 /**
11  * 子类Student
12  * @author bianxc
13  */
14 public class Student extends Person implements Exam {
15     
16     private String grade = "";
17 
18     public Student(String name, int age, String grade) {
19         super(name, age);
20         this.grade = grade;
21     }
22 
23     @Override
24     public void showInfo() {
25         System.out.println("姓名:" + super.name + ",年龄:" + ","
26                 + "年龄:" + super.age + ",年级:" + this.grade);
27     }
28 
29     @Override
30     public void test() {
31         System.out.println("学生正在考试");
32     }
33 }

总结:

1.接口可以理解为一个特殊的抽象类(不能被实例化),但又和抽象类以完全不同的语法定义

2.接口中只能定义常量,不能定义变量;接口中的属性默认用 public static final 修饰,接口中的属性都是全局静态常量(由于静态常量不能重新被赋值,因此接口中不允许存在构造方法)

3.接口中的方法全部都是抽象方法,因此类实现接口必须重写接口中的所有方法,否则必须定义为抽象类

4.接口可以实现多继承,但是接口不能继承类;一个类只能继承一个父父类

5.接口产生就是为了达到多重继承的效果

posted @ 2019-12-27 14:21  一问叁不知  阅读(1361)  评论(0编辑  收藏  举报