其實內部類別顧名思義,就是類別中類,一個類別裡面還有一個類別。
內部類別分為四種:
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」關係,他就是一個獨立的實體內部類提供了更好的封裝,除了該外圍類,其他類都不能訪問創建內部類對象的時刻並不依賴於外圍類對象的創建以上是Java的內部類別實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!