當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java Inheritance和Composition的區別用法及代碼示例


繼承
當我們想要創建一個新類並且已經有一個類包含我們想要的一些代碼時,我們可以從現有類派生新類。這樣做,我們可以重用現有類的字段和方法,而不必自己編寫它們。

子類從其超類繼承所有成員(字段、方法和嵌套類)。構造函數不是成員,因此不能被子類繼承,但可以從子類調用超類的構造函數。

繼承的類型有:

  1. 單一繼承
  2. Multi-level繼承
  3. 多重繼承
  4. 混合繼承
  5. 層次繼承

繼承示例:

Java


class A {
    int a, b;
    public void add(int x, int y)
    {
        a = x;
        b = y;
        System.out.println(
            "addition of a + b is:"
            + (a + b));
    }
}
class B extends A {
    public void sum(int x, int y)
    {
        add(x, y);
    }
    // Driver Code
    public static void main(String[] args)
    {
        B b1 = new B();
        b1.sum(5, 6);
    }
}

輸出:

addition of a+b is:11 

這裏,類B是派生類,繼承了基類A的屬性(add方法)。

作品
該組合還提供了代碼可重用性,但這裏的區別是我們不為此擴展類。

組成示例:
讓我們舉個例子 Library

Java


// Java program to illustrate
// the concept of Composition
import java.io.*;
import java.util.*;
// class book
class Book {
    public String title;
    public String author;
    Book(String title, String author)
    {
        this.title = title;
        this.author = author;
    }
}
// Library class contains
// list of books.
class Library {
    // reference to refer to the list of books.
    private final List<Book> books;
    Library(List<Book> books)
    {
        this.books = books;
    }
    public List<Book> getTotalBooksInLibrary()
    {
        return books;
    }
}
// main method
class GFG {
    public static void main(String[] args)
    {
        // Creating the Objects of Book class.
        Book b1 = new Book(
            "EffectiveJ Java",
            "Joshua Bloch");
        Book b2 = new Book(
            "Thinking in Java",
            "Bruce Eckel");
        Book b3 = new Book(
            "Java: The Complete Reference",
            "Herbert Schildt");
        // Creating the list which contains the
        // no. of books.
        List<Book> books = new ArrayList<Book>();
        books.add(b1);
        books.add(b2);
        books.add(b3);
        Library library = new Library(books);
        List<Book> bks = library.getTotalBooksInLibrary();
        for (Book bk : bks) {
            System.out.println("Title : "
                               + bk.title + " and "
                               + " Author : "
                               + bk.author);
        }
    }
}

輸出:

Title : EffectiveJ Java and  Author : Joshua Bloch
Title : Thinking in Java and  Author : Bruce Eckel
Title : Java: The Complete Reference and  Author : Herbert Schildt

繼承和組合之間的區別:

S.NO 繼承 作品
1. 在繼承中,我們定義要繼承的類(超類),最重要的是它不能在運行時更改 而在組合中,我們隻定義一個我們想要使用的類型,它可以保存其不同的實現,也可以在運行時更改。因此,組合比繼承靈活得多。
2. 這裏我們隻能擴展一個類,換句話說,不能擴展多個類,因為java不支持多重繼承。
而組合允許使用不同類的函數。
3. 在繼承中,我們需要父類來測試子類。 組合允許獨立於父類或子類來測試我們正在使用的類的實現。
4. 繼承不能擴展最終類。 而組合甚至允許從最終類重用代碼。
5. 它是一個is-a關係。 雖然它是一個has-a關係。


相關用法


注:本文由純淨天空篩選整理自Pragya_Chaurasia大神的英文原創作品 Difference between Inheritance and Composition in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。