inner class

inner class 乍看起来和普通的类区别不大。但是inner class 的典型用法是在其外部类里添加methods,用以返回指向内部类的reference。

If you want to make an object of the inner class anywhere except from within a non-static method of the outer class, you must specify the type of that object as OuterClassName.InnerClassName。


inner class 同样遵循qualifier访问规则。如果一个inner class说明为private,则在其所在类以外无法被访问。
注意:普通的类(即非inner class)不能是private或protected,只能是public或
package access。

一个inner class 可以在一个method内部定义,也可以在一个method的某个scope内部定义。其访问域和普通的member相同。

匿名(anonymous)inner class,可以实现某個interface。
匿名 inner class,可以继承(恶性tends)一個擁有non-default 建構式的class。
匿名 inner class,可以執行資料成員初始化動作。
匿名 inner class,可以通过“實體(instance)初始化”來執行建構動作。注意,匿名的inner classes 不得擁有建構式。

Argument must be final to use inside anonymous inner class。

inner class 可以访问外部类的所有成员,因为inner class拥有一个reference,指向外部类的一个对象,这个对象负责创建该inner class(的对象)。




嵌套类 -- static inner class

嵌套类意味着:
1. 要创建嵌套类的对象,并不需要其外围类的对象。
2. 不能从嵌套类的对象中访问非静态的外围类对象。
嵌套类与普通的内部类还有一个区别。普通内部类的属性与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static属性,也不能包含嵌套类。但是嵌套类可以包含所有这些东西。

正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则。


要创建一个inner class 的对象,需要先创建其外部类的一个对象, 然后:
Parcel11.Contents c = p.new Contents();

因此,除非你已经有了外围类的一个对象,否则不可能生成内部类的对象。因为此内部类的对象会悄悄地链接到创建它的外围类的对象。如果你用的是嵌套类(静态的内部类),那就不需要对其外围类对象的引用。






























 
由于没有给出 `OuterClass1` 类以及 `setInnerClass` 方法的具体代码,下面从几个常见方面分析 `setInnerClass` 方法存在的必要性: ### 封装性 `setInnerClass` 方法可以提供对内部类实例的封装访问。通过该方法,可以在外部类中控制对内部类实例的赋值操作,隐藏内部类的具体实现细节。例如: ```java class OuterClass1 { private InnerClass inner; public void setInnerClass(InnerClass inner) { // 可以在这里添加一些验证逻辑 if (inner != null) { this.inner = inner; } } class InnerClass { // 内部类的具体实现 } } ``` 在上述代码中,`setInnerClass` 方法可以对传入的 `InnerClass` 实例进行验证,确保只有符合条件的实例才能被赋值给 `OuterClass1` 的 `inner` 成员变量。 ### 灵活性 使用 `setInnerClass` 方法可以在对象创建后动态地改变内部类的实例。这在需要根据不同的条件或状态来使用不同的内部类实例时非常有用。例如: ```java class OuterClass1 { private InnerClass inner; public void setInnerClass(InnerClass inner) { this.inner = inner; } public void doSomething() { if (inner != null) { inner.doInnerThing(); } } class InnerClass { public void doInnerThing() { System.out.println("Doing inner thing."); } } } ``` 在这个例子中,可以在不同的时机调用 `setInnerClass` 方法来改变 `inner` 实例,从而影响 `doSomething` 方法的行为。 ### 可维护性 `setInnerClass` 方法可以集中处理与内部类实例赋值相关的逻辑。如果后续需要对赋值逻辑进行修改,只需要修改 `setInnerClass` 方法即可,而不需要在所有使用内部类实例赋值的地方进行修改。 ### 依赖注入 在依赖注入的场景中,`setInnerClass` 方法可以用于将内部类的实例注入到外部类中。这有助于提高代码的可测试性和可扩展性。例如: ```java class OuterClass1 { private InnerClass inner; public void setInnerClass(InnerClass inner) { this.inner = inner; } public void performTask() { if (inner != null) { inner.execute(); } } } class InnerClass { public void execute() { System.out.println("Inner class execution."); } } ``` 在测试时,可以通过 `setInnerClass` 方法注入一个模拟的 `InnerClass` 实例,方便对 `OuterClass1` 进行单元测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值