- 浏览: 216845 次
- 性别:
- 来自: 北京
文章分类
内部类包括:成员内部类(和成员变量一样)、局部内部类(方法内部定义的类)、静态内部类(调用时需要指定外部类的名称)、匿名内部类(return new 接口名称{public 接口中定义的方法实现})
成员内部类:
作为外部类的成员存在,与外部类的属性和方法并存。
成员内部类注意事项:
1)成员内部类是依赖于外部类对象而创建的
2)成员内部类中不能定义静态成员
3)成员内部类可以访问外部类所有成员,包括外部类的方法
4)成员内部类访问自己定义的变量,直接使用变量名
5)成员内部类访问自己定义的变量可以使用this.变量名
6)成员内部类访问外部类与内部类同名的变量,使用外部类.this.变量名
7)如果内部类中没有与外部类同名的变量,可以直接使用外部类的变量的名进行访问
8)外部类的非静态方法访问内部类直接使用
Inner inner = new Inner();
inner.method();
9)外部类的静态方法访问内部类与在外部类外部访问成员内部类一样,使用
Outer out = new Outer();
Inner inner = out.new Inner();
inner.method();
实例:
publicclass Outer {
private static int i = 1;
private int j = 10;
private int k = 20;
Public static void outer_f1() {
}
Public voido uter_f2() {
}
class Inner {
//定义一个与外部类同名的变量
int j = 100;
int inner_i = 1;
void method() {
//直接使用外部类变量
System.out.println(i);
//直接使用内部类变量
System.out.println(j);
//使用this.便令名访问内部变量
System.out.println(this.j);
//使用 外部类.this.变量名 访问外部同名变量
System.out.println(Outer.this.j);
//直接调用外部类的方法
System.out.println(k);
outer_f1();
outer_f2();
}
}
//外部类的非静态方法访问成员内部类,直接实例话
publicvoidouter_f3() {
Inner inner = new Inner();
inner.inner_f1();
}
// 外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样,需要通过外部类对象创建内部类
publicstaticvoidouter_f4() {
Outer out = new Outer();
Inner inner = out.new Inner();
inner.inner_f1();
}
publicstaticvoid main(String[] args) {
//在外部类的外部使用成员内部类,需要使用外部类的对象
Outer out = new Outer();
Outer.Inner outin = out.new Inner();
outin.inner_f1();
}
}
局部内部类
局部内部类是在外部的方法中定义的内部类
局部内部类与局部变量类似,不能有访问修饰符
局部内部类可以访问当前代码块的常量和所有外部成员
注意事项:
1)局部内部类中不可以定义静态变量
2)如果局部内部类中没有与外部类同名的变量,可以直接访问访问外部类的变量名
3)可以访问局部内部类所在的方法的final变量。
4)访问局部内部类中与外部类同名的外部变量使用 外部类名.this.变量名
5)在方法中定义完局部内部类后要使用new Inner(),否则局部内部类定义的就没有意义了
6)在外部类的外部调用局部内部类,通过
Outer out = new Outer();
out.method(3);
实例
publicclass Outer {
privateints = 100;
privateintout_i = 1;
publicvoid f(finalint k) {
finalint s = 200;
int i = 1;
finalint j = 10;
//定义在方法内部
class Inner {
//定义与外部类同名的变量
ints = 300;
Inner(int k) {
inner_f(k);
}
intinner_i = 100;
void inner_f(int k) {
//直接访问内同名的外部变量
System.out.println(out_i);
//访问final的局部成员变量
System.out.println(j);
//System.out.println(i);
//is.变量名访问的也是内部类变量
System.out.println(this.s);
//类名.this.内部类变量名访问的是外部类变量
System.out.priln(Outer.this.s);
}
}
new Inner(k);
}
publicstaticvoid main(String[] args) {
// 访问局部内部类必须先有外部类对象
Outer out = new Outer();
out.f(3);
}
}
静态内部类(嵌套类)
静态内部类就是将成员内部类声明外static
注意事项:
1)静态内部类的实例化不依赖于外部类的对象
2)静态内部类不能访问外部类的非静态成员变量
3)静态内部类可以定义静态或是非静态的成员变量
4)静态内部可以使用public,protected,private修饰
5)外部类内部访问静态内部类的静态成员变量和静态方法使用
6)在外部类外部生成静态内部类使用
Outer.Inner in = new Outer.Inner();
Inner.field
Inner.method
6)外部类访问静态内部类的非静态变量或是方法,需要实例化静态内部类后再调用
Inner inner = new Inner();
inner.field
inner.method
实例:
publicclass Outer {
privatestaticinti = 1;
privateintj = 10;
public tatic vid uter_f1() {
}
publicvoidouter_f2() {
}
staticclass Inner {
staticintinner_i = 100;
intinner_j = 200;
staticvoidinner_f1() {
//静态内部类只能访问外部类的静态成员(包括静态变量和静态方法)
System.out.println("Outer.i" + i);
outer_f1();
}
voidinner_f2() {
// 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)
// System.out.println("Outer.i"+j);
// outer_f2();
}
}
publicvoidouter_f3() {
// 外部类访问内部类的静态成员:内部类.静态成员
System.out.println(Inner.inner_i);
Inner.inner_f1();
// 外部类访问内部类的非静态成员:实例化内部类即可
Inner inner = new Inner();
inner.inner_f2();
}
publicstaticvoid main(String[] args) {
newOuter().outer_f3();
Outer.Inner in = new Outer.Inner();
}
}
匿名内部类
实例
public class Parcel6 {
public Contents cont() {
return new Contents() {
private int i = 11;
public int value() {
return i;
}
}; // 在这里需要一个分号
}
public static void main(String[] args) {
Parcel6 p = new Parcel6();
Contents c = p.cont(); }
}
内部类若是要引用局部变量,则局部变量必须是final的。,
在静态方法中不能直接创建内部类对象
成员内部类:
作为外部类的成员存在,与外部类的属性和方法并存。
成员内部类注意事项:
1)成员内部类是依赖于外部类对象而创建的
2)成员内部类中不能定义静态成员
3)成员内部类可以访问外部类所有成员,包括外部类的方法
4)成员内部类访问自己定义的变量,直接使用变量名
5)成员内部类访问自己定义的变量可以使用this.变量名
6)成员内部类访问外部类与内部类同名的变量,使用外部类.this.变量名
7)如果内部类中没有与外部类同名的变量,可以直接使用外部类的变量的名进行访问
8)外部类的非静态方法访问内部类直接使用
Inner inner = new Inner();
inner.method();
9)外部类的静态方法访问内部类与在外部类外部访问成员内部类一样,使用
Outer out = new Outer();
Inner inner = out.new Inner();
inner.method();
实例:
publicclass Outer {
private static int i = 1;
private int j = 10;
private int k = 20;
Public static void outer_f1() {
}
Public voido uter_f2() {
}
class Inner {
//定义一个与外部类同名的变量
int j = 100;
int inner_i = 1;
void method() {
//直接使用外部类变量
System.out.println(i);
//直接使用内部类变量
System.out.println(j);
//使用this.便令名访问内部变量
System.out.println(this.j);
//使用 外部类.this.变量名 访问外部同名变量
System.out.println(Outer.this.j);
//直接调用外部类的方法
System.out.println(k);
outer_f1();
outer_f2();
}
}
//外部类的非静态方法访问成员内部类,直接实例话
publicvoidouter_f3() {
Inner inner = new Inner();
inner.inner_f1();
}
// 外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样,需要通过外部类对象创建内部类
publicstaticvoidouter_f4() {
Outer out = new Outer();
Inner inner = out.new Inner();
inner.inner_f1();
}
publicstaticvoid main(String[] args) {
//在外部类的外部使用成员内部类,需要使用外部类的对象
Outer out = new Outer();
Outer.Inner outin = out.new Inner();
outin.inner_f1();
}
}
局部内部类
局部内部类是在外部的方法中定义的内部类
局部内部类与局部变量类似,不能有访问修饰符
局部内部类可以访问当前代码块的常量和所有外部成员
注意事项:
1)局部内部类中不可以定义静态变量
2)如果局部内部类中没有与外部类同名的变量,可以直接访问访问外部类的变量名
3)可以访问局部内部类所在的方法的final变量。
4)访问局部内部类中与外部类同名的外部变量使用 外部类名.this.变量名
5)在方法中定义完局部内部类后要使用new Inner(),否则局部内部类定义的就没有意义了
6)在外部类的外部调用局部内部类,通过
Outer out = new Outer();
out.method(3);
实例
publicclass Outer {
privateints = 100;
privateintout_i = 1;
publicvoid f(finalint k) {
finalint s = 200;
int i = 1;
finalint j = 10;
//定义在方法内部
class Inner {
//定义与外部类同名的变量
ints = 300;
Inner(int k) {
inner_f(k);
}
intinner_i = 100;
void inner_f(int k) {
//直接访问内同名的外部变量
System.out.println(out_i);
//访问final的局部成员变量
System.out.println(j);
//System.out.println(i);
//is.变量名访问的也是内部类变量
System.out.println(this.s);
//类名.this.内部类变量名访问的是外部类变量
System.out.priln(Outer.this.s);
}
}
new Inner(k);
}
publicstaticvoid main(String[] args) {
// 访问局部内部类必须先有外部类对象
Outer out = new Outer();
out.f(3);
}
}
静态内部类(嵌套类)
静态内部类就是将成员内部类声明外static
注意事项:
1)静态内部类的实例化不依赖于外部类的对象
2)静态内部类不能访问外部类的非静态成员变量
3)静态内部类可以定义静态或是非静态的成员变量
4)静态内部可以使用public,protected,private修饰
5)外部类内部访问静态内部类的静态成员变量和静态方法使用
6)在外部类外部生成静态内部类使用
Outer.Inner in = new Outer.Inner();
Inner.field
Inner.method
6)外部类访问静态内部类的非静态变量或是方法,需要实例化静态内部类后再调用
Inner inner = new Inner();
inner.field
inner.method
实例:
publicclass Outer {
privatestaticinti = 1;
privateintj = 10;
public tatic vid uter_f1() {
}
publicvoidouter_f2() {
}
staticclass Inner {
staticintinner_i = 100;
intinner_j = 200;
staticvoidinner_f1() {
//静态内部类只能访问外部类的静态成员(包括静态变量和静态方法)
System.out.println("Outer.i" + i);
outer_f1();
}
voidinner_f2() {
// 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)
// System.out.println("Outer.i"+j);
// outer_f2();
}
}
publicvoidouter_f3() {
// 外部类访问内部类的静态成员:内部类.静态成员
System.out.println(Inner.inner_i);
Inner.inner_f1();
// 外部类访问内部类的非静态成员:实例化内部类即可
Inner inner = new Inner();
inner.inner_f2();
}
publicstaticvoid main(String[] args) {
newOuter().outer_f3();
Outer.Inner in = new Outer.Inner();
}
}
匿名内部类
实例
public class Parcel6 {
public Contents cont() {
return new Contents() {
private int i = 11;
public int value() {
return i;
}
}; // 在这里需要一个分号
}
public static void main(String[] args) {
Parcel6 p = new Parcel6();
Contents c = p.cont(); }
}
内部类若是要引用局部变量,则局部变量必须是final的。,
在静态方法中不能直接创建内部类对象
发表评论
-
JVM启动时指定-Dfile.encoding="UTF8"的作用
2013-10-17 13:50 2413简单来说就是指定JVM默认的编码方式 java io中很多方法 ... -
java多线程 小记
2012-04-15 14:49 0thread join的方法 http://blog.csdn ... -
浅析多线程
2012-04-08 22:35 0线程组 线程是被 ... -
多线程意外中断处理
2012-04-08 20:54 0本文转自:http://peirenlei.iteye.com ... -
多线程项目学习
2012-04-08 20:35 0线程组的作用: ThreadGroup类中的某些方法,可以对线 ... -
java 静态成员变量的内存分配
2012-04-06 10:28 0静态成员变量是属于类变量,即当JVM加载class文件到虚拟机 ... -
深度克隆与浅克隆
2012-04-05 16:31 1180要想实现某个对象的克隆需要该对象实现java.lang.Clo ... -
修改图片大小并添加水印
2012-03-29 13:47 1330import java.awt.*; import java. ... -
JVM的内存分配
2012-03-16 10:06 0Java里的堆(heap)栈(stack)和方法区(metho ... -
HashMap添加数据的过程
2012-03-14 22:18 7141当添加的元素的key为null ... -
几种classloader的加载范围
2012-02-28 12:43 1379Bootstrap class loader:最顶级的clas ... -
利用正则表达式获取网页中多处重复出现的标签数据
2012-02-21 11:21 2741public static void main(String[ ... -
标准的URLConnection请求
2012-01-13 16:39 0只写了主要的代码 URL url = new URL(urlS ... -
常用的ClassLoader的加载范围
2012-01-13 13:53 1440WebAppClassLoader装载器装作文件的范围: 会加 ... -
ClassLoader.getSystemClassLoader().loadClass()和Class.forName()的区别
2012-01-13 13:08 0class A { static { System.ou ... -
httpClient超时解决办法
2012-01-12 16:47 0DefaultHttpClient: 请求超时 httpcli ... -
项目中的使用技巧小记
2012-01-10 21:11 618实现数据在多线程之间的共享: 因为线程的成员变量是各个该线程实 ... -
ThreadLocal
2012-01-10 08:55 1453ThreadLocal是实现线程范围内的数据共享,即不同线程获 ... -
线程加锁优化
2012-01-08 13:19 0实际上,在某些classes中,这种instance方法的同步 ... -
实现多线程使用继承Thread类和Runnable的原因
2012-01-03 15:09 1407我们都知道实现多线程的两种方式,一种是继承Thread类,另一 ...
相关推荐
Java 内部类 实例化 在Outer类的静态方法中实例化内部类 在同一个包的其它类中实例化Outer类中的内部类
本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...
下面我们将深入探讨内部类的使用方法和优势。 首先,让我们理解内部类为何存在。内部类的一个主要原因是它们提供了多重继承的变通方案。虽然Java不支持类的多重继承,但内部类可以实现这一目标,因为每个内部类都...
4. 匿名内部类:匿名内部类是指没有名字的内部类,通常用在创建实例时使用。 为什么需要内部类? 内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是,每个内部类都能独立地继承自一个(接口的)...
这种内部类可以是成员内部类、局部内部类、匿名内部类或静态内部类,每种都有其特定的用途和使用场景。在这个"java内部类使用例子"中,我们将深入探讨这些类型,并通过实际代码来理解它们的工作原理。 首先,成员...
如何实例内部类,这是一个简单的实现实例内部类的小代码
// 在方法内部实例化局部内部类 li.display(); } } Outer outer = new Outer(); outer.method(); ``` 3. **匿名内部类**: 匿名内部类没有名字,通常用于创建一次性的简单类实例,尤其是在实现接口或继承类...
创建匿名内部类的方式是在实例化类时直接定义类的实现,不需要声明类名。 3. **方法参数内部类**:这是一种特殊类型的局部内部类,可以在方法签名中声明一个新的类。这种内部类的生命周期仅限于该方法的执行,可以...
- 匿名内部类不能是静态的,它总是在使用时被实例化,并且通常用于实现接口或继承一个类。 - 静态内部类则可以独立存在,无需匿名。 **6. 编译后的文件结构** - Java编译器会为静态内部类生成独立的`.class`文件,...
这里的`outer.new Inner()`表示我们使用`outer`这个外部类的实例来创建`Inner`内部类的一个实例。由于内部类可以访问外部类的私有成员,因此这种方式使得内部类可以与外部类紧密协作。 对于静态内部类,由于它们不...
在使用匿名内部类时,要记住以下几个原则:匿名内部类不能有构造方法、匿名内部类不能是public、protected、private、static、只能创建匿名内部类的一个实例、匿名内部类不能定义任何静态成员、静态方法、一个匿名...
本文将详细探讨内部类、匿名内部类以及内部接口的对比和使用。 首先,让我们了解一下内部类的基本概念。内部类定义在其他类的内部,编译后会生成两个独立的类文件。内部类能够自由地访问外部类的所有成员,包括私有...
- **静态内部类**:静态内部类与实例内部类的区别在于,静态内部类不依赖于外部类的实例,可以直接通过类名创建对象。它可以直接访问外部类的静态成员,但访问实例成员需通过外部类的实例。 - **局部内部类**:...
- **实例内部类**:没有使用`static`修饰的内部类,与外部类的对象绑定,每个外部类的对象可以有多个实例内部类的对象。创建实例内部类对象需要先创建外部类对象,并通过外部类对象来实例化内部类。 - **静态内部...
- 静态内部类和成员内部类在内存管理上有差异,静态内部类不会引起外部类的实例化,而成员内部类会。 - 匿名内部类不能包含任何静态声明,因为它们没有名称。 总的来说,Java 内部类是强大且灵活的工具,有助于构建...
匿名内部类是无名的,通常用于创建一次性使用的简洁实现,比如作为接口的实例。静态内部类则与普通的静态成员类似,不依赖于外部类的实例,可以独立存在。 内部类的一个重要应用场景是在事件处理中,例如Swing或...
但需要注意的是,由于这种紧密耦合,内部类实例不能独立于外部类实例存在,也就是说,必须先创建外部类对象,才能创建内部类对象。 静态内部类,又称为静态嵌套类,是内部类的一种特殊形式。与普通成员内部类不同,...
静态内部类不依赖于外部类的实例,也就是说,我们可以不创建外部类的实例而直接创建静态内部类的实例。这种内部类的主要优势在于提高了内存利用率,并且可以使用`static`修饰符定义静态成员。 **示例代码片段**: `...
4. **作用域与生命周期**:成员内部类的作用域仅限于外部类,其生命周期与外部类实例相关联,当外部类实例被销毁时,与之关联的内部类实例也会被垃圾回收。 5. **内存占用**:非静态内部类会隐含持有一个对外部类的...
Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不需要定义一个单独的类的情况下创建类的实例。这在处理回调、事件监听、单例模式以及其他需要短时间内定义一个简单类的情况时非常有用。本篇文章将...