[think in java]第10章 内部类

内部类

定义:将一个类定一个在另一个类的内部定义,就是内部类。

创建内部类

如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,需要具体的指明:outerClassName.InnerClassName;

链接到外部类

内部类能访问其外围对象的所有成员,不需要任何特殊条件。

使用.this与.new

.this用法

如果你需要生成对外部类对象的引用,可以后外部类的名字后面紧跟圆点和this。这一点在编译期就被知晓并受到检查,因此没有任何运行时开销。看下面的例子:

public class DotThis {
	void f(){ System.out.println("DotThis.f()");}

	public class Inner{
		public DotThis outer(){
			return DotThis.this;  //here
			//a plain "this" would be Inner's this
		}
	}

	public Inner inner(){ return new Inner();}
	public static void main(String [] args){
		DotThis dt = new DotThis();
		DotThis.Inner dti= dt.inner();
		dti.outer().f();
	}

}
output:
DotThis.f()

.new用法

要创建内部类对象,需要用外部类对象的引用后跟.new来完成。如下例子:

public class DotNew {
	public class Inner{}
	public static void main(String [] args){
		DotNew dn = new DotNew();
		DotNew.Inner dni = dn.new Inner();
		//注意:用.new创建内部类时,使用外部类对象dn,而非外部类的名字DotNew
	}
}

由于创建内部类时需要用到外部类对象,所以在拥有外部类对象之前是不可能创建内部类对象的。但有一种情况例外,就是创建的内部类是静态内部类(此处需注意,是静态内部类,而非静态外部类   why?)。

在方法和作用域内的内部类

可以在方法或任意的作用域定义内部类。看下面的一个例子:

public class Parcel5 {
	//此处Destination 是一个接口  具体定义未给出
	public Destination destination(String s){
		class PDestination implements Destination{
			private String label;
			private PDestination(String whereTo){
				label = whereTo;
			}
			public String readLabel(){ return label;}
		}
		return new PDestination(s);
	}
	public static void main(String [] args){
		Parcel5 p = new Parcel5();
		Destination d = p.destination("Tasmania");
	}

}

PDestination类是destination方法的一部分,是方法的内部类。在destination()方法之外不能访问PDestination。return语句进行了向上转型。另外,在Destination中定义的内部类PDestination,并不意味着dest()方法执行完毕,PDestination就不可用了。

匿名内部类

先看个例子:

public class Parcel7 {
	public Contents contents(){
		//此处Contents 是一个接口  具体定义未给出
		return new Contents(){ //insert a class definition
			private int i = 11;
			public int value(){ return i;}
		};
	}

	public static void main(String [] args){
		Parcel7 p = new Parcel7();
		Conents c = p.contents();
	}
}

contents方法中用到了匿名内部类。在创建Content对象的同时,插入了一个对匿名内部类的定义。如果在一个匿名内部类中希望它使用一个在其外部定义的对象,那么编译器会要求其参数是final的。

匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类,也可以扩展接口,但是不能两者兼得,而且如果是实现接口,也只能实现一个接口

时间: 2024-08-02 09:06:17

[think in java]第10章 内部类的相关文章

Java编程思想:第10章 内部类

可以将一个类的定义放在另一个类的内部,这就是内部类. 1.可以实现隐藏 2.内部类了解外围类,并能与之通信,很多时候可以写出更加优雅和清晰的代码 10.1创建内部类 public class Outer{ class Inner{ } } 如果想从外部类的"非静态方法之外"的任意位置创建某个内部类对象,那么必须具体指明这个对象的类型:OuterClassName.InnerClassName 10.2链接到外部类 内部类自动拥有对外围类所有成员的访问权,这是如何做到的呢?当外围类对象创

“全栈2019”Java第九十三章:内部类应用场景(迭代器设计模式)

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九十三章:内部类应用场景(迭代器设计模式) 下一章 "全栈2019"Java第九十四章:局部内部类详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习

JAVA编程思想第四版第10章

练习1 /** * 第10章 * 练习1 * @author zhtt * */ public class Test { public static void main(String[] args) { Outer outer=new Outer(); Outer.Inner inner=outer.getInner(); System.out.println(inner); /** * 输出: * [email protected] */ } } class Outer{ class Inne

“全栈2019”Java第九十章:内部类可以向上或向下转型吗?

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九十章:内部类可以向上或向下转型吗? 下一章 "全栈2019"Java第九十一章:内部类具有多态特性吗? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学

第10章-异常处理 --- Checked异常和Runtime异常体系

第10章-异常处理 --- Checked异常和Runtime异常体系 Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常).所有的RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常. 对于Checked异常的处理方法有如下两种: (1)当前方法明确知道如何处理该异常,程序应该用try...catch块来捕获该异常,然后在对应的catch块中修复该异常. (2)当

java第四章编程题(初学篇)

代码: 1 /* 2 test.java 3 */ 4 package test; 5 public class test { 6 public static void main(String args[] ) 7 { 8 CPU ccp= new CPU(); 9 HardDisk hhd=new HardDisk(); 10 PC pc =new PC(); 11 ccp.setSpeed(2200); 12 hhd.setAmount(200); 13 pc.setCPU(ccp); 14

<<Python基础教程>>学习笔记 | 第10章 | 充电时刻

第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简单的模块 #hello.py print ("Hello,World!") >>> import hello Traceback (most recent call last): File "<pyshell#56>", line 1, i

深入理解java嵌套类和内部类

一.什么是嵌套类及内部类 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner).嵌套类从JDK1.1开始引入.其中inner类又可分为三种: 其一.在一个类(外部类)中直接定义的内部类: 其二.在一个方法(外部类的方法)中定义的内部类: 其三.匿名内部类. 下面,我将说明这几种嵌套类的使用及注意事项. 二.静态嵌套类 如下所示代码为定义一个静态嵌套类

几周内搞定Java的10个方法

不要将Java与JavaScript弄混了,Java的目标是“一次编译,到处调试”(呃,不对,是“到处运行”).简单来说,就是Java程序可以直接在任何设备上运行. Java语言是什么? 不管我们是否意识到,实际上我们基本每天都在与Java打交道.在浏览网页时,可能会弹出一个提示,要求必须安装Java才能继续浏览.这种情况一般发生在使用flash或者是通过某种方式将flash组件集成到核心系统的站点. Java并不是那种通常在新电脑上直接下载下来就能用的程序.我不能确定有没有操作系统将Java作