static inner class和非static inner class的实例化问题

本文详细介绍了Java中内部类的使用方法,包括静态内部类和非静态内部类的区别及实例化过程。通过具体代码示例展示了如何在同一个类或不同类中实例化内部类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package innerclasses; 
 
public class E18_NestedClass { 
 static class Nested { 
    void f() { System.out.println("Nested.f"); } 
  } 
  public static void main(String args[]) { 
    Nested ne = new Nested(); 
    ne.f(); 
  } 
} 
 
class Other { 
  // Specifying the nested type outside 
  // the scope of the class: 
  void f() { 
    E18_NestedClass.Nested ne = 
      new E18_NestedClass.Nested(); 
  } 
} /* Output: 
Nested.f 
*///:~ 

1: static inner class

当在同一个class内实例化内部类的话,只简单new就可以了。

当在另一个class内的化,就需要写清楚包含内部类的类名,如 Class.InnerClass = new Class.InnerClass();

(You can refer to just the class name when inside the method of a class with a defined nested (static inner) class, but outside the class, you must specify the outer class and nested class, as shown in Other, above.  )

=================================================================================================='

public class Test20 {
    public static void main(String[] args) {
	Class2 c = new Class2();
	Class2.Inner i = c.new Inner();
	i.f();
    }
}

class Class2 {
    class Inner {
	void f() {
	    System.out.println("Interface1 -> Inner -> f()");
	}
    }
}



2:非static inner class


http://bbs.bccn.net/thread-168190-1-1.html

First first = new First();
First.Second second = first.new First();
First.Second.Third third = second.new Third();

因为内部类中要保存外部类的一个引用,所以你先要生成外部类的对象。然后通过这个外部类的对象去创建内部类的对象。(static inner class不需要先建立外部对象)


### Java 中静态内部类的用法与行为 在 Java 编程语言中,静态内部类(non-static nested classinner class)是一种定义在另一个外部类中的类。这种设计允许更紧密地耦合逻辑并封装数据结构[^1]。 #### 静态内部类的特点 静态内部类的一个显著特点是它能够访问其外部类的所有成员变量方法,即使这些成员被声明为 `private`。这是因为静态内部类隐含了一个指向创建它的外部类实例的引用。 当尝试从外部类之外的地方实例化静态内部类时,必须提供对外部类实例的显式引用。这是由于静态内部类依赖于外部类的存在来完成初始化过程。 以下是通过代码展示如何正确使用静态内部类: ```java public class OuterClass { private String outerField = "Outer Field"; // 定义一个静态内部类 public class InnerClass { public void display() { System.out.println("Accessing outer field: " + outerField); } } // 提供一种方式来获取内部类的实例 public InnerClass createInnerInstance() { return new InnerClass(); } } // 使用外部类及其内部类的方式如下所示: public class MainApp { public static void main(String[] args) { OuterClass outerObject = new OuterClass(); // 创建外部类对象 // 利用外部类的方法获得内部类的对象 OuterClass.InnerClass innerObject = outerObject.createInnerInstance(); // 调用内部类的方法 innerObject.display(); // 另外也可以直接在外层类基础上创建内层类实例 OuterClass.InnerClass directInner = outerObject.new InnerClass(); directInner.display(); } } ``` 上述代码展示了两种不同的途径去创建以及操作静态内部类的实例。值得注意的是,在第二种情况下,“new”关键字前需指定具体的外部类实例。 #### 行为特性总结 - **内存管理**: 每次创建一个新的静态内部类实例都会保留一份对其所属外部类实例的强引用。这可能影响垃圾回收机制的行为。 - **线程安全**: 如果多个线程共享同一个外部类实例,则它们也间接共享该实例下的所有静态内部类实例的数据成员。因此需要注意同步控制以避免竞态条件的发生。 #### 性能考量 尽管静态内部类提供了便利性灵活性,但在某些高性能场景下可能会带来额外开销。因为每次构建此类都需要附加存储空间用于保存关联到父级实体的信息副本。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值