閱讀提示:如果覺得不好理解,可以按照我的思路自己操作一遍。不同元素的名稱區分的比較細,注意區分幾個概念:非靜態外部類、靜態和非靜態內部類、靜態和非靜態方法,靜態和非靜態屬性等。
java中的靜態和非靜態主要由static關鍵字區分,static關鍵字可修飾成員內部類、方法和變量(屬性)三種內容。類可以分爲兩種,外部類和內部類,內部類是包含在外部類裏面的,也就是說一個內部類一定對應一個的外部類,內部類又分爲成員內部類、匿名內部類和局部內部類,本文僅涉及成員內部類。
1靜態與非靜態類構造
用如下代碼測試:Eclipse爲非靜態外部類,Button爲非靜態內部類,Window爲靜態內部類,Eclipse和Window包含靜態變量、非靜態變量、靜態方法、非靜態方法。Button包含非靜態變量和方法。得出以下幾點:
1.1 static只能修飾內部類(例Window),不能修飾外部類(例Eclipse)。所以外部類只有非靜態外部類,內部類分爲靜態內部類和非靜態內部類。
1.2 非靜態外部類和靜態內部類可包含靜態變量和方法,非靜態內部類不包含靜態變量和方法。
1.3 無論是非靜態外部類還是非靜態內部類以及靜態內部類,都可以包含非靜態變量和方法。
class Eclipse{//外部類
String name;
static String icon;
void getname() {
}
static void geticon() {
}
class Button{//按鈕內部類
String name;
static String icon;//報錯,非靜態類中不能聲明靜態變量和靜態方法
void getname() {
}
static void geticon() {//報錯
}
}
static class Window{//窗口內部類
String name;
static String icon;
void getname() {
}
static void geticon() {
}
}
}
2靜態與非靜態類調用
用如下代碼進一步測試,得出以下幾點:
2.1非靜態外部類調用:
2.1.1 非靜態外部類非靜態方法中,可以調用所有非靜態類和靜態類的非靜態、靜態方法、變量。
2.1.2 非靜態外部類靜態方法中,不可以調用非靜態外部類非靜態變量、方法和非靜態內部類的實例、方法、變量,可以調用靜態內部類的實例、實例.方法、實例.變量。
2.2內部類調用:
2.2.1.非靜態內部類只有非靜態方法,與非靜態外部類非靜態方法一樣,可以調用所有非靜態類和靜態類的非靜態、靜態方法、變量。
2.2.2.靜態內部類的靜態與非靜態方法,不可調用所有非靜態內部類的實例、方法、變量,可以調用所有非靜態外部類的實例、實例.方法、實例.變量。
public class InnerClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
// new Eclipse().getname();
// new Eclipse().geticon();
// new Eclipse().new Button().getname();
// new Eclipse().new Window().geticon();//報錯
new Eclipse.Window().getname();
// new Eclipse.Window().geticon();//與Eclipse.Window.geticon()等效
// Eclipse.Window.geticon();
// 非靜態內部類和靜態內部類實例化的方法
// Eclipse.Button btn=new Eclipse().new Button();
// Eclipse.Window win=new Eclipse.Window();
}
}
class Eclipse {// 外部類
String name = "eclipsename";
static String icon = "eclipseicon";
void getname() {
System.out.println(name);
// new Button().getname();
// new Window().getname();
// new Window().geticon();
// Window.geticon();
// String btnname=new Button().name;
}
static void geticon() {
System.out.println(icon);
// getname();//報錯
// System.out.println(name);//報錯
// Button btn=new Button();//報錯
// new Button().getname();//報錯
// Window w=new Window();
// new Window().getname();
// new Window().geticon();
// Window.geticon();
}
class Button {// 按鈕內部類
String name = "buttonname";
// static String icon;
void getname() {
// System.out.println(name);
// new Eclipse().getname();
// Eclipse.this.getname();//非靜態內部類裏也用非靜態外部類名.this.方法實現調用實例方法的效果
// new Eclipse().geticon();
// Eclipse.geticon();
// new Window().getname();
// new Window().geticon();
// Window.geticon();
// String ecname=new Eclipse().name;
// String ecicon=new Eclipse().icon;
String s=Eclipse.this.name;//非靜態內部類裏也用非靜態外部類名.this.變量實現調用實例變量的效果
}
// static void geticon() {
// }
}
static class Window {// 窗口內部類
String name = "windowname";
static String icon = "windowicon";
void getname() {
System.out.println(name);
new Eclipse().getname();
new Eclipse().geticon();
// new Button().getname();//報錯
Eclipse.geticon();
String ecname=new Eclipse().name;
String ecicon=new Eclipse().icon;
}
static void geticon() {
System.out.println(icon);
// new Eclipse().getname();
// new Eclipse().geticon();
//// new Button().getname();
// Eclipse.geticon();
// String ecname=new Eclipse().name;
// String ecicon=new Eclipse().icon;
}
}
}