抽象类和接口设计_如何设计类和接口
抽象類和接口設(shè)計(jì)
本文是我們名為“ 高級(jí)Java ”的學(xué)院課程的一部分。
本課程旨在幫助您最有效地使用Java。 它討論了高級(jí)主題,包括對(duì)象創(chuàng)建,并發(fā),序列化,反射等。 它將指導(dǎo)您完成Java掌握的旅程! 在這里查看 !
目錄
1.簡介 2.接口 3.標(biāo)記接口 4.功能接口,默認(rèn)方法和靜態(tài)方法 5.抽象類 6.不可變的類 7.匿名類 8.可見度 9.繼承 10.多重繼承 11.繼承與組成 12.封裝 13.期末課程和方法 14.接下來是什么 15.下載源代碼1.簡介
不管您使用哪種編程語言(這里Java也不例外),遵循良好的設(shè)計(jì)原則是編寫干凈,可理解,可測試的代碼并提供長期有效且易于維護(hù)的解決方案的關(guān)鍵因素。 在本教程的這一部分中,我們將討論Java語言提供的基本構(gòu)建塊,并介紹一些設(shè)計(jì)原則,以幫助您做出更好的設(shè)計(jì)決策。
更確切地說,我們將討論與默認(rèn)的方法 接口和接口 (Java 8的新功能), 抽象和final 類,不可變類,繼承,組成和重溫了一下可見性 (或可訪問)的規(guī)則,我們有部分短暫觸及本教程的第1部分, 如何創(chuàng)建和銷毀對(duì)象 。
2.接口
在面向?qū)ο蟮木幊讨?#xff0c;接口的概念構(gòu)成了契約驅(qū)動(dòng)(或基于契約)開發(fā)的基礎(chǔ)。 簡而言之,接口定義方法的集合(契約),并且聲稱支持該特定接口的每個(gè)類都必須提供這些方法的實(shí)現(xiàn):一個(gè)非常簡單但功能強(qiáng)大的想法。
許多編程語言確實(shí)具有一種或另一種形式的接口,但是Java特別為此提供了語言支持。 讓我們看一下Java中的簡單接口定義。
package com.javacodegeeks.advanced.design;public interface SimpleInterface {void performAction(); }在上面的代碼片段中,我們命名為SimpleInterface的接口SimpleInterface聲明了一個(gè)名為performAction方法。 接口相對(duì)于類的主要區(qū)別在于接口概述了聯(lián)系方式(聲明方法),但未提供其實(shí)現(xiàn)。
但是,Java中的接口可能比這更復(fù)雜:它們可以包括嵌套的接口,類,枚舉,注釋(該枚舉和注釋將在本教程的第5部分中詳細(xì)介紹如何以及何時(shí)使用Enums和Annotations )和常量。 。 例如:
package com.javacodegeeks.advanced.design;public interface InterfaceWithDefinitions {String CONSTANT = "CONSTANT";enum InnerEnum {E1, E2;}class InnerClass {}interface InnerInterface {void performInnerAction();}void performAction(); }在這個(gè)更復(fù)雜的示例中,存在一些關(guān)于嵌套構(gòu)造和方法聲明的接口隱式施加的約束,而Java編譯器則強(qiáng)制執(zhí)行這些約束。 首先,即使沒有明確說明,該接口中的每個(gè)聲明都是公共的 (并且只能是public ,有關(guān)可見性和可訪問性規(guī)則的更多詳細(xì)信息,請(qǐng)參閱Visibility部分)。 因此,以下方法聲明是等效的:
public void performAction(); void performAction();值得一提的是,接口中的每個(gè)方法都隱式聲明為abstract ,甚至這些方法聲明也是等效的:
public abstract void performAction(); public void performAction(); void performAction();至于常量字段聲明,除了是public ,它們是隱式static和final因此以下聲明也等效:
String CONSTANT = "CONSTANT"; public static final String CONSTANT = "CONSTANT";最后,除了public之外,嵌套類,接口或枚舉還隱式聲明為static 。 例如,這些類聲明也等效:
class InnerClass { }static class InnerClass { }您將選擇哪種樣式是個(gè)人喜好,但是了解這些簡單的界面質(zhì)量可以使您避免不必要的鍵入。
3.標(biāo)記接口
標(biāo)記接口是一種特殊的接口,沒有定義方法或其他嵌套結(jié)構(gòu)。 在本教程的第2部分中 ,我們已經(jīng)看到了標(biāo)記接口的一個(gè)示例,該接口使用所有對(duì)象共有的方法 ,即Cloneable接口。 這是在Java庫中定義的方式:
public interface Cloneable { }標(biāo)記接口本身并不是契約,而是某種有用的技術(shù),用于“附加”或“綁定”班級(jí)的某些特定特征。 例如,對(duì)于Cloneable ,該類被標(biāo)記為可用于克隆,但是應(yīng)該或可以做的方式不是該接口的一部分。 標(biāo)記器接口的另一個(gè)非常著名且廣泛使用的示例是Serializable :
public interface Serializable { }此接口將類標(biāo)記為可用于序列化和反序列化,并且再次,它未指定可以或應(yīng)該完成的方式。
標(biāo)記器接口雖然不能滿足作為合同的接口的主要目的,但它們?cè)诿嫦驅(qū)ο蟮脑O(shè)計(jì)中占有一席之地。
4.功能接口,默認(rèn)方法和靜態(tài)方法
隨著Java 8的發(fā)布 ,接口獲得了非常有趣的新功能:靜態(tài)方法,默認(rèn)方法和lambda(功能性接口)的自動(dòng)轉(zhuǎn)換。
在接口一節(jié)中,我們強(qiáng)調(diào)了以下事實(shí):Java中的接口只能聲明方法,而不能提供其實(shí)現(xiàn)。 使用默認(rèn)方法不再是事實(shí):接口可以使用default關(guān)鍵字標(biāo)記方法并為其提供實(shí)現(xiàn)。 例如:
package com.javacodegeeks.advanced.design;public interface InterfaceWithDefaultMethods {void performAction();default void performDefaulAction() {// Implementation here} }作為實(shí)例級(jí)別,默認(rèn)方法可以被每個(gè)接口實(shí)現(xiàn)者覆蓋,但是從現(xiàn)在開始,接口可能還包括static方法,例如:
package com.javacodegeeks.advanced.design;public interface InterfaceWithDefaultMethods {static void createAction() {// Implementation here} }可能有人說在接口中提供實(shí)現(xiàn)會(huì)破壞基于契約的開發(fā)的全部目的,但是將這些功能引入Java語言有很多原因,無論它們多么有用或令人困惑,它們都可以為您提供幫助用。
功能接口是另外一個(gè)故事,并且事實(shí)證明它們是該語言的非常有用的附加組件。 基本上,功能接口是僅聲明了一個(gè)抽象方法的接口。 Java標(biāo)準(zhǔn)庫中的Runnable接口就是這個(gè)概念的一個(gè)很好的例子:
@FunctionalInterface public interface Runnable {void run(); }Java編譯器以不同的方式對(duì)待功能接口,并且能夠?qū)ambda函數(shù)轉(zhuǎn)換為有意義的功能接口實(shí)現(xiàn)。 讓我們看一下以下函數(shù)定義:
public void runMe( final Runnable r ) {r.run(); }要在Java 7及以下版本中調(diào)用此函數(shù),應(yīng)提供Runnable接口的實(shí)現(xiàn)(例如,使用Anonymous類 ),但是在Java 8中,只需使用lambda語法傳遞run()方法實(shí)現(xiàn)即可:
runMe( () -> System.out.println( "Run!" ) );此外, @FunctionalInterface批注(批注將在本教程的第5部分“ 如何以及何時(shí)使用Enums和Annotations”中詳細(xì)介紹 )提示編譯器驗(yàn)證接口僅包含一種抽象方法,以便對(duì)接口中引入的任何更改未來將不會(huì)打破這一假設(shè)。
5.抽象類
Java語言支持的另一個(gè)有趣的概念是抽象類的概念。 抽象類在某種程度上類似于Java 7中的接口,并且與Java 8中具有默認(rèn)方法的接口非常接近。與常規(guī)類相比,抽象類無法實(shí)例化,但是可以被子類化(請(qǐng)參閱繼承一節(jié)以獲取更多詳細(xì)信息)。 更重要的是,抽象類可能包含抽象方法:沒有實(shí)現(xiàn)的特殊方法,非常類似于接口。 例如:
package com.javacodegeeks.advanced.design;public abstract class SimpleAbstractClass {public void performAction() {// Implementation here}public abstract void performAnotherAction(); }在此示例中,類SimpleAbstractClass被聲明為abstract并且還具有一個(gè)abstract方法聲明。 當(dāng)實(shí)現(xiàn)細(xì)節(jié)的大部分甚至部分可以被許多子類共享時(shí),抽象類非常有用。 但是,它們?nèi)匀怀ㄩ_了大門,并允許通過抽象方法自定義每個(gè)子類的固有行為。
值得一提的是,與只能包含public聲明的接口相反,抽象類可以使用可訪問性規(guī)則的全部功能來控制抽象方法的可見性(有關(guān)更多詳細(xì)信息,請(qǐng)參見“ 可見性和繼承 ”部分)。
6.不可變的類
不可變性在當(dāng)今的軟件開發(fā)中變得越來越重要。 多核系統(tǒng)的興起引起了很多與數(shù)據(jù)共享和并發(fā)相關(guān)的擔(dān)憂(在第9部分 , 并發(fā)最佳實(shí)踐中 ,我們將詳細(xì)討論那些主題)。 但是,肯定會(huì)出現(xiàn)一件事:可變狀態(tài)的更少(甚至不存在)導(dǎo)致更好的可伸縮性和關(guān)于系統(tǒng)的更簡單的推理。
不幸的是,Java語言沒有為類不變性提供強(qiáng)大的支持。 但是,結(jié)合使用多種技術(shù),可以設(shè)計(jì)不可變的類。 首先,該類的所有字段都應(yīng)該是final 。 這是一個(gè)好的開始,但不能單獨(dú)保證不變性。
package com.javacodegeeks.advanced.design;import java.util.Collection;public class ImmutableClass {private final long id;private final String[] arrayOfStrings;private final Collection< String > collectionOfString; }其次,遵循正確的初始化:如果字段是對(duì)集合或數(shù)組的引用,請(qǐng)不要直接從構(gòu)造函數(shù)參數(shù)中分配這些字段,而應(yīng)創(chuàng)建副本。 這將確保集合或數(shù)組的狀態(tài)不會(huì)從外部更改。
public ImmutableClass( final long id, final String[] arrayOfStrings,final Collection< String > collectionOfString) {this.id = id;this.arrayOfStrings = Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );this.collectionOfString = new ArrayList<>( collectionOfString ); }最后,提供適當(dāng)?shù)脑L問器(獲取器)。 對(duì)于集合,不可變視圖應(yīng)使用Collections.unmodifiableXxx包裝器公開。
public Collection<String> getCollectionOfString() {return Collections.unmodifiableCollection( collectionOfString ); }對(duì)于數(shù)組,確保真正的不變性的唯一方法是提供副本,而不是返回對(duì)數(shù)組的引用。 從實(shí)際的角度來看,這可能是不可接受的,因?yàn)樗诤艽蟪潭壬先Q于數(shù)組的大小,并可能給垃圾收集器帶來很大壓力。
public String[] getArrayOfStrings() {return Arrays.copyOf( arrayOfStrings, arrayOfStrings.length ); }即使是這個(gè)很小的例子,也提供了一個(gè)很好的主意,即不變性還不是Java中的一等公民。 如果一個(gè)不可變的類具有引用另一個(gè)類實(shí)例的字段,那么事情就會(huì)變得非常復(fù)雜。 這些類也應(yīng)該是不可變的,但是沒有簡單的方法可以強(qiáng)制執(zhí)行。
有很多很棒的Java源代碼分析器,例如FindBugs和PMD ,它們可以通過檢查代碼并指出常見的Java編程缺陷來提供很多幫助。 這些工具是任何Java開發(fā)人員的好朋友。
7.匿名類
在Java 8之前的時(shí)代,匿名類是提供就地類定義和立即實(shí)例化的唯一方法。 匿名類的目的是減少樣板,并提供簡潔明了的方式將類表示為表達(dá)式。 讓我們看一下在Java中產(chǎn)生新線程的典型老式方法:
package com.javacodegeeks.advanced.design;public class AnonymousClass {public static void main( String[] args ) {new Thread(// Example of creating anonymous class which implements// Runnable interfacenew Runnable() {@Overridepublic void run() {// Implementation here}}).start();} }在此示例中, Runnable接口的實(shí)現(xiàn)作為匿名類就地提供。 盡管匿名類存在一些限制,但是使用它們的基本缺點(diǎn)是Java強(qiáng)制將其作為語言使用的非常冗長的語法構(gòu)造。 即使是最簡單的不執(zhí)行任何操作的匿名類,每次都至少需要編寫5行代碼。
new Runnable() {@Overridepublic void run() {}}幸運(yùn)的是,有了Java 8,lambda和功能接口,所有這些樣板都將消失,最終使Java代碼看起來非常簡潔。
package com.javacodegeeks.advanced.design;public class AnonymousClass {public static void main( String[] args ) {new Thread( () -> { /* Implementation here */ } ).start();} }8.可見度
在教程的第1部分“ 如何設(shè)計(jì)類和接口”中 ,我們已經(jīng)討論了Java可見性和可訪問性規(guī)則。 在這一部分中,我們將在子類化的背景下再次回到這個(gè)主題。
| 修飾符 | 包 | 子類 | 其他所有人 |
| 上市 | 無障礙 | 無障礙 | 無障礙 |
| 受保護(hù)的 | 無障礙 | 無障礙 | 無法訪問 |
| <無修飾符> | 無障礙 | 無法訪問 | 無法訪問 |
| 私人的 | 無法訪問 | 無法訪問 | 無法訪問 |
表格1
不同的可見性級(jí)別允許或不允許這些類查看其他類或接口(例如,如果它們位于不同的程序包中或彼此嵌套)或子類查看和訪問其父級(jí)的方法,構(gòu)造函數(shù)和字段。
在下一節(jié)Inheritance中 ,我們將看到它的作用。
9.繼承
繼承是面向?qū)ο缶幊痰年P(guān)鍵概念之一,它是建立類關(guān)系的基礎(chǔ)。 與可見性和可訪問性規(guī)則結(jié)合在一起,繼承允許設(shè)計(jì)可擴(kuò)展和可維護(hù)的類層次結(jié)構(gòu)。
從概念上講,Java中的繼承是通過使用子類和extends關(guān)鍵字以及父類來實(shí)現(xiàn)的。 子類繼承其父類的所有公共成員和受保護(hù)成員。 此外,如果子類都駐留在同一包中,則它們將繼承父類的包私有成員。 話雖如此,無論您要設(shè)計(jì)什么,保持類公開或?qū)ζ渥宇惞_的最小方法集都是非常重要的。 例如,讓我們看一下Parent類及其子類Child以演示不同的可見性級(jí)別及其效果:
package com.javacodegeeks.advanced.design;public class Parent {// Everyone can see itpublic static final String CONSTANT = "Constant";// No one can access itprivate String privateField;// Only subclasses can access itprotected String protectedField;// No one can see itprivate class PrivateClass {}// Only visible to subclassesprotected interface ProtectedInterface {}// Everyone can call itpublic void publicAction() {}// Only subclass can call itprotected void protectedAction() {}// No one can call itprivate void privateAction() {}// Only subclasses in the same package can call itvoid packageAction() {} }package com.javacodegeeks.advanced.design;// Resides in the same package as parent class public class Child extends Parent implements Parent.ProtectedInterface {@Overrideprotected void protectedAction() {// Calls parent's method implementationsuper.protectedAction();}@Overridevoid packageAction() {// Do nothing, no call to parent's method implementation}public void childAction() {this.protectedField = "value";} }繼承本身就是一個(gè)非常大的主題,其中包含許多特定于Java的細(xì)微細(xì)節(jié)。 但是,有一些易于遵循的規(guī)則可以對(duì)保持類層次結(jié)構(gòu)簡潔有很大幫助。 在Java中,每個(gè)子類都可以覆蓋其父級(jí)的任何繼承的方法,除非將其聲明為final (請(qǐng)參閱Final類和方法部分 )。
但是,沒有特殊的語法或關(guān)鍵字將方法標(biāo)記為已重寫,這可能會(huì)引起很多混亂。 這就是引入@Override批注的原因:每當(dāng)您打算覆蓋繼承的方法時(shí),請(qǐng)始終使用@Override批注進(jìn)行指示。
Java開發(fā)人員在設(shè)計(jì)中經(jīng)常面臨的另一個(gè)難題是構(gòu)建類層次結(jié)構(gòu)(使用具體的或抽象的類)與接口實(shí)現(xiàn)。 強(qiáng)烈建議在可能的情況下,偏向類或抽象類的接口。 接口輕巧得多,易于測試(使用模擬)和維護(hù),并且使實(shí)現(xiàn)更改的副作用最小化。 許多高級(jí)編程技術(shù)(例如在標(biāo)準(zhǔn)Java庫中創(chuàng)建類代理)都嚴(yán)重依賴于接口。
10.多重繼承
與C ++和其他一些語言相反,Java不支持多重繼承:在Java中,每個(gè)類都只有一個(gè)直接父級(jí)(如我們?cè)诒窘坛?strong>第2部分中已經(jīng)知道的, Object類位于層次結(jié)構(gòu)的頂部, 使用通用方法)到所有對(duì)象 )。 但是,該類可以實(shí)現(xiàn)多個(gè)接口,因此,堆疊接口是在Java中實(shí)現(xiàn)(或模仿)多重繼承的唯一方法。
package com.javacodegeeks.advanced.design;public class MultipleInterfaces implements Runnable, AutoCloseable {@Overridepublic void run() {// Some implementation here}@Overridepublic void close() throws Exception {// Some implementation here} }多個(gè)接口的實(shí)現(xiàn)實(shí)際上是非常強(qiáng)大的,但是重用實(shí)現(xiàn)的需求通常會(huì)導(dǎo)致深層次的類層次結(jié)構(gòu),從而克服Java中缺少多繼承支持的一種方式。
public class A implements Runnable {@Overridepublic void run() {// Some implementation here} }// Class B wants to inherit the implementation of run() method from class A. public class B extends A implements AutoCloseable {@Overridepublic void close() throws Exception {// Some implementation here} }// Class C wants to inherit the implementation of run() method from class A // and the implementation of close() method from class B. public class C extends B implements Readable {@Overridepublic int read(java.nio.CharBuffer cb) throws IOException {// Some implementation here} }依此類推...最近的Java 8版本通過引入默認(rèn)方法在某種程度上解決了該問題。 由于使用默認(rèn)方法,因此接口實(shí)際上已經(jīng)開始不僅提供合同,而且還提供實(shí)現(xiàn)。 因此,實(shí)現(xiàn)這些接口的類也將自動(dòng)繼承這些實(shí)現(xiàn)的方法。 例如:
package com.javacodegeeks.advanced.design;public interface DefaultMethods extends Runnable, AutoCloseable {@Overridedefault void run() {// Some implementation here}@Overridedefault void close() throws Exception {// Some implementation here} }// Class C inherits the implementation of run() and close() methods from the // DefaultMethods interface. public class C implements DefaultMethods, Readable {@Overridepublic int read(java.nio.CharBuffer cb) throws IOException {// Some implementation here} }請(qǐng)注意,多重繼承是一種強(qiáng)大的功能,但同時(shí)又是一種危險(xiǎn)的使用工具。 通常將眾所周知的“死亡鉆石”問題稱為多重繼承實(shí)現(xiàn)的基本缺陷,因此,敦促開發(fā)人員非常仔細(xì)地設(shè)計(jì)類層次結(jié)構(gòu)。 不幸的是,具有默認(rèn)方法的Java 8接口也正成為這些漏洞的受害者。
interface A {default void performAction() {} }interface B extends A {@Overridedefault void performAction() {} }interface C extends A {@Overridedefault void performAction() {} }例如,以下代碼片段無法編譯:
// E is not compilable unless it overrides performAction() as well interface E extends B, C { }在這一點(diǎn)上,可以說Java作為一種語言總是試圖逃避面向?qū)ο缶幊痰臉O端情況,但是隨著語言的發(fā)展,其中一些情況開始出現(xiàn)。
11.繼承與組成
幸運(yùn)的是,繼承不是設(shè)計(jì)類的唯一方法。 許多開發(fā)人員認(rèn)為比繼承更好的另一種選擇是組合。 這個(gè)想法很簡單:這些類應(yīng)該由其他類組成,而不是構(gòu)建類層次結(jié)構(gòu)。
讓我們看一下這個(gè)例子:
public class Vehicle {private Engine engine;private Wheels[] wheels;// ... }Vehicle類由engine和wheels (以及為簡單起見而遺留的許多其他部件)組成。 但是,可以說Vehicle類也是一種引擎,因此可以使用繼承進(jìn)行設(shè)計(jì)。
public class Vehicle extends Engine {private Wheels[] wheels;// ... }哪個(gè)設(shè)計(jì)決定是正確的? 一般準(zhǔn)則稱為IS-A和HAS-A原則。 IS-A是繼承關(guān)系:子類還滿足父類規(guī)范以及父類的此類IS-A變體。 因此, HAS-A是組成關(guān)系:該類擁有(或HAS-A )屬于它的對(duì)象。 在大多數(shù)情況下, HAS-A原理比IS-A更好,其原因有兩個(gè):
- 設(shè)計(jì)可以更改的方式更加靈活
- 該模型更加穩(wěn)定,因?yàn)楦牟粫?huì)通過類層次結(jié)構(gòu)傳播
- 與繼承緊密關(guān)聯(lián)父級(jí)及其子類的繼承相比,該類及其組合之間的關(guān)聯(lián)松散
- 關(guān)于類的推理更加簡單,因?yàn)樗邢嚓P(guān)性都包含在其中
但是,繼承有其自己的位置,以不同的方式解決實(shí)際的設(shè)計(jì)問題,因此不應(yīng)忽略。 在設(shè)計(jì)面向?qū)ο蟮哪P蜁r(shí),請(qǐng)牢記這兩種選擇。
12.封裝
面向?qū)ο缶幊讨械姆庋b概念全是向外界隱藏實(shí)現(xiàn)細(xì)節(jié)(如狀態(tài),內(nèi)部方法等)。 封裝的好處是可維護(hù)性和易于更改。 內(nèi)部細(xì)節(jié)類暴露的次數(shù)越少,開發(fā)人員對(duì)更改其內(nèi)部實(shí)現(xiàn)的控制就越多,而不必?fù)?dān)心破壞現(xiàn)有代碼(如果您正在開發(fā)許多人使用的庫或框架,這將是一個(gè)真正的問題)。
Java中的封裝是使用可見性和可訪問性規(guī)則實(shí)現(xiàn)的。 在Java中,最好不要使用getter和setter方法(如果未將字段聲明為final )直接暴露字段,這是Java的最佳實(shí)踐。 例如:
package com.javacodegeeks.advanced.design;public class Encapsulation {private final String email;private String address;public Encapsulation( final String email ) {this.email = email;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getEmail() {return email;} }此示例類似于Java語言中所謂的JavaBeans :通過遵循一組約定編寫的常規(guī)Java類,其中一種僅允許使用getter和setter方法訪問字段。
正如我們?cè)凇?繼承”部分中已強(qiáng)調(diào)的那樣,請(qǐng)始終遵循封裝原則,嘗試使類公共協(xié)定保持最小。 無論什么都不應(yīng)該是public ,而應(yīng)該是private (或protected / package private ,取決于您要解決的問題)。 從長遠(yuǎn)來看,它將帶來回報(bào),使您可以自由開發(fā)設(shè)計(jì)而無需引入重大更改(或至少將更改減至最少)。
13.期末課程和方法
在Java中,有一種方法可以防止該類被其他任何類繼承:應(yīng)該將其聲明為final 。
package com.javacodegeeks.advanced.design;public final class FinalClass { }方法聲明中使用相同的final關(guān)鍵字可防止所討論的方法在子類中被覆蓋。
package com.javacodegeeks.advanced.design;public class FinalMethod {public final void performAction() {} }沒有通用的規(guī)則來決定類或方法是否應(yīng)該是final 。 最終的類和方法限制了可擴(kuò)展性,并且很難預(yù)先考慮該類是否應(yīng)該被子類化,或者方法是否應(yīng)該被覆蓋。 這對(duì)于庫開發(fā)人員尤其重要,因?yàn)檫@樣的設(shè)計(jì)決策可能會(huì)大大限制庫的適用性。
Java標(biāo)準(zhǔn)庫提供了一些final類的示例,其中最著名的是String類。 在早期階段,已決定主動(dòng)阻止任何開發(fā)人員嘗試自己的,“更好”的字符串實(shí)現(xiàn)。
14.接下來是什么
在本教程的這一部分中,我們研究了Java中的面向?qū)ο笤O(shè)計(jì)概念。 我們還簡要介紹了基于合同的開發(fā),介紹了一些功能概念,并了解了該語言如何隨著時(shí)間演變。 在本教程的下一部分中,我們將討論泛型以及泛型如何改變我們處理類型安全編程的方式。
15.下載源代碼
這是關(guān)于如何設(shè)計(jì)類和接口的課程。
- 您可以在此處下載源代碼: advanced-java-part-3
翻譯自: https://www.javacodegeeks.com/2015/09/how-to-design-classes-and-interfaces.html
抽象類和接口設(shè)計(jì)
總結(jié)
以上是生活随笔為你收集整理的抽象类和接口设计_如何设计类和接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓手机容量在哪看(安卓手机容量)
- 下一篇: 使用所有对象共有的方法