Posted on 2009-03-06 23:50
啥都寫點 閱讀(249)
評論(0) 編輯 收藏 所屬分類:
J2SE
這幾天通過看書,瀏覽別人博客的方式學習了一下內部類,以前也學過,但是用的比較少所以總是忘記。。
今天把自己現在所了解到的一點點關于內部類的知識記錄下來,日后又忘記的時候就看看

廢話少說,首先內部類分為 成員內部類,局部內部類,靜態內部類,匿名累不累(累!)
先來看看成員內部類吧:
public class RyanTestInner {
public int a = 10;
private String me = "I Love 碧昂斯, very Love";
String name = "碧昂斯";
public static void outF1(){
}
class InnerClass01 {
// static int mygod = 5; 成員內部類中不能聲明靜態成員變量和方法
int a= 100;
public void Innerf1() {
System.out.println(a); //訪問內部類自己的成員變量
System.out.println(RyanTestInner.this.a);//訪問外部類的成員變量
System.out.println(name); //訪問外部類的屬性
System.out.println(me); //訪問外部類私有屬性
}
}
public InnerClass01 returnInnerClass01() {
return new InnerClass01();
}
public static void main(String[] args) {
RyanTestInner rti = new RyanTestInner();
rti.returnInnerClass01().Innerf1();
}
}
在來看看局部內部類,也就是生命在方法中的內部類:
package com.yan.test;
public class RyanTestInner {
public void outF2() {
int a = 100;
final String b = "kiss beauty";
class InnerClass1 {
int a = 1000;
public void InnerF1(){
System.out.println(b); //如果在局部內部類中使用外部類的局部變量,該變量必須是final類型
}
}
new InnerClass1().InnerF1();
}
public static void main(String[] args) {
RyanTestInner rti = new RyanTestInner();
rti.outF2();
}
}
接下來靜態內部類
public class TestStaticInner {
static int a = 10 ;
int b = 100;
static void outF1() {
System.out.println("outF1() ");
}
/*
* 靜態內部類中可以定義非靜態的成員變量和方法,但是只能訪問外部類
* 中的靜態方法和靜態變量
*/
static class InnerClass {
int a = 11;
static int c = 20;
public void innerF2() {
System.out.println("innerF2()");
}
public static void innerF1() {
outF1();
System.out.println(TestStaticInner.a);
System.out.println(c);
}
}
public static void main(String[] args) {
TestStaticInner tsi = new TestStaticInner();
TestStaticInner.InnerClass.innerF1();
//如果想要訪問靜態內部類中的非靜態方法,需要首先 new 外部類.內部類.方法
new TestStaticInner.InnerClass().innerF2();
}
}
最后匿名內部類,我認為匿名內部類最大的好處就是實現了多繼承,連八戒都說java只能單繼承,但是通過匿名內部類就可以辦到。
首先我列舉出兩個簡單的不能在簡單的類,大家一看就了改
首先抽象類
package com.yan.test;
public abstract class ChineseBeauty {
public abstract void sex();
}
接口
package com.yan.test;
public interface JapansBeauty {
public void sex();
}
現在有個類既繼承了
ChineseBeauty又實現了JapansBeauty 那我們到底是改重寫的是哪個方法呢??(方法相同)
package com.yan.test;
public class AnonymousInnerTest extends ChineseBeauty {
@Override
public void sex() {
System.out.println("commonF() From Demo01");
}
public void fuckBeauty() {
JapansBeauty d = new JapansBeauty(){
public void sex() {
System.out.println("we are so beauty ,so sexy~~~");
}
};
d.sex();
}
public static void main(String[] args) {
AnonymousInnerTest ai = new AnonymousInnerTest();
ai.sex();
ai.fuckBeauty();
}
}
看到這里大家應該有點點明白了吧。。很簡單不難。
--
學海無涯