1.JAVA面试专题 一 基础篇3

本文详细解析了Java中的内部类概念,包括StaticNestedClass和InnerClass的区别,以及内部类如何访问外部类成员等内容。介绍了内部类的定义位置、访问类型、实例化方式及特殊用法如匿名内部类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.什么是内部类?Static Nested Class 和 Inner Class 的不同。
内部类就是在一个类的内部定义的类,内部类中不能定义静态成员(静态成员不是对象的特 性,只是为了找一个容身之处,所以需要放到一个类中而已,这么一点小事,你还要把它放 到类内部的一个类中,过分了啊!提供内部类,不是为让你干这种事情,无聊,不让你干。 我想可能是既然静态成员类似 c 语言的全局变量,而内部类通常是用于创建内部对象用的, 所以,把“全局变量”放在内部类中就是毫无意义的事情,既然是毫无意义的事情,就应该被 禁止),内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面, 也可以定义在外部类的方法体中,如下所示:
public class Outer {
int out_x = 0;
public void method() {
Inner1 inner1 = new Inner1();
public class Inner2 //在方法体内部定义的内部类 {
public method() {
out_x = 3;
} }
Inner2 inner2 = new Inner2(); }
public class Inner1 //在方法体外面定义的内部类 {
}
}
在方法体外面定义的内部类的访问类型可以是 public,protecte,默认的,private 等4种类型, 这就好像类中定义的成员变量有4种访问类型一样,它们决定这个内部类的定义对其他类是 否可见;对于这种情况,我们也可以在外面创建内部类的实例对象,创建内部类的实例对象 时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对 象,代码如下:
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Innner1();
在方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样, 但这种内部类的前面可以使用 final 或 abstract 修饰符。这种内部类对其他类是不可见的其 他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。这种内 部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的 局部变量必须先定义后使用的道理也是一样的。这种内部类可以访问方法体中的局部变量, 但是,该局部变量前必须加 final 修饰符。
对于这些细节,只要在 eclipse 写代码试试,根据开发工具提示的各类错误信息就可以马上 了解到。
在方法体内部还可以采用如下语法来创建一种匿名内部类,即定义某一接口或类的子类的同 时,还创建了该子类的实例对象,无需为该子类定义名称:
public class Outer {
public void start()
{
new Thread(
new Runable(){
} ).start();
} }
public void run(){};
最后,在方法外部定义的内部类前面可以加上 static 关键字,从而成为 Static Nested Class, 它不再具有内部类的特性,所有,从狭义上讲,它不是内部类。Static Nested Class 与普通 类在运行时的行为和功能上没有什么区别,只是在编程引用时的语法上有一些差别,它可以 定义成 public、protected、默认的、private 等多种类型,而普通类只能定义成 public 和默 认的这两种类型。在外面引用 Static Nested Class 类的名称为“外部类名.内部类名”。在外 面不需要创建外部类的实例对象,就可以直接创建 Static Nested Class,例如,假设 Inner 是定义在 Outer 类中的 Static Nested Class,那么可以使用如下语句创建 Inner 类:
Outer.Inner inner = newOuter.Inner();
由于 static Nested Class 不依赖于外部类的实例对象,所以,static Nested Class 能访问 外部类的非 static 成员变量(不能直接访问,需要创建外部类实例才能访问非静态变量)。当 在外部类中访问 Static Nested Class 时,可以直接使用 Static Nested Class 的名字,而不 需要加上外部类的名字了,在 Static Nested Class 中也可以直接引用外部类的 static 的成员 变量,不需要加上外部类的名字。
在静态方法中定义的内部类也是 Static Nested Class,这时候不能在类前面加 static 关键字, 静态方法中的 Static Nested Class 与普通方法中的内部类的应用方式很相似,它除了可以 直接访问外部类中的 static 的成员变量,还可以访问静态方法中的局部变量,但是,该局部 变量前必须加 final 修饰符。
备注:首先根据你的印象说出你对内部类的总体方面的特点:例如,在两个地方可以定义, 可以访问外部类的成员变量,不能定义静态成员,这是大的特点。然后再说一些细节方面的 知识,例如,几种定义方式的语法区别,静态内部类,以及匿名内部类。

二.内部类可以引用它的包含类的成员吗?有没有什么限制?
完全可以。如果不是静态内部类,那没有什么限制!
如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员 变量,而只能访问外部类中的静态成员,例如,下面的代码:
class Outer
{
static int x;
static class Inner {
void test() {
syso(x); }
} }
答题时,也要能察言观色,揣摩提问者的心思,显然人家希望你说的是静态内部类不能访问 外部类的成员,但你一上来就顶牛,这不好,要先顺着人家,让人家满意,然后再说特殊情 况,让人家吃惊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值