先上代码:
class Outer
{
public class Inner
{
public String getInnerClassName()
{
return Inner.this.getClass().toString(); //'Inner' can be omitted here
}
public String getOuterClassName()
{
return Outer.this.getClass().toString(); //'Outer' CANNOT be omitted here
}
}
public Inner createInner()
{
return new Inner(); //'return this.new Inner();' is OK here
}
}
public class InnerTest
{
public static void main(String[] args)
{
Outer o = new Outer();
Outer.Inner i1 = o.new Inner();
Outer.Inner i2 = o.createInner();
System.out.println(i1.getOuterClassName());
System.out.println(i2.getInnerClassName());
}
}
//output:
/*
class Outer
class Outer$Inner
*/
1. .new
内部类对象是不能直接创建的。必须先创建一个外部类对象,再由这个外部类对象来创建内部类对象。这样处理可能是为了体现内部类对象是依存外部类对象存在的,即内部类对象不能脱离外部类对象而存在。一个外部类对象可以创建多个内部类对象(类似Process与Thread的关系)。创建方法有2种:
- OuterClassObj.new InnerClass():即使用.new和内部类构造器,如上面代码中的:
Outer.Inner i1 = o.new Inner();
- OuterClassObj.InnerClassConstructorProxy():即使用在外部类中定义的内部类构造器的代理方法,如上面代码中的:
Outer.Inner i2 = o.createInner();
上面2种方法其实是等价的。
这里注意,内部类的声明类型必须是Outer.Inner,编译出的文件为Outer$Inner.class。
2. .this
其实可以把this当作class的一个static field,就算不用内部类,也可以照样用class.this形式,如上面代码中的:
public String getInnerClassName()
{
return Inner.this.getClass().toString(); //'Inner' can be omitted here
}
不过鉴于内部类和外部类的特殊关系,内部类必须能够访问其创建者,所以在内部类中可以使用Outer.this来指向创建这个内部类对象的外部类对象。如: [code="java"][/code]
public String getOuterClassName()
{
return Outer.this.getClass().toString(); //'Outer' CANNOT be omitted here
}
p.s. 总结一点,.this与class连用(类似staitc,class.this),.new与reference连用(obj.new)。
3. 对外部类的field和function的访问
就如同我们在一般类的方法或是constructor中省略this一样,内部类的方法也是如此,只是内部类中省略的是this(i.e. Inner.this)和Outer.this这2个this。所以看上去在内部类的方法中可以直接访问外部类的field/function,而且无论是哪种访问权限的field/function都可以访问,其实是因为内部类方法中可以通过Outer.this链接到外部类,由外部类来访问外部类的field/function,自然是可以不考虑访问权限了。
如果内部类和外部类有同名的field/function,单纯使用SameFieldName或是SameFunctionName()会被优先识别为内部类的field/function,如果想要用外部类的field/function,必须用Outer.this来指定。
如果你手中只有内部类对象,比如i1、i2,这样是无法直接访问外部类的field/function的,因为外部类的field/function并不属于内部类,类似i1.OuterField或是i2.OuterFunction()是无法通过编译的。所以i1、i2想要访问外部类的field/function只能间接通过内部类的方法。
总之,简单的说,内部类对象要想访问外部类对象的field或是function的话,必须要先获得创建自己的外部类对象的引用。
分享到:
相关推荐
- 内部类可以作为线程的target,因为每个内部类实例都隐含地持有一个对外部类的引用,这使得它们在并发编程中能处理复杂的对象交互。 6. **内存管理**: - 内部类实例与外部类实例的生命周期紧密相关,当外部类被...
- 内部类对象会占用额外的内存空间,因为它们隐含了一个对外部类的引用。 - 这可能对内存敏感的应用造成影响,需要谨慎使用。 7. **序列化与内部类**: - 如果一个类包含非静态内部类,那么该类必须实现...
然而,如果内部类持有一个对外部类的引用,即使外部类对象不再使用,只要内部类对象还存在,外部类也不会被回收。 8. 内部类与序列化: 内部类默认情况下不会被序列化。若需要序列化,需要实现`Serializable`接口...
若内部类和外部类有同名成员,访问外部类成员时需使用`外部类名.this.外部成员名`的形式。 - **创建内部类对象**:必须通过外部类的实例来创建内部类对象,如`外部对象名.new 内部类构造方法()`。 ### 3. 部类与...
System.out.println("访问内部类非静态成员" + new Inner().name2); } } public static void main(String[] args) { // 直接通过静态内部类名创建对象 Inner.innerTest(); } } ``` ### C. 方法内部类 方法...
16. 社会资本简单再生产的基本实现条件是Ⅰ(v+m)=Ⅱc,即第一部类生产的消费资料等于第二部类资本家和工人的消费需求(答案:A)。 17. 资本主义经济危机周期性的物质基础是固定资本的更新,每次危机后资本家会更新...
- **内存管理**:匿名内部类会隐式地持有一个对外部类的引用,可能导致内存泄漏。 - **访问权限**:匿名内部类可以访问其所在的作用域,但不能访问局部变量,除非该变量是`final`的。 通过理解这些核心概念和示例...
5. **内存占用**:非静态内部类会隐含持有一个对外部类的引用,这可能导致内存泄漏。如果外部类是大对象,且内部类生命周期长,可能造成不必要的内存消耗。 6. **访问权限**:内部类可以访问外部类的所有成员,包括...
在产业属性方面,通信业最初被划分为马克思的两大部类理论中的非物质生产部门,后来随着信息产业的发展,又经历了三次产业划分理论和四次产业划分理论的演变。信息产业被广泛定义为涉及信息生产、流通、使用的产业,...
《商用收款机用户手册》是指导用户理解和操作收银系统的必备文档,涵盖了从基础设备介绍到复杂业务处理的全面知识。以下是对手册内容的详细解释: ### 第一章:收款机简要介绍 1. **安全指导**:这部分强调了在使用...
然而,需要注意的是,由于每个内部类实例都隐式地持有一个对外部类的引用,这可能导致内存泄漏。如果线程生命周期长于外部类,那么外部类可能无法被垃圾回收。因此,合理管理和及时停止不再使用的线程至关重要。 在...
根据提供的《政治经济学》(Ⅰ)教学大纲的内容,我们可以从中提炼出多个重要的知识点和学习目标,下面将对其进行详细解析。 ### 一、课程基本信息 - **课程代码**:4010501 - **课程名称**: - 中文名:政治经济...
- 非静态内部类默认有一个对外部类的引用,这不符合题目要求。 - `static`关键字表明这是一个静态内部类,可以直接访问外部类的静态成员。 ##### 3. Java接口的作用及示例 - **接口作用**: - 接口是一种抽象...
- 静态内部类不持有对外部类的引用,可以独立存在,而非静态内部类则隐含着一个对外部类的引用。 - 静态内部类可以在外部类之外被实例化,而非静态内部类必须在外部类的一个实例中才能被创建。 - 静态内部类不能...
文档"各部类职务权限表.doc"主要列举了公司内部不同部门及职务的职责权限,包括总务类、人事类、财务会计类和电脑类。以下是各部分的详细说明: **总务类职权表** 总务类职责主要涉及公司日常运营的后勤保障,包括...
- 占用空间:每个内部类对象都会包含一个对外部类的引用,这可能会增加内存占用。 使用内部类可以提高代码的可读性和可维护性,尤其是在实现某些复杂设计模式时,例如策略模式、观察者模式等。但是,过度使用内部类...
按照中国图书馆分类法文献可分为 5 个基本部类,22 个大类,176 个二级类,若干个三级类。本项目采集数据方法,拟使用对检索的“按图书分类”检索爬取二级类的数据(标题,关键词,摘要),如输入“A1”检索的到马克思...
- 非静态内部类:每个实例都包含一个对外部类的引用,必须在外部类的实例上下文中创建。 8. **Java的同步机制**: - `synchronized`关键字:用于锁定代码块或整个方法,确保同一时间只有一个线程能执行特定代码。...