引子:最近几天一直在看内部类,虽然自己用了java将近2年了,但是基本很少使用过内部类,除了有一次在学习android的时候,写过一些外,基本是没有使用的。说实话,个人感觉内部类很是复杂,有时候就图方便,直接用普通的类去完成任务了,也没有去考虑使用内部类这个东西。但是用不用是一回事,学不学又是另外一回事,至少要掌握,说的小点,在笔试,面试什么的有帮助。说的大点,以后遇到需要使用,或者别人写的代码,就可以无压力对待了。
今天主要介绍下最基本的成员内部类。先看个demo。
public class Out {
//内部类
private int j = 0;
private class Inner{
public int i=1;
public void f(){
System.out.println(j);
}
}
public Inner inner(){
return new Inner();
}
public static void main(String[] args) {
Out out = new Out();
out.j= 2;
Out.Inner inner = out.inner();
inner.f();
}
}
上面的例子是个很简单的内部类,Out是类(可以称为外部类),inner是内部类。我们把内部类定义作为类的一个成员的内部类称为“成员内部类”。
代码中我们看到我们使用 returnInner()这个方法去实例化了一个内部类对象,然后在main中去引用了这个对象。看似简单,但是疑问不少。疑问一:为什么要在一个方法体里面实例化内部类,直接实例化不行么?Out.Inner inner = new Inner();;疑问二:为什么在main方面里面声明内部类要加上 Out.Inner,直接inner不行么?带着这些疑问我们在eclipse测试下。
public static void main(String[] args) {
Out out = new Out();
Out.Inner inner = new Inner();//error code
System.out.println(inner.i);
}
public static void main(String[] args) {
Out out = new Out();
Inner11 inner = out.inner();
System.out.println(inner.i);
}
第一个测试报错了,显然,我们无法直接在一个静态的方法中去实例化内部类,必须要使用外部对象是实例化内部对象。
第二个测试正确了,说实话吧,《think in java》第四版中文版中有这么一句话:如果想从外部类的非静态方法之外的任何位置创建某个内部类的对象,必要具体的指明 这个对象的类型 OutClassName.InnerClassName(《think in java》第四版中文版347页)。我开始以为这句话没问题,以为必须要加上OutClassName,可是我测试的结果是没有加上OutClassName并没有报错,所以我这里个人认为是否是书中翻译错误或者是我理解错误,请知道的高手帮忙解释下这句话。
那么我就只看第一个错误的原因,就是成员内部类的初始化必须是由外部类的对象去完成这个工作。所以在main方法里面创建一个Out对象,也正是这个Out对象建立起了内部类和外部类的联系,正是这种联系,所以在内部类中是可以使用外部类的任何东西,包括声明是private的内容,这也是为什么,内部类中f()打印的是2而不是0,因为内部类和外部类中间的联系是通过外部类的一个对象的引用,也就是out,所以内部类访问外部类的东西,其实是访问这个引用里面的东西。
最后说下this.和new.的用法,先介绍下.new,其实也很简单,就是在初始化的内部类的时候,直接使用new 关键字处理,Inner inner = out.new Inner()。this的话,是指在内部类中生成对外部类的引用,例如 Out.this就是引用了外部类。
请注意,这里所有的情况都是针对于成员内部类,至于其他的静态内部类,方法内部类,将会在后面的文章中讲到,东西不在乎多,在乎精,在乎理解成自己的东西,think in java厚厚的一本,加上是国人翻译的,如果不去理解的话,那些晦涩难懂的翻译会让你头疼的。
在前面的一篇文章中我们提到过,一个class一定会生成一个class文件,内部类也不例外,它也会生成一个Out$Inner.class的class文件。
内部类始终还是一个类,它也具有一些类的基本特性,这里先介绍到这里,下节介绍方法内部类。
分享到:
相关推荐
### Java 利用反射获取内部类静态成员变量的值操作 #### 一、引言 在Java编程中,反射是一个非常强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够创建和操作对象。本文将详细介绍如何使用...
- 不同类型的内部类(静态内部类、成员内部类、局部内部类和匿名内部类)的区别和用法 - 内部类的优缺点以及使用场景 这些目标将帮助你理解和掌握内部类的概念,并能够在适当的时候使用内部类来解决问题...
内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部类。每种内部类都有其特点和应用场景。 一、成员内部类 成员内部类是指定义在外部类中的内部类。它们可以访问外部类的所有成员变量和方法,无论...
1. **成员内部类(实例内部类)**:它作为外部类的成员存在,与字段和方法并列。成员内部类可以访问外部类的实例变量,但不能有静态属性和方法(final的除外)。创建成员内部类的实例时,必须先创建外部类的实例。...
4. **作用域与生命周期**:成员内部类的作用域仅限于外部类,其生命周期与外部类实例相关联,当外部类实例被销毁时,与之关联的内部类实例也会被垃圾回收。 5. **内存占用**:非静态内部类会隐含持有一个对外部类的...
1. **成员内部类**: 成员内部类与类中的成员变量地位相同,可以在类的任何地方声明。成员内部类可以访问外部类的所有成员,包括私有成员。 2. **局部内部类**: 定义在方法、构造器或块中的类被称为局部内部类。它的...
内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...
- **非静态成员**:匿名内部类拥有对外部类的隐式引用,可以访问外部类的非静态成员,但必须通过`OuterClass.this`来明确指出。 3. **局部变量的final限制** 如果匿名内部类需要访问局部变量,那么这个局部变量...
Java 嵌套类和内部类详解 ...* 内部类可以访问外部类的成员变量和方法,但外部类不能直接访问内部类的成员变量和方法。 嵌套类和内部类是 Java 中一种非常重要的编程技术,可以使得代码更加简洁、灵活和可维护。
内部类可以分为四种:成员内部类、静态嵌套类、方法内部类和匿名内部类。 成员内部类 成员内部类是定义在外部类的成员变量中的一种内部类。它可以访问外部类的所有成员变量和方法,包括私有的变量和方法。成员内部...
13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部类(类种类).zip13.成员内部...
在外部类外访问内部类可以使用外部类对象来创建内部类对象,然后使用内部类对象来访问内部类的成员变量和成员方法。 创建非静态内部类的基本语法如下所示: class Wai { class Nei { // 内部类成员 } // 外部...
内部类可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。在这里,我们重点关注成员内部类和静态内部类。 成员内部类,就像它的名字一样,是类的一个成员,与字段和方法处于同一级别。它可以访问外部...
- 静态内部类和成员内部类在内存管理上有差异,静态内部类不会引起外部类的实例化,而成员内部类会。 - 匿名内部类不能包含任何静态声明,因为它们没有名称。 总的来说,Java 内部类是强大且灵活的工具,有助于构建...
内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态内部类与普通的成员内部类不同,它不持有对外部类的引用。因此,可以像其他静态成员一样,...
内部类可以访问外部类的所有成员,包括私有成员,这使得内部类在实现某些特定设计模式时非常有用。本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析...
根据不同的应用场景和特性,内部类可以分为多种类型:成员内部类、局部内部类、静态内部类、匿名内部类。下面将详细介绍每种类型的内部类及其特点和使用方法。 #### 成员内部类 成员内部类(也称为非静态内部类)...
该资源适合初学者。能够了解成员内部类的用法。
首先,内部类分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。成员内部类就像其他成员变量一样,可以直接访问外部类的所有成员,包括私有成员。局部内部类只存在于某个方法内,它的作用范围更小,...
- 与顶级类相比,成员内部类可以具有更广泛的访问修饰符,包括public、protected、private以及默认访问级别。 9. **实例内部类特点** - 实例内部类实例持有对外部类实例的引用,可以访问外部类的所有非私有成员。...