首頁 > 軟體

一起來了解Java的內部類

2022-03-14 19:01:25

內部類:

其實內部類顧名思義,就是類中類,一個類裡面還有一個類。

內部類分為四種:

1.普通內部類

2.靜態內部類

3.方法內部類

4.匿名內部類

我們一一去了解一下~~

A、普通內部類:

我們先通過程式碼去了解一下:

package InternalClass;
/**
 * 內部類
 */
public class Car {
    public int a = 10;
    public int b = 20;
    //外部類的方法
    public void method() {
        System.out.println("我是外部類Car的普通方法!");
        bus b = new bus();     //建立內部類的物件
        b.internalMethod();
    }
    //內部類(在Car類中的bus類)
    public class bus {
        int b = 30;
        //內部類方法
        public void internalMethod() {
            System.out.println("**這是bus內部類的普通方法!");
            System.out.println("**我是內部類,現在在存取外部類Car的a:" + a);
            System.out.println("**我是內部類,現在在存取內部類bus的b:" + this.b);
            System.out.println("**我是內部類,現在在存取外部類bus的b:" + Car.this.b);
            //注意,如果在內部類需要使用外部類的屬性,必須通過外部的類去this外部類的屬性
        }
    }    
	//程式執行入口:
	public static void main(String[] args) {
	    Car car = new Car();   //建立外部類的物件
	    car.method();
	    // 執行上面的程式碼 會輸出 : 我是外部類Car的普通方法!
	   	//執行內部類的方法
	   	//在上面method方法中已經建立了內部類bus的物件b
	   	//這裡就是通過使用外部類Car的物件car去new一個內部類物件
	   	bus b = car.new bus();  
	   	//通過內部類物件b 去使用方法即可
	    b.internalMethod();   
		//輸出:
		/*
		**這是bus內部類的普通方法!
		**我是內部類,現在在存取外部類Car的a:10
		**我是內部類,現在在存取內部類bus的b:30
		**我是內部類,現在在存取外部類bus的b:20
*/
   }
}

B、靜態內部類:

靜態內部類顧名思義也是把內部類用static修飾變為靜態的,可以直接用外部類類名去呼叫,不需要建立物件:

package InternalClass;
public class Person {
    String name = "小王";
    static int age = 20;
    //建立靜態內部類
    public static class Student{
        String name = "小紅";
        //靜態內部類的方法
        public static void study(){
            Person p = new Person(); //建立外部類的物件
            //靜態存取非靜態需要使用物件去呼叫
            System.out.println("內部類靜態方法存取外部非靜態成員:"+p.name);
            System.out.println("內部類靜態方法存取外部靜態成員:"+Person.age);
            System.out.println("內部類靜態方法存取內部非靜態成員:"+new Student().name);
        }
    }
    //程式執行入口
    public static void main(String[] args) {
        //靜態內使用方法不需要建立物件
        Student.study();
    }
/*
輸出:
內部類靜態方法存取外部非靜態成員:小王
內部類靜態方法存取外部靜態成員:20
內部類靜態方法存取內部非靜態成員:小紅
*/
}

C、方法內部類:

方法內部類顧名思義也是在外部類的方法體內新建一個類:

package InternalClass;
/**
 * 方法內部類
 */
public class Student {
    //方法
    public void study(){
        int age = 20;
        String name = "小王";
        //在方法內寫類:方法內部類
        class child{
            //方法內部類的方法
            public void play(){
                System.out.println("孩子喜歡玩!");
            }
        }
        //在外部類study的方法內建立一個生成內部類child的物件,並使用方法
        child c = new child();
        c.play();
    }
    //程式執行入口
    public static void main(String[] args) {
        Student stu = new Student();
        //這裡呼叫study方法後,在study方法體內建立了child的物件和呼叫了play的方法
        stu.study();  
    }
}
//輸出:我叫:小王我今年:20我愛學習
//	   孩子喜歡玩!

內部類的小結(有很多侷限性,所以應該注意使用場景):

1.類前不能有存取修飾符

2.只能在此方法內使用

3.無法創造靜態資訊

4.可以直接存取方法內的區域性變數和引數,但是不能修改

5.可以隨意的存取外部類的任何資訊

D、匿名內部類:

匿名內部類就是沒有名字的內部類:

先定義一個介面:

public interface USB {
    void read();
}
package InternalClass;
/**
 * 匿名內部類
 */
public class Child {
    public static void main(String[] args) {
        USB u = new USB() {
            @Override
            public void read() {
                System.out.println("這是匿名內部類,是USB介面沒有具名的子類,必須重寫 介面做具體實現");
            }
        };
        u.read();
    }
}

匿名內部類需要注意的四點:

1.匿名內部類不能定義任何靜態成員、方法

2.匿名內部類中的方法不能是抽象的

3.匿名內部類必須實現介面或抽象父類別的所有抽象方法

4.匿名內部類存取的外部類成員變數或成員方法必須用static修飾

內部類的總結:

一、為什麼要用內部類?

內部類擁有類的基本特徵:可以繼承父類別,實現介面,在實際問題中我們會遇到一些介面無法解決的問題,此時我們可以使用內部類繼承某個具體的或抽象的類,間接解決類無法多繼承引起的一系列問題。

二、內部類的好處:

內部類可以用多個範例,每個範例都有自己的狀態資訊,並且與其他外圍物件的資訊相互獨立內部類並沒有令人迷惑的“is-a”關係,他就是一個獨立的實體內部類提供了更好的封裝,除了該外圍類,其他類都不能存取建立內部類物件的時刻並不依賴於外圍類物件的建立

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容! 


IT145.com E-mail:sddin#qq.com