静态嵌套类和非静态嵌套类的区别是什么?
当前回答
静态内部类和非静态内部类之间有两个区别。
如果声明成员字段和方法,则是非静态的 内部类不能有静态字段和方法。 但是,在静态内部类的情况下,可以有静态和非静态字段 和方法。 非静态内部类的实例是使用引用创建的 对象的外部类,这意味着它已经定义 封闭的实例。但是静态内部类的实例是 创建时没有引用Outer类,这意味着它有引用 没有封闭实例。
请看这个例子
class A
{
class B
{
// static int x; not allowed here
}
static class C
{
static int x; // allowed here
}
}
class Test
{
public static void main(String… str)
{
A a = new A();
// Non-Static Inner Class
// Requires enclosing instance
A.B obj1 = a.new B();
// Static Inner Class
// No need for reference of object to the outer class
A.C obj2 = new A.C();
}
}
其他回答
根据定义,内部类不能是静态的,因此我将把您的问题重新定义为“静态嵌套类和非静态嵌套类之间的区别是什么?”
非静态嵌套类对其嵌套所在类的成员具有完全访问权。静态嵌套类没有对嵌套实例的引用,因此静态嵌套类不能调用非静态方法,也不能访问嵌套类所在类实例的非静态字段。
静态内部类和非静态内部类之间有两个区别。
如果声明成员字段和方法,则是非静态的 内部类不能有静态字段和方法。 但是,在静态内部类的情况下,可以有静态和非静态字段 和方法。 非静态内部类的实例是使用引用创建的 对象的外部类,这意味着它已经定义 封闭的实例。但是静态内部类的实例是 创建时没有引用Outer类,这意味着它有引用 没有封闭实例。
请看这个例子
class A
{
class B
{
// static int x; not allowed here
}
static class C
{
static int x; // allowed here
}
}
class Test
{
public static void main(String… str)
{
A a = new A();
// Non-Static Inner Class
// Requires enclosing instance
A.B obj1 = a.new B();
// Static Inner Class
// No need for reference of object to the outer class
A.C obj2 = new A.C();
}
}
让我们看看Joshua Bloch的《Effective Java》:
从技术上讲,没有静态内部类这样的东西。根据Effective Java,正确的术语是静态嵌套类。非静态嵌套类实际上是一个内部类,与匿名类和局部类一样。
现在引用一下:
非静态嵌套类的每个实例都隐式关联 使用其包含类的封闭实例…这是可能的 调用封闭实例上的方法。
静态嵌套类不能访问外围实例。它也占用更少的空间。
讨论嵌套类……
不同之处在于,同样是静态的嵌套类声明可以在外围类之外实例化。
当你有一个非静态的嵌套类声明时,Java不允许你实例化它,除非通过外围类。从内部类创建的对象被链接到从外部类创建的对象,因此内部类可以引用外部类的字段。
但如果它是静态的,则链接不存在,外部字段不能被访问(除非通过像任何其他对象一样的普通引用),因此您可以通过自身实例化嵌套类。
静态内部类:可以声明静态和非静态成员,但只能访问父类的静态成员。
非静态内部类:只能声明非静态成员,但可以访问父类的静态和非静态成员。
推荐文章
- 到底是什么导致了堆栈溢出错误?
- 为什么Android工作室说“等待调试器”如果我不调试?
- Java:路径vs文件
- ExecutorService,如何等待所有任务完成
- Maven依赖Servlet 3.0 API?
- 如何在IntelliJ IDEA中添加目录到应用程序运行概要文件中的类路径?
- getter和setter是糟糕的设计吗?相互矛盾的建议
- Android room persistent: AppDatabase_Impl不存在
- Java的String[]在Kotlin中等价于什么?
- Intellij IDEA上的System.out.println()快捷方式
- 使用Spring RestTemplate获取JSON对象列表
- Spring JPA选择特定的列
- URLEncoder不能翻译空格字符
- Java中的super()
- 如何转换JSON字符串映射<字符串,字符串>与杰克逊JSON