在A類的類體中定義了的類,稱為內(nèi)部類。
內(nèi)部類包括: 成員內(nèi)部類, 靜態(tài)內(nèi)部類, 局部內(nèi)部類, 匿名內(nèi)部類。
package com.wkcto.chapter01.innerclass.demo01;
/**
* 成員內(nèi)部類
* 1) 成員內(nèi)部類與實例變量/實例方法一樣,都是屬于某一個Outer對象的
* 2) 一般情況下, 在實例方法中使用成員內(nèi)部類創(chuàng)建對象
* 3) 在Java中,所有類編譯后都會生成一個獨立的字節(jié)碼文件,
* 內(nèi)部類的字節(jié)碼文件: 外部類$內(nèi)部類名.class
*
* @author 蛙課網(wǎng)
*
*/
public class Outer {
int xx = 10 ; //實例變量
public void m1() {
System.out.println("實例方法");
xx = 123; //在實例方法中,可以直接使用實例變量
//一般情況下, 在實例方法中使用成員內(nèi)部類創(chuàng)建對象
Inner1 obj = new Inner1();
}
//成員內(nèi)部類
class Inner1{
}
}
package com.wkcto.chapter01.innerclass.demo02;
/**
* 靜態(tài)內(nèi)部類
* 1) 使用static修飾的成員 內(nèi)部類
* 2) 靜態(tài)內(nèi)部類一般情況下是在靜態(tài)方法中使用
*
* @author 蛙課網(wǎng)
*
*/
public class Outer {
static int yy = 20; //靜態(tài)變量
public static void sm() {
System.out.println("靜態(tài)方法");
yy = 202 ; //在靜態(tài)方法中,可以直接使用靜態(tài)變量
//一般情況下是在靜態(tài)方法中使用靜態(tài)內(nèi)部類
Inner2 obj = new Inner2();
}
//靜態(tài)內(nèi)部類
static class Inner2{
}
}
package com.wkcto.chapter01.innerclass.demo03;
/**
* 局部內(nèi)部類
* 1) 在方法體中定義的內(nèi)部類就是局部內(nèi)部類
* 2) 局部內(nèi)部類的作用域 , 是從定義內(nèi)部類的位置開始, 直到包含它的大括弧結(jié)束
* @author 蛙課網(wǎng)
*
*/
public class Outer {
public void m3() {
int zz = 10; //局部變量
class Inner3{} //局部內(nèi)部類
}
}
package com.wkcto.chapter01.innerclass.demo04;
/**
* 匿名內(nèi)部類
* 1)匿名內(nèi)部類,就是沒有類名 的內(nèi)部類,
* 2)因為匿名內(nèi)部類沒有類名, 匿名內(nèi)部類的定義與對象的創(chuàng)建必須在一起
* 3)給接口/抽象類的引用賦值時,可以賦值匿名內(nèi)部類對象, 接口實現(xiàn)類/抽象類的子類只使用一次時, 可以使用匿名內(nèi)部類
* 經(jīng)常, 如果方法的形參是接口/抽象類的引用,在調(diào)用方法時,可以傳遞匿名內(nèi)部類對象
* @author 蛙課網(wǎng)
*
*/
public class Test {
public static void main(String[] args) {
//接口的引用只能賦值實現(xiàn)類對象, 接口不能實例化對象, 需要先定義一個類, 讓它實現(xiàn)接口,再創(chuàng)建實現(xiàn)類對象給接口引用賦值
//如果接口的實現(xiàn)類就使用這一次, 以后再也不用了, 就不需要再單獨的定義一個實現(xiàn)類了, 可以直接給接口引用賦值匿名內(nèi)部類對象
Flyable flyable = new Flyable() {
//在匿名內(nèi)部類中重寫接口的抽象方法
@Override
public void fly() {
System.out.println("我是匿名內(nèi)部類中重寫 的飛行操作");
}
};
flyable.fly();
//抽象類不能實例化對象, 抽象類的引用需要賦值子類對象, 先定義子類繼承抽象類, 重寫抽象類的抽象方法, 再創(chuàng)建子類對象給抽象類引用賦值
//當(dāng)子類就使用這一次時, 可以直接給抽象類引用賦值匿名內(nèi)部類對象
Animal animal = new Animal() {
//在匿名內(nèi)部類中重寫抽象類的抽象方法
@Override
public void walk() {
System.out.println(" 這是一個神奇的動物, 它沒有腿也能走路");
}
};
animal.walk();
}
}
總結(jié):
記住類與類之間的關(guān)系, 可以通過Rose工具畫出類與類之間的關(guān)系。
了解什么是內(nèi)部類, 了解內(nèi)部類有哪些, 掌握接口的引用/抽象類的引用可以賦值匿名內(nèi)部類對象。