`

[#0x0012] 内部类:对外部类的访问及.this和.new

    博客分类:
  • Java
阅读更多

  先上代码: 

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的话,必须要先获得创建自己的外部类对象的引用。

分享到:
评论

相关推荐

    各部类职务权限表.doc

    各部类职务权限表.doc

    各部类职务权限表.pdf

    各部类职务权限表.pdf

    基于Python的深度神经网络的中文期刊分类系统.zip

    按照中国图书馆分类法文献可分为 5 个基本部类,22 个大类,176 个二级类,若干个三级类。本项目采集数据方法,拟使用对检索的“按图书分类”检索爬取二级类的数据(标题,关键词,摘要),如输入“A1”检索的到马克思...

    Java中内部类的实例化

    Java 内部类 实例化 在Outer类的静态方法中实例化内部类 在同一个包的其它类中实例化Outer类中的内部类

    【05-面向对象(下)】

     –在外部类以外的地方使用静态内部类创建对象的语法如下:new OuterClass.InnerConstructer(); 局部内部类 •如果把一个内部类放在方法里定义,这就是局部内部类,仅仅在这个方法里有效。 •局部内部类不能...

    收银机 收银系统 商用收款机用户手册

    第三章、各款编程及销售...................................................................................9 1、商品(PLU)..................................................................................

    java学习笔记

     人事部类,研发部类,市场部类:子类(派生类) 继承:使得一个类A能够直接使用另外一个类B的属性和方法的一种途径 类A可以有自己的属性和方法 继承语法:修饰符 class Subclass extends superClass{ // 类定义...

    C#中分部类和分部方法的应用

    1.分部类的特性和应用 1.1分部类的定义 在定义一个类时,加上partial关键字,此类即成为分部类。 分部类允许将一个类的代码分散于一个以上的源代码文件中。 Person.cs代码如下 代码如下:namespace PartialClassDemo1...

    鑫达进销存适用于大、中、小超市,批发商,物流配送中心,商店等

    并简单的区分每个月正常商品和特价商品的销售情况及利润。 26.销售查询,可按多种条件进行。可查询大类,小类,供应商,货位等销售情况,也可查询某一商品的销售情况。可分明细查询或汇总查询。可按单一款台查询。也...

    雄鹰超市pos管理系统

    生鲜管理:完善科学的生鲜管理流程,系统提供从生鲜采购进货,生鲜内部转货,前台销售等科学管理流程,提供报损单、加工单、领用单、拆分单、礼篮捆绑等辅助工具,全面的生鲜类别分析报表,让您更好的管理生鲜商品,...

    第三章 体系分类法.ppt

    第三章 体系分类法 体系分类法是以科学分类为基础,依据概念的划分与概括...◆ 基本部类 ◆ 基本大类 ◆ 简表 ◆ 详表 ◆ 主表类目之间的关系 体系分类法的标记符号 体系分类法的复分表 体系分类法的类目注释与索引

    科脉超市收银软件3.5全套.rar

    ● 部类销售、柜台(专柜)销售 ● 销售实时监控 ● 单笔折扣、整笔折扣、赠送 ● 多种促销方式(会员特价、零售特价、权限打折) ● 会员卡(IC卡、磁卡) ● 储值卡(IC卡、磁卡) ● 支持多种打印方式(小票、套...

    机密文件管理

    1 添加部门、部类、库房、供应商等信息,这里是建立商品存放位置及商品供应商的初始设置,如果不管理商品可略过该步,按照默认即可。 2 设置卡类型,根据大多数客户要求,我们已经添加好会员卡、储值卡、商品卡、计...

    嵌入式系统/ARM技术中的基于嵌入式操作系统的超市预收款系统的设计

    机器配置有两个232接口,可与条码阅读器和电子称相接,并可以和PC进行232联网管理收银机编程信息及接收简单的报表功能。 此系列收银机性价比高灵活性强,适用于规模较小的零售店、超市、快餐店、专卖店、士多店等...

    基于嵌入式操作系统的超市预收款系统的设计

    机器配置有两个232接口,可与条码阅读器和电子称相接,并可以和PC进行232联网管理收银机编程信息及接收简单的报表功能。 此系列收银机性价比高灵活性强,适用于规模较小的零售店、超市、快餐店、专卖店、士多店等...

Global site tag (gtag.js) - Google Analytics