静态嵌套类和非静态嵌套类的区别是什么?
当前回答
静态内部类和非静态内部类之间有两个区别。
如果声明成员字段和方法,则是非静态的 内部类不能有静态字段和方法。 但是,在静态内部类的情况下,可以有静态和非静态字段 和方法。 非静态内部类的实例是使用引用创建的 对象的外部类,这意味着它已经定义 封闭的实例。但是静态内部类的实例是 创建时没有引用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();
}
}
其他回答
根据定义,内部类不能是静态的,因此我将把您的问题重新定义为“静态嵌套类和非静态嵌套类之间的区别是什么?”
非静态嵌套类对其嵌套所在类的成员具有完全访问权。静态嵌套类没有对嵌套实例的引用,因此静态嵌套类不能调用非静态方法,也不能访问嵌套类所在类实例的非静态字段。
内部类不能是静态的,所以我将把你的问题重新定义为“静态嵌套类和非静态嵌套类之间的区别是什么?”
正如你在这里所说的,内部阶级不可能是静态的…我发现下面的代码是静态....原因?或者哪个是正确的....
是的,静态嵌套类型的语义中没有任何东西会阻止您这样做。这段代码运行正常。
public class MultipleInner {
static class Inner {
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Inner();
}
}
}
这是这个网站上的一个代码…
对于问题——>静态嵌套类可以实例化多次吗?
答案是——>
现在,当然嵌套类型可以做自己的实例控制(例如,私有构造函数,单例模式等),但这与它是嵌套类型的事实无关。此外,如果嵌套类型是静态enum,当然您根本不能实例化它。
但是一般来说,静态嵌套类型可以被实例化多次。
注意,从技术上讲,静态嵌套类型不是“内部”类型。
让我们看看Joshua Bloch的《Effective Java》:
从技术上讲,没有静态内部类这样的东西。根据Effective Java,正确的术语是静态嵌套类。非静态嵌套类实际上是一个内部类,与匿名类和局部类一样。
现在引用一下:
非静态嵌套类的每个实例都隐式关联 使用其包含类的封闭实例…这是可能的 调用封闭实例上的方法。
静态嵌套类不能访问外围实例。它也占用更少的空间。
静态内部类和非静态内部类之间有两个区别。
如果声明成员字段和方法,则是非静态的 内部类不能有静态字段和方法。 但是,在静态内部类的情况下,可以有静态和非静态字段 和方法。 非静态内部类的实例是使用引用创建的 对象的外部类,这意味着它已经定义 封闭的实例。但是静态内部类的实例是 创建时没有引用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();
}
}
静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了打包方便而嵌套在另一个顶级类中。
推荐文章
- URL从Java中的类路径加载资源
- .toArray(new MyClass[0]) or .toArray(new MyClass[myList.size()])?
- Hibernate中不同的保存方法之间有什么区别?
- Java 8流和数组操作
- Java Regex捕获组
- Openssl不被视为内部或外部命令
- 如何添加自定义方法到Spring Data JPA
- 如何在Ubuntu中设置Java环境路径
- 无法执行dex:在Eclipse中超过GC开销限制
- 有人能解释一下JPA和Hibernate中的mappedBy吗?
- 是什么导致JNI调用变慢?
- Java中的&和&&有什么区别?
- 使用Java的Collections.singletonList()?
- Maven使用多个src目录编译
- 从常规ES6类方法调用静态方法