java 中静态内部类与普通内部类的区别
1、靜態內部類與普通內部類的區別
1)普通內部類不能脫離外部類被創建;靜態內部類可以脫離外部類被創建。
2)普通內部類可訪問外部類的靜態和非靜態成員變量和方法(包括私有屬性),因其在外部類內部;靜態內部類只能訪問外部類的靜態成員,不能訪問外部類的非靜態成員。
3)普通內部類擁有對外部類的引用;靜態內部類沒有對外部類的引用。
4)普通內部類不能定義static成員變量和方法。
5)類的內部,可定內部接口,并且可定義一個內部類實現這個內部接口。
6)內部類可以多嵌套。
7)可以在方法體內定義一個內部類,方法體內的內部類可以完成一個基于虛方法形式的回調操作
注:static修飾的內部類,是一種較為特殊的內部類,Java文檔中描述static修飾的內部類:一旦內部類使用static修飾,那么此時這個內部類就升級為頂類。也就是說,除了寫在一個類的內部以外,static內部類具備所有外部類的特性,同外部類沒有分別。一般之定義和使用靜態內部場景:該內部類僅外部類用到,以此減少類文件數量,方便代碼維護和管理。
2、代碼驗證
package com.base;import lombok.Data;@Data public class OuterClass {public static int classNum = 1;public int classSort = 2;// ************************************************************************// 靜態內部類// ************************************************************************@Datapublic static class InnerStaticClass {private String name;public InnerStaticClass() {}public InnerStaticClass(String name) {this.name = name;}public void say() {System.out.println("我是【靜態內部類】,可被外部調用");}public static void speak() {System.out.println("我是【靜態內部類】,可被外部調用,且無需初始化就可調用");}}// ************************************************************************// 內部類// ************************************************************************public class InnerClass implements InnerClassInterface {private String name;//內部類不能定義static元素,包括:成員變量和方法//public static Integer age;public InnerClass() {}public InnerClass(String name) {this.name = name;}public void say() {System.out.println("我是【內部類】,可被本內部類對象調用");//【1】普通內部類能夠訪問外部類的靜態和非靜態成員,【靜態內部類】不能訪問外部類的非靜態成員,他只能訪問外部類的靜態成員System.out.println("我是【內部類】,可調用外部類非靜態屬性-班級名次:" + OuterClass.this.classSort);System.out.println("我是【內部類】,可以調用外部類靜態屬性-班級號碼:" + OuterClass.classNum);//【2】普通內部類持有對外部類的引用,【靜態內部類】沒有持有外部類的引用。OuterClass.this.speak();}public void speak() {System.out.println("我是【內部類】,可被外部類通過初始化調用");}//錯誤非【靜態內部類】,不允許聲明靜態的方法 // public static void speak() { // System.out.println("我是【靜態內部類】,我不需要初始化就可以調用"); // }//內部類可以多嵌套public class InnerInnerClass {}}//可以定義內部接口,且可以定義另外一個內部類實現這個內部接口public interface InnerClassInterface{void say();void speak();}public void speak() {System.out.println("我是【外部類】,可被內部類調用");new InnerClass().speak();}public static void main(String[] args) {InnerStaticClass.speak();System.out.println();InnerStaticClass innerStaticClass1 = new InnerStaticClass("李清華");innerStaticClass1.say();System.out.println();OuterClass outerClass = new OuterClass();//【3】一個普通內部類不能脫離外部類實體被創建,且可以訪問外部類的數據和方法,因為他就在外部類里面。InnerClass innerClass = outerClass.new InnerClass("張北大");innerClass.say();} }打印輸出:
我是【靜態內部類】,可被外部調用,且無需初始化就可調用
我是【靜態內部類】,可被外部調用
我是【內部類】,可被本內部類對象調用
我是【內部類】,可調用外部類非靜態屬性-班級名次:2
我是【內部類】,可以調用外部類靜態屬性-班級號碼:1
我是【外部類】,可被內部類調用
我是【內部類】,可被外部類通過初始化調用
總結
以上是生活随笔為你收集整理的java 中静态内部类与普通内部类的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 职场各“族”都能成功
- 下一篇: java基础案例 饲养员喂养动物