阅读提示:如果觉得不好理解,可以按照我的思路自己操作一遍。不同元素的名称区分的比较细,注意区分几个概念:非静态外部类、静态和非静态内部类、静态和非静态方法,静态和非静态属性等。
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;
}
}
}