原博客鏈接:Java內部類(詳細整理)
一.內部類
內部類主要定義在類的內部,定義內部類的作用,主要是因為不希望該類作為大家共同使用訪問的類。
1.成員內部類
成員內部類就是作為外部類的成員,可以直接使用外部類的所有成員和方法,即使是private。
外部類要訪問內部類的所有成員變量或方法,則需要通過內部類的對象來獲取
注意:成員內部類不能含有 static 的變量和方法。
成員內部類的定義如下:
public class 外部類{
public class 內部類{}
}
內部類的實例化:
外部類 對象 = new 外部類();
外部類.內部類 對象2=對象.new 內部類();
2.局部內部類
局部內部類是指內部類定義在方法和作用域內。通俗來說,就是在外部類的方法中定義的內部類就是局部內部類。
局部內部類由于是在方法中定義的,因此,其作用域也是在方法內部中,方法外執行到,則被JVM回收。局部內部類的實例化也只能在方法中進行。
示例:
public class Method{
public static void main(String[] args){
Method m =new Method();
m.test();
}
public void test(){
final double pi=3.14;
int r=6;
class Circle implements Type{
public double area(){
return pi*6*6;
}
}
Circle c =new Circle();
System.out.println("area="+c.area());
}
}
interface Type{
public double area();
}
注意:局部內部類方法中想要使用局部變量,該變量必須聲明為 final 類型;所以例子中未用 r 成員變量。
3.靜態內部類
靜態內部類就是修飾為 static 的內部類。聲明為 static 的內部類,不需要內部類對象和外部類對象之間的聯系,就是說,用戶可以直接引用“外部類.內部類”。
靜態內部類實例化如下:
外部類.內部類 對象 = new 外部類.內部類()
4.匿名內部類
匿名內部類是不能有名稱的內,所以沒辦法引用。必須在創建時,作為 new 語句的一部分來聲明,如下:
new <類或接口> <類的主體>
匿名內部類形式如下:
new 類或接口{
//方法主體
}
示例:
public class NiMing {
public static void main(String[] args) {
T t = new T(){
@Override
public void t() {
System.out.println("t...");
}
};
t.t();
}
}
interface T{
public void t();
}
匿名內內部類可以當作方法的返回值。
特別注意:
在使用匿名內部類時,要記住以下幾個原則。
1.匿名內部類不能有構造方法。
2.匿名內部類不能定義任何靜態成員,方法和類。
3.匿名內部類不能使用public,protected,private,static。
4.只能創建匿名內部類的一個實例。
5.一個匿名內部類一定是在 new 后面,用其隱含實現一個接口或實現一個類。
6.因匿名內部類為局部內部類,所以,局部內部類的所有限制都對其有效。
7.內部類只能訪問外部類的靜態變量或靜態方法。
8.內部類當中的 this 指的是匿名內部類本身,如果使用外部類中的 this,則“外部類.this”。