在java中,不能用static修饰顶级类(top level class)。只有内部类可以为static。
静态内部类和非静态内部类之间区别:
1. 内部静态类不需要有指向外部类的引用。但非静态内部类需要。
2. 静态类只能访问外部类的静态成员,非静态内部类能够访问外部类的静态和非静态成员。
3. 非静态内部类不能脱离外部类实体被创建,非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。
修饰顶级类(top level class)会出现编译错误,划红线。
静态内部类只能访问外部类的静态成员,访问msg出现错误,可以访问name。
整体代码如下
/**
* Java中static class使用方式
* 在java中,不能用static修饰顶级类(top level class)。只有内部类可以为static
*
* @author Daniel
* @version V1.0
* @date 2019/11/21 15:21
*/
public static class StaticUnitTest {
private String msg = "";
private static String name = "";
// 静态内部类
public static class NestedStaticClass {
// 静态内部类只能访问外部类的静态成员
public void printMessage() {
// 试着将msg改成非静态的,这将导致编译错误
System.out.println("Message from nested static class: " + msg);
// 能访问外部类的静态成员
System.out.println("Message from nested static class: " + name);
}
}
// 非静态内部类
public class InnerClass {
// 不管是静态方法还是非静态方法都可以在非静态内部类中访问
public void display() {
System.out.println("Message from non-static nested class: " + msg);
System.out.println("Message from non-static nested class: " + name);
}
}
@Test
public void Test() {
// 创建静态内部类的实例
StaticUnitTest.NestedStaticClass staticClass = new StaticUnitTest.NestedStaticClass();
// 调用静态内部类的非静态方法
staticClass.printMessage();
// 不能先创建外部类实例再创建非静态内部类
StaticUnitTest.NestedStaticClass staticClass1 = new StaticUnitTest().new NestedStaticClass();
// 创建非静态内部类的实例
StaticUnitTest.InnerClass innerClass = new StaticUnitTest.InnerClass();
// 调用非静态内部类的非静态方法
innerClass.display();
// 先创建外部类实例再创建非静态内部类
StaticUnitTest.InnerClass innerClass1 = new StaticUnitTest().new InnerClass();
// 调用非静态内部类的非静态方法
innerClass1.display();
}
}