內部類分類:
- 成員內部類
- 匿名內部類
- 局部內部類
一、成員內部類
是指可以用private protect default public任意一個進行修飾的,類文件名:外部類$內部類.class
a)非靜態內部類
外部類可以使用內部類和我們平時使用其它的類沒什么區別。
1)非靜態內部類必須寄存在。因此如果有一個非靜態內部類對象被創建,那么它的外部類對象一定會被創建,非靜態內部類對象單獨屬於外部類的某個對象。
2)非靜態內部類對象可以單獨訪問外部類成員,但外部類對象不能直接訪問非靜態內部類的成員。
3)非靜態內部類是屬於外部類的某個對象,因此不能有靜態方法,屬性,靜態初始化塊。
4)外部類的靜態方法不能使用非靜態內部類(因為非靜態內部類是屬於對象的,外部類的靜態方法是屬於外部類的,外部類對象還未被創建,因此不能用),包括不能使用非靜態內部類定義變量,創建實例,但非靜態內部類可以使用外部類的屬性及方法。
內部類的成員變量訪問要點
1)內部類方法的局部變量:直接訪問。
2)內部類屬性:this.屬性名
3)內部類訪問外部類屬性:外部類.this.屬性名
例子:
package com.liuzeyu12a.OOT;
public class TestInnerClass {
public static void main(String[] args) {
//生成內部類對象
Outer.inner inner = new Outer().new inner();
inner.show();
}
}
class Outer{
public int age = 100;
void testOuter(){
System.out.println("外部類對象");
}
class inner{
int ageInner = 80;
public void show(){
int ageFun = 300;
System.out.println("外部類成員變量:"+Outer.this.age);
System.out.println("內部類成員變量:"+this.ageInner);
System.out.println("內部類成員變量:"+ageFun);
}
}
}
b)靜態內部類
static class ClassName {
//類體
}
靜態內部類使用要點
1)當一個靜態內部類存在時並不一定存在外部類對象,內部類屬於外部類,不屬於外部類對象,因此,靜態內部類的實例方法不能直接訪問外部類的實例和方法。
2)靜態內部類屬於外部類的一個靜態成員,因此外部類可以通過 “靜態內部類.名字”的方式訪問靜態內部類的靜態成員,通過new靜態內部類訪問靜態內部類的實例。
例子:
package com.liuzeyu12a.OOT;
public class TestInnerClass02 {
public static void main(String[] args) {
//創建靜態內部類對象
Outer2.Inner2 inner2 = new Outer2.Inner2();
inner2.show();
//執行外部了的方法
new Outer2().show();
}
}
class Outer2{
String name;
int age;
public void show(){
System.out.println("外部類訪問內部類成員"+new Inner2().age);
}
//靜態內部類
static class Inner2{
int age = 100;
public void show(){
/** * 當一個靜態內部類對象存在,並不一定存在對應的外部類對象。 * 因此,靜態內部類的實例方法不能直接訪問外部類的實例方法。 */
//System.out.println(Outer2.this.age);
System.out.println("staic inner2");
}
}
}
二、匿名內部類
匿名內部類使用要點
1)匿名內部類沒有訪問修飾符
2)匿名內部類沒有構造方法,因為它連名字都沒有哪來的構造器
package com.liuzeyu12a.OOT;
public class TestAnonymousInner {
public static void main(String[] args) {
/** * 這里說明一下為什么System.out.println("測試匿名內部類"); * 沒有被實現,因為這個是new 接口實現類的時候必須實現的方法 * 但是這個方法並沒有被調用,所以並不會被運行 */
TestAnonymousInner.test(new AA() {
@Override
public void aa() {
System.out.println("測試匿名內部類");
}
});
}
static void test(AA aa){
System.out.println("test AA ==>" + AA.aa);
}
}
//接口AA
interface AA{
int aa = 100;
void aa();
}
二、局部內部類
還有一種內部類,它是定義在方法內部的,作用域只限於本方法,稱為局部內部類。
局部內部類的的使用主要是用來解決比較復雜的問題,想創建一個類來輔助我們的解決方案,到那時又不希望這個類是公共可用的,所以就產生了局部內部類。局部內部類和成員內部類一樣被編譯,只是它的作用域發生了改變,它只能在該方法中被使用,出了該方法就會失效。
局部內部類在實際開發中應用很少。
public class Test2 {
public void show() {
//作用域僅限於該方法
class Inner {
public void fun() {
System.out.println("helloworld");
}
}
new Inner().fun();
}
public static void main(String[] args) {
new Test2().show(); //輸出helloworld
}
}