成員
成員內部類
靜態內部類
局部
方法內部類
匿名內部類
依賴外部類對象的:成員內部類,方法內部類,匿名內部類
靜態內部類不依賴外部類的對象,所以,我們在項目中優先考慮選擇靜態內部類
package QianFeng02;
//內部類
public class InnerTest {
public static void main(String[] args){
//在外部創建成員內部類實例,
Outer outer=new Outer();
// 因為成員內部類需要依賴外部類的對象,不建議這樣創建
// Outer.Inner2 inner2=outer.new Inner2();
// inner2.print();
outer.innerPrint();//通過innerPrint訪問內部類
outer.show();//方法內部類
Outer.Inner3 inner3=new Outer.Inner3(); //靜態類直接:類名.內部靜態類名
inner3.print();
outer.print11();//(1.繼承式)
outer.print2();//(2.匿名類的 接口式)
outer.print3(new Eat(){//(匿名內部類 3.參數式)
public void eat() {
System.out.println("匿名內部類 3.參數式");
}
});//(3.參數式匿名類)
}
}
class Outer{
private String name="除了靜態內部類,內部類成可以很方便使用成員變量";
//----------------1.成員內部類----------------
public void innerPrint(){//建議在外部類中定義一個方法,對外提供訪問內部類接口
Inner2 inner2=new Inner2();
inner2.print();
}
//內部類(封裝性)
class Inner2{//1.成員內部類
private void print(){
System.out.println("{成員內部類}"+name);
}
}
// ----------------2.方法內部類---- ----------
public void show(){
final int x=10; //方法內部類的引用的變量 必須是常量(final),不寫聲明默認final
class Inner2{
public void print(){
System.out.println("{方法內部類}"+x+name);//為什么用final呢?
}
}
Inner2 inner2=new Inner2();//調用方法內部類(在方法里面調用實例化)不能在方法外實例化
inner2.print();
}
//----------------3.靜態內部類----------------
/*
在一個類內部定義一個靜態內部類:
靜態的含義是該內部類可以像其它靜態成員一樣,沒有外部類對象時,可以直接訪問
靜態嵌套僅能訪問外部類的靜態成員和方法
*/
static class Inner3{
public void print(){
System.out.println("靜態內部類");
}
}
//----------------4.匿名內部類----------------
/*1.不能有構造方法
2.不能定義任何靜態成員,方法
3.不能是public.protected,private,static
4.一定是在new的后面,用其隱含一個接口或者實現一個類
5.匿名內部類為局部的,所以局部內部類的所有限制都對其生效
* */
//(1.繼承式)
public void print11(){
CatGame cat=new CatGame(){
public void game(){
System.out.println("貓玩");
}
};
cat.game();
}
//*(2.接口式)
public void print2(){
Eat e=new Eat(){
@Override
public void eat() {
System.out.println("匿名類的 接口式");
}
};
e.eat();
}
//(3.參數式)
public void print3(Eat eat){//傳入接口
eat.eat();
}
}
interface Eat{
public void eat();
}
abstract class CatGame{
public abstract void game();
}
/*
方法內部類的引用的變量 必須是常量(final)
為什么用final呢?
final 修飾變量是 常量,會把變量進入到常量池,延長生命周期,以免被銷毀
jdk1.8 可以不寫final ,系統會默認 final.
*/