Java語言中的內(nèi)部類和組合是兩種不同的實現(xiàn)方式,它們都是為了更好地實現(xiàn)類之間的關(guān)系而生的。
首先來說說內(nèi)部類,內(nèi)部類是指定義在另一個類內(nèi)部的類,它可以訪問外部類的成員變量和方法,并且可以實現(xiàn)接口和繼承其他類。內(nèi)部類還可以分為靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類,靜態(tài)內(nèi)部類可以直接通過外部類訪問,而非靜態(tài)內(nèi)部類則需要先創(chuàng)建外部類的實例才能訪問。
public class OuterClass { private int num = 10; // 靜態(tài)內(nèi)部類 static class StaticInnerClass { public void printNum() { System.out.println("num is " + num); //不允許訪問外部類的非靜態(tài)成員變量 } } // 非靜態(tài)內(nèi)部類 class InnerClass { public void printNum() { System.out.println("num is " + num); } } public static void main(String[] args) { OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass(); staticInnerClass.printNum(); OuterClass outerClass = new OuterClass(); OuterClass.InnerClass innerClass = outerClass.new InnerClass(); innerClass.printNum(); } }
其次是組合,組合是指一個類將其他類對象作為自己的成員變量,通過調(diào)用成員變量的方法來實現(xiàn)該類的功能。組合是一種強關(guān)聯(lián)的關(guān)系,組合的對象是該類的一部分,不能獨立存在。
public class Car { private Engine engine; private GearBox gearBox; public Car() { engine = new Engine(); gearBox = new GearBox(); } public void start() { engine.start(); gearBox.shift(); } } public class Engine { public void start() { System.out.println("Engine is starting..."); } } public class GearBox { public void shift() { System.out.println("GearBox is shifting..."); } } public class Main { public static void main(String[] args) { Car car = new Car(); car.start(); } }
所以,內(nèi)部類和組合都是為了更好地實現(xiàn)類之間的關(guān)系而生,雖然它們的實現(xiàn)方式不同,但是它們都可以有效地提高代碼的復(fù)用性和靈活性。