Java內部類是一種定義在另一個類中的類。它的作用很廣泛,可以應用於多個場景。本文從多個方面來闡述Java內部類的作用。
一、封裝實現細節
內部類與外部類之間存在着直接的聯繫,內部類可以訪問外部類的所有成員變量和成員方法,包括私有的成員。因此,內部類可以用來封裝實現細節。對於外部類的用戶來說,內部類是不可見的,只能調用外部類提供的公共方法。這樣就可以避免外部類的實現細節暴露出來。
public class Outer {
private int outerNum;
public void display() {
Inner inner = new Inner();
inner.showOuterNum();
}
private class Inner {
public void showOuterNum() {
System.out.println("Outer Num: " + outerNum);
}
}
}
上面的代碼中,內部類Inner可以訪問外部類Outer的私有變量outerNum,同時外部類的用戶也只能調用display方法,而不能直接訪問outerNum。
二、實現接口和抽象類
內部類可以實現接口和抽象類,當內部類實現接口或抽象類時,可以隱藏實現細節,對外只提供接口或抽象類定義的方法,更好的實現了封裝。同時,內部類可以訪問外部類的成員變量和成員方法,方便實現接口或抽象類的方法。
public interface Shape {
int getCircumference();
int getArea();
}
public class Triangle {
private int a;
private int b;
private int c;
public Triangle(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
public Shape getShape() {
return new TriangleShape();
}
private class TriangleShape implements Shape {
public int getCircumference() {
return a + b + c;
}
public int getArea() {
int p = (a + b + c) / 2;
return (int) Math.sqrt(p * (p - a) * (p - b) * (p - c));
}
}
}
上面的代碼中,Triangle實現了一個Shape接口,通過getShape方法返回內部類TriangleShape的實例,TriangleShape實現了Shape接口的方法並可以訪問Triangle的成員變量a、b、c,將Triangle的實現細節完全封裝。
三、簡化代碼邏輯
內部類可以方便地訪問外部類的成員變量和成員方法,在某些情況下可以簡化代碼邏輯。例如在事件處理中使用內部類可以避免代碼邏輯複雜。下面是一個具體的例子。
public class Button {
private OnClickListener mOnClickListener;
public interface OnClickListener {
void onClick();
}
public void setOnClickListener(OnClickListener onClickListener) {
mOnClickListener = onClickListener;
}
public void click() {
if (mOnClickListener != null) {
mOnClickListener.onClick();
}
}
}
public class Test {
public static void main(String[] args) {
Button button = new Button();
button.setOnClickListener(new Button.OnClickListener() {
public void onClick() {
System.out.println("Button clicked");
}
});
button.click();
}
}
上面的代碼中,Button定義了一個內部接口OnClickListener和一個setOnClickLIstener方法,Test類使用匿名內部類實現了OnClickListener接口,並將實例設置到Button中。當click方法被調用時,會調用OnClickListener的onClick方法,輸出「Button clicked」。
四、實現多次繼承
內部類可以實現多次繼承,即一個類可以繼承一個類或實現一個接口,同時又可以在內部類中繼承或實現另一個類或接口。這樣可以避免類的繼承層次過深,提高代碼的可讀性和可維護性。下面是一個例子。
public interface Flyable {
void fly();
}
public class Bird {
public void sing() {
System.out.println("Bird is singing");
}
}
public class Sparrow {
private Bird mBird = new Bird();
public void sing() {
mBird.sing();
}
public void fly() {
System.out.println("Sparrow is flying");
}
}
上面的代碼中,Sparrow類包含了一個Bird實例,並將其包裝了一下來實現sing方法。但是這種方式違背了單一責任原則,同時也沒法實現Flyable接口。下面我們使用內部類來實現多次繼承。
public class Sparrow {
public void sing() {
System.out.println("Sparrow is singing");
}
public Flyable getFlyable() {
return new FlyableImpl();
}
private class FlyableImpl implements Flyable {
public void fly() {
System.out.println("Sparrow is flying");
}
}
}
上面的代碼中,Sparrow類實現了Bird類的sing方法並實現了Flyable接口,通過getFlyable方法返回內部類FlyableImpl的實例,FlyableImpl實現了Flyable接口中的fly方法。Sparrow類的sing和fly方法都是通過內部類的實現來實現的,更加清晰和簡潔。
總結
Java內部類的作用很廣泛,可以用來封裝實現細節、實現接口和抽象類、簡化代碼邏輯和實現多次繼承等。在實際開發中,要根據場景選擇不同的內部類實現方式,避免過度依賴內部類帶來的問題。
原創文章,作者:FFUR,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/140462.html
微信掃一掃
支付寶掃一掃