1.静态内部类不能访问外部类的普通成员变量,只能访问外部类的静态成员和静态方法(包括私有类型),可以在静态内部类中定义静态或非静态的方法和属性 ,若是有静态代码块外部类的静态代码块会执行,但静态内部类的静态代码块不会执行,非静态内部类不能定义静态代码块
package niuke;
public class static1 {
static {
System.out.println("111");
}
static class static2 extends static1{
static {
System.out.println("222");
}
}
public static void main(String[] args) {
}
}
执行结果是:111
2.静态内部类去掉static就变成了成员内部类:
成员内部类可以自由引用外部类的属性和方法,无论这些属性和方法是静态还是非静态的,非静态内部类不能有静态的成员,静态代码块也不能有(但有一个例外,必须是属性,不能是方法,在非静态内部类,声明静态变量时加上static final让他成为常量就可以,见文末尾)。
3.局部内部类,定义在代码块的内部,作用范围是代码块里面,他和局部变量一样,不能被public protected private 以及static修饰。
/* 外围类访问静态内部类:内部类. */
System.out.println(InnerClass1._name1);
/* 静态内部类 可以直接创建实例不需要依赖于外围类,也不能 */
new InnerClass1().display();
new OutClass.InnerClass1().display(); //这样也可以
//下面3种方式都不行outclass_Instance是外部类的一个实例
//new outclass_Instance.Class1().display();
//outclass_Instance.new Class1().display();
//OutClass.new Class1().display();
/* 非静态内部的创建需要依赖于外围类 */
OuterClass.InnerClass2 inner2 = new OuterClass().new InnerClass2();
/* 访问非静态内部类的成员需要使用非静态内部类的实例 */
System.out.println(inner2._name2);
inner2.display();
Base 和 Sub的方法调用
public class Base {
private String name="Base";
public Base(){
callname();
}
void callname(){
System.out.println(name);
}
class Sub extends Base{
private String name="Sub";
@Override
void callname() {
System.out.println(name);
}
}
public static void main(String[] args) {
Base base=new Base();
//若 Sub是static
//Base b=new Sub(); //可以
//Base b1=new Base.Sub();//可以
//Base b2=new base.Sub();//不可以
//Base b= base.new Sub();//不可以
//Base b= Base.new Sub();//不可以
//若 Sub不是static 就要写成下面这样
Base b= base.new Sub();
b.callname();
}
}
结果:
Base
null
Sub
第一个不用说,调用父类的callname(),
第二个在构造方法中调用callname()方法,由于子类中也存在此方法所以就调用子类的callname(),又因为这个时刻子类还没构造出来,所以变量name是null
第三个 ,子类已经构造出来所以是Sub
上面代码中将Sub类中的
private String name=”Sub”;
改为:
private static final String name=”Sub”;//因为是在非静态内部类中 所以要加static必须要加 final
这是的输出结果就变为
Base
Sub
Sub
The field t cannot be declared static in a non-static inner type, unless initialized with a constant expression
也就是说 在非静态内部了中不能定义非静态的属性 除非他被初始化为一个常量,而且不能是对象
比如:
private static final String name=”123”;//不报错
private static final String name=new String (“123”);//报错
我的理解是:
非静态内部类的创建依赖外部实例,所以不能被声明为单纯的static,但放在常量池中的变量比如int long String(不用new创建的)