Java:內部類的四種形式
阿新 • • 發佈:2018-11-26
內部類
- 成員內部類
- 區域性內部類
- 靜態內部類
- 匿名內部類
內部類可看做外部類的成員。外部類只能由public修飾或者預設包內訪問
而內部類卻可以用四種訪問控制符以及static修飾
成員內部類
解釋:除靜態常量外沒有靜態內容且宣告在類的成員區
外部類內容的訪問許可權:顧名思義 此時的內部類就相當於外部類的一個成員,因此可以訪問外部類的所有內容
成員限制:除靜態常量外,無靜態內容
public class OuterClass {
private int out;
public static final int CONST = 5;
private static int getCONST(){
return CONST;
}
//成員內部類
class InnerClass{
private int out;//內部類變數與外部類變數重名
private static final int test = 5;
public int getOut(){
System.out.println(OuterClass.this.out);//內部用out訪問到的是內部變數,
return out;//用 外部類名.this.變數名 訪問外部變數
}
public int innerGetCONST(){
return getCONST();
}
}
InnerClass ic = new InnerClass();//外部類內製造成員內部類物件
InnerClass p = this.new InnerClass();//實際通過this建立
}
//成員內部類是依附外部類而存在的,製造成員內部類的物件,必須存在一個外部類的物件
OutClass oc = new OutClass();
OutClass.InnerClass oi = oc.new InnerClass();
//方法二
OutClass.InnerClass oi = new OutClass().new InnerClass();
區域性內部類
解釋:作用域類似區域性變數,只在當前程式碼塊中有效的,只有在作用域內才能被例項化的內部類
外部類內容的訪問許可權:
如果在靜態方法中:
可以訪問外部類中所有靜態成員,包含私有
如果在例項方法中:
可以訪問外部類中所有的成員,包含私有
成員限制:區域性內部類中不可定義靜態變數
public class Outer {
private int out;
public void print(){
//區域性內部類
class Inner{
private int in;
private final int tset=3;
private int getIn(){
return in;
}
}
System.out.println(new Inner().getIn());//可以在外部類中直接製造區域性內部類的物件
}
}
靜態內部類
解釋:由static修飾的靜態內部類類似靜態變數/方法
可含有static修飾的方法
外部類內容訪問許可權:只可訪問外部類的靜態成員
實際上由static修飾後,此內部類已經與外部類的物件無關了,它是直接屬於外部類的,可以認為是巢狀類,類名為 外部類名.內部類名 ,實際上就是一種外部類 這個特點在製造物件的方式中可見一斑
public class Out {
private int out = 10;
//靜態內部類
static class In{
private int inner = 5;
private static int in = 6;
public void setIn(int num){
in = num;
}
public static int getIn(){
return in;
}
public static int getInner(){
return new In().inner;
}
}
In in = new In();//外部類內可直接使用
}//靜態內部類的物件製造方式
//外部類名.內部類名 變數名 = new 外部類名.內部類名();
匿名內部類
解釋:顧名思義,沒有名字的內部類。。
沒有class,interface,implements,extends關鍵字
沒有構造器
一般隱式的繼承某一個父類或者實現某一個介面,只使用一次
public class OutClass {
private int out=1;
public int getOut(OutClass oc){
return oc.out;
}
public static void main(String[] args) {
System.out.println(new OutClass(){//由此開始 繼承了OutClass類
@Override//臨時重寫了getOut方法
public int getOut(OutClass oc){
return 10;
}
}/*匿名內部類自此結束*/.getOut(new OutClass())//呼叫這個該匿名內部類的getOut方法);
}
}
//輸出為10
2018/7/21