Java內部類詳解
阿新 • • 發佈:2018-06-11
strong 匿名 per 創建 show rac 成員變量 end outer
成員內部類(聲明在類內部且方法外的):1是外部類的一個成員:①可以有修飾符(4個)②static final ③可以調用外部類的屬性、方法
2具體類的特點:①abstract ②還可以在其內部定義屬性、方法、構造器
局部內部類(聲明在類的方法裏):
內部類作用:
- 實現了更好的封裝,我們知道,普通類(非內部類)的訪問修飾符不能為private或protected,而內部類可以。當我們將內部類聲明為private時,只有外部類可以訪問內部類,很好地隱藏了內部類
- 內部類可以繼承(extends)或實現(implements)其他的類或接口,而不受外部類的影響
- 內部類可以直接訪問外部類的字段和方法,即使是用private修飾的,相反的,外部類不能直接訪問內部類的成員
一、靜態內部類:作為類的靜態成員,存在於某個類的內部
靜態內部類雖然是外部類的成員,但是在未創建外部類的對象的情況下,可以直接創建靜態內部類的對象。
靜態內部類可以引用外部類的靜態成員變量和靜態方法,但不能引用外部類的普通成員
package com.yyx.pratice; public class TestInner { private String outerName = "outer";private static int id = 123; private Inner inner = new Inner(); public static class Inner { public void print1() { System.out.println(id); // System.out.println(outerName); } public static void print2() { System.out.println(id); } }public void show() { inner.print1(); } public static void main(String[] args) { TestInner testInner = new TestInner(); testInner.show(); TestInner.Inner.print2(); } }
二、成員內部類:作為類的成員,存在於某個類的內部
成員內部類可以調用外部類的所有成員,但只有在創建了外部類的對象後,才能調用外部的成員
package com.yyx.pratice; public class TestInner { private String outerName = "outer"; // 外部類無法直接訪問內部類的成員,需要實例化內部類對象 private Inner inner = new Inner(); public class Inner { private String innerName = "inner"; public void show() { System.out.println(outerName); // 可以直接訪問外部類的成員 } } public void show() { System.out.println(inner.innerName); inner.show(); } public static void main(String[] args) { TestInner outer = new TestInner(); outer.show(); // 實例化內部類 TestInner.Inner inner = outer.new Inner(); inner.show(); } }
三、局部內部類:存在於某個方法的內部
局部內部類只能在方法內部中使用,一旦方法執行完畢,局部內部類就會從內存中刪除。
必須註意:如果局部內部類中要使用他所在方法中的局部變量,那麽就需要將這個局部變量定義為final的
package com.yyx.pratice; public class InnerClass { public static void main(String[] args) { Student stu = new Student(); stu.getPerson().eatRice(); } } interface Person { public void eatRice(); } class Student { public Person getPerson() { /* * 匿名內部類 */ return new Person() { @Override public void eatRice() { System.out.println("我會吃米飯!"); } }; } }
Java內部類詳解