【转载】http://hi.baidu.com/honglin_bd/blog/item/fa60c4d3866f972933fa1c87.html
1、内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。
几种内部类的共性:
A、内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类的类命和$符号。
B、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
2、成员内部类:形式如下
class Outer {
class Inner{}
}
编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。
3、方法内部类。
顾名思义,把类放在方法内。
class Outer {
public void doSomething(){
class Inner{
public void seeOuter(){
}
}
}
}
A、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
B、方法内部类对象不能使用该内部类所在方法的非final局部变量。
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
下面是完整的例子:
class Outer {
public void doSomething(){
final int a =10;
class Inner{
public void seeOuter(){
System.out.println(a);
}
}
Inner in = new Inner();
in.seeOuter();
}
public static void main(String[] args) {
Outer out = new Outer();
out.doSomething();
}
}
4、匿名内部类。
顾名思义,没有名字的内部类。表面上看起来它们似乎有名字,实际那不是它们的名字。
A、继承式的匿名内部类。
class Car {
public void drive(){
System.out.println("Driving a car!");
}
}
class Test{
public static void main(String[] args) {
Car car = new Car(){
public void drive(){
System.out.println("Driving another car!");
}
};
car.drive();
}
}
结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象。
B、接口式的匿名内部类。
interface Vehicle {
public void drive();
}
class Test{
public static void main(String[] args) {
Vehicle v = new Vehicle(){
public void drive(){
System.out.println("Driving a car!");
}
};
v.drive();
}
}
上面的代码很怪,好像是在实例化一个接口。事实并非如此,接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。
C、参数式的匿名内部类。
class Bar{
void doStuff(Foo f){}
}
interface Foo{
void foo();
}
class Test{
static void go(){
Bar b = new Bar();
b.doStuff(new Foo(){
public void foo(){
System.out.println("foofy");
}
});
}
}
5、静态嵌套类。
从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
分享到:
相关推荐
而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在方法调用前后插入切面逻辑。 接下来,我们转向DataSource的实现。在Spring中,DataSource是用于存储和管理数据库连接的...
全书共20章,分为4篇进行介绍,第1篇为基础篇,包括Java开发前奏、搭建Java开发环境、 扎实Java语言基本语法、掌握算法和流程控制、使用Eclipse开发工具、探秘面向对象程序设计、初探Java数组;第2篇为核心篇,包括...
1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...
受限指针在Java中指的是Java的内部机制,如本地方法接口(JNI)中使用的指针,这些指针受到严格的限制,避免了指针操作带来的安全隐患。本地方法接口允许Java代码调用C或C++的库,这时需要使用到指针,但这些指针的...
1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...
对于音乐播放,可以创建一个链接到音乐文件的超链接,或者在Applet内部实现音乐的加载和播放逻辑。然而,需要注意的是,由于安全性和现代浏览器的限制,Java Applet的使用已经逐渐减少,许多现代浏览器默认不再支持...
同时,“入门书籍”强调了该书是针对那些希望初探Java编程世界的读者。 从提供的【部分内容】来看,这些文字是扫描过程中由于OCR技术限制而出现识别错误和遗漏的文本。尽管如此,我们还是能够从中解读出一些关于...
本书是为全英文版本。 ...第13章 借口和内部类 第14章 泛型和arraylist类 第15章 链式数据结构 第16章 稽核,映射和迭代器 第17章 初探swing 第18章 深入swing 第19章 java的发展永无止境
**JDBC事务初探** Java Database Connectivity(JDBC)是Java平台中用于与关系数据库进行交互的API。在处理数据库操作时,事务管理是至关重要的一个环节,它确保了数据的一致性和完整性。本篇文章将深入探讨JDBC中...
数据转换则是将用户输入的数据转换为应用程序内部使用的格式。 **七、国际化和本地化** JSF支持多语言应用,通过资源包(Resource Bundle)来实现。开发者可以创建不同语言版本的资源包,JSF会根据用户的区域设置...
标题 "GWT通信机制初探" 指的是探讨Google Web Toolkit (GWT) 的通信方式,这是一种用于构建高性能、跨浏览器的JavaScript应用程序的开发框架。GWT允许开发者使用Java语言编写前端代码,并自动编译成优化过的...
《Java实现:坦克大战——初探游戏编程与技术要点》 在编程的世界里,游戏开发是一种极具挑战性和趣味性的实践。对于初学者来说,通过编写简单的游戏,如“坦克大战”,可以快速掌握基础编程概念,并逐步提升到更...
代理类内部调用目标类的方法,同时添加额外的行为,如日志记录。这种方法灵活性较低,因为每个新的服务都需要创建新的代理类。 2. **动态代理**:在运行时动态创建代理,无需预先知道目标类的具体实现。Java中的`...
【Selenium自动化测试初探】 本文旨在探讨如何利用Selenium、JUnit和Hudson构建一个自动化测试框架。Selenium是一款强大的开源Web功能测试工具,支持多种编程语言,如Ruby、Python、Java、Perl和C#。它能直接在...
`javap`是Java Platform Debugger Architecture的一部分,它能帮助开发者查看Java类文件的编译后细节,包括字节码、常量池、局部变量表等信息。 在描述中提到的链接是一个博客文章,可能详细解释了如何使用`javap -...
### Vertx-Web初探 #### 一、项目概述与准备 ##### 1.1 基本项目结构 为了确保项目的顺利进行,首先需要创建一个Maven项目,并且按照以下结构组织: - 源代码包:`src/main/vertx` - 资源路径:`src/main/...
《bbosspersistent性能初探》 在深入探讨bbosspersistent的性能之前,我们首先需要理解这个框架的核心概念和用途。bbosspersistent是一个基于Java的持久化框架,它提供了一种高效、灵活的方式来管理和操作数据库。...
### APP架构之后端接口设计方案之初探 #### 一、设计思想 在移动应用(APP)的开发过程中,后端接口的设计尤为关键。为了确保良好的用户体验,必须遵循一系列的设计原则和技术规范。首先,考虑到移动网络环境的局限...