静态嵌套类和非静态嵌套类有什么区别?
静态嵌套类和非静态嵌套类有什么区别?
一个内部类,根据定义,不能是静态的,因此我将重新阐述你的问题为“静态和非静态嵌套类之间有什么区别?”
非静态嵌套类可以完全访问其所嵌套的类中的成员。 静态嵌套类没有对包含它的类实例的引用,因此它不能调用非静态方法或访问所嵌套的类实例的非静态字段。
SomeClass.StaticMember
或在SomeClass
内部通过StaticMember
(而不是this.StaticMember
)访问静态成员,这样我们就不会遇到这些问题了。 - flying sheep静态内部类和非静态内部类有两种不同之处。
在声明成员字段和方法的情况下,非静态内部类不能具有静态字段和方法。 但是,在静态内部类的情况下,可以具有静态和非静态字段和方法。
非静态内部类的实例是通过外部类对象的引用创建的,它所定义的外部类具有封闭实例。但是,静态内部类的实例是在没有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();
}
}
静态内部类无法访问外部类的非静态成员。它可以直接访问外部类的静态成员(实例字段和方法),与过程式获取值而不创建对象的样式相同。
静态内部类可以声明静态和非静态成员。静态方法可以访问主类的静态成员。但是,它无法访问非静态内部类的成员。要访问非静态内部类的成员,必须创建非静态内部类的对象。
非静态内部类无法声明静态字段和静态方法。它必须在静态或顶层类型中声明。这样做会导致错误,提示“只能在静态或顶层类型中声明静态字段”。
非静态内部类可以以过程式样式获取值来访问外部类的静态和非静态成员,但无法访问静态内部类的成员。
在创建内部类对象之前,封闭类无法访问内部类的成员。如果主类正在访问非静态类的成员,则可以创建非静态内部类的对象。
如果主类要访问静态内部类的成员,将有两种情况:
讨论嵌套类...
区别在于,也是静态的嵌套类声明可以在封闭类之外实例化。
当您有一个非静态的嵌套类声明时,Java不允许您除了通过封闭类以外的方式进行实例化。由内部类创建的对象与由外部类创建的对象相关联,因此内部类可以引用外部的字段。
但如果它是静态的,则链接不存在,无法访问外部字段(除了通过像任何其他对象一样的普通引用),因此可以单独实例化嵌套类。
静态内部类:可以声明静态成员和非静态成员,但只能访问其父类的静态成员。
非静态内部类:只能声明非静态成员,但可以访问其父类的静态和非静态成员。
public class MultipleInner {
static class Inner {
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Inner();
}
}
}
这是在该网站上发布的一段代码...
对于问题 ---> 静态嵌套类可以多次实例化吗?
答案是 --->
当然,嵌套类型可以进行自己的实例控制(如:私有构造函数、单例模式等),但这与它是嵌套类型无关。另外,如果嵌套类型是静态枚举,则根本不能实例化它。
但总的来说,是的,静态嵌套类型可以多次实例化。
请注意,从技术上讲,静态嵌套类型不是“内部”类型。