抽象類與接口的區別及其原因?


抽象類與接口的區別是什么?想必大家對這個問題都不陌生,也是讓很多人頭疼的問題之一!因為我們面試之前都會鞏固復習這個問題,但是時隔不久又會忘記,主要的原因是沒有了解抽象類和接口的實質及作用。

抽象類:

抽象類的產生:在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.接口產生就是為了達到多重繼承的效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM