- 浏览: 213239 次
- 性别:
- 来自: 北京
-
文章分类
内部类包括:成员内部类(和成员变量一样)、局部内部类(方法内部定义的类)、静态内部类(调用时需要指定外部类的名称)、匿名内部类(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 2311简单来说就是指定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 1136要想实现某个对象的克隆需要该对象实现java.lang.Clo ... -
修改图片大小并添加水印
2012-03-29 13:47 1286import java.awt.*; import java. ... -
JVM的内存分配
2012-03-16 10:06 0Java里的堆(heap)栈(stack)和方法区(metho ... -
HashMap添加数据的过程
2012-03-14 22:18 7106当添加的元素的key为null ... -
几种classloader的加载范围
2012-02-28 12:43 1325Bootstrap class loader:最顶级的clas ... -
利用正则表达式获取网页中多处重复出现的标签数据
2012-02-21 11:21 2716public static void main(String[ ... -
标准的URLConnection请求
2012-01-13 16:39 0只写了主要的代码 URL url = new URL(urlS ... -
常用的ClassLoader的加载范围
2012-01-13 13:53 1408WebAppClassLoader装载器装作文件的范围: 会加 ... -
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 593实现数据在多线程之间的共享: 因为线程的成员变量是各个该线程实 ... -
ThreadLocal
2012-01-10 08:55 1419ThreadLocal是实现线程范围内的数据共享,即不同线程获 ... -
线程加锁优化
2012-01-08 13:19 0实际上,在某些classes中,这种instance方法的同步 ... -
实现多线程使用继承Thread类和Runnable的原因
2012-01-03 15:09 1385我们都知道实现多线程的两种方式,一种是继承Thread类,另一 ...
相关推荐
Java 内部类 实例化 在Outer类的静态方法中实例化内部类 在同一个包的其它类中实例化Outer类中的内部类
java 内部类 实例内部类 局部内部类 匿名类 静态内部类 实例代码
4. 匿名内部类:匿名内部类是指没有名字的内部类,通常用在创建实例时使用。 为什么需要内部类? 内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是,每个内部类都能独立地继承自一个(接口的)...
如何实例内部类,这是一个简单的实现实例内部类的小代码
4种类型的内部类的实例,每一种类型内部类的定义,实例化,引用等,是学习内部类的好的实例资料!
实例 1: 不使用匿名内部类来实现抽象方法 在这个例子中,我们定义了一个抽象类Person,并且在Child类中实现了抽象方法eat()。然后,我们创建了一个Child对象,并将其向上转型为Person 类的引用。 实例 2: 匿名内部...
java内部类使用例子,可以运行
内部类可以使用this引用当前对象,但是如果内部类想引用外部类的当前对象,可以使用“外部类名”.this的形式,例如: ```java class Outer { class Inner{ public void seeOuter(){ System.out.println(this); ...
主要介绍了Java创建内部类对象实例详解的相关资料,需要的朋友可以参考下
内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为其成员。内部类的类体中不能声明静态成员变量和静态方法。 匿名类是一种特殊的内部类,它可以...
成员内部类是定义在类的内部且与类的实例相关联的类;局部内部类是定义在方法或作用域内的类;匿名内部类是没有命名的内部类,通常用于实现接口或继承父类;静态内部类是定义在类的内部且与类的实例无关的类。以上是...
第二部分是基于原生libcurl封装得到的方便用户使用的EasyCurl类的源文件(easycurl.cpp/easycurl.h),该源文件经过经过业务考验是相对成熟可靠的。在使用方面屏蔽原生libcurl的诸多内部机制,使用者关注的只是HttpGet...
静态内部类可以独立于外部类实例化,而非静态内部类需要在外部类实例化后才能实例化。 内部类的优点 内部类的第一个好处是隐藏你不想让别人知道的操作,也即封装性。在上面的例子中,类 Content 和 GDestination ...
在本节中,我们将详细介绍内部类和异常类的概念、特点和使用方法。 一、内部类 内部类是指在一个类的内部定义的类。内部类可以访问外部类的所有成员变量和方法,包括私有成员变量和方法。内部类可以分为两种:静态...
华清远见内部培训ARM实例代码,内部资料,有很好的阅读价值
// 使用匿名内部类创建一个Runnable实例 Runnable t1 = new Runnable() { @Override public void run() { System.out.println("这是线程要执行的代码!"); } }; } ``` 内部类的实例化需要先实例化其外部类...
主要介绍了JAVA 内部类详解及实例的相关资料,需要的朋友可以参考下
主要介绍了java 中匿名内部类的实例详解的相关资料,这里提供实例来帮助大家学习理解这部分内容,需要的朋友可以参考下
定义一个复数类 complex ,它的内部具有两个实例变量:realPart和imagPart,分别代表复数的实部和虚 部,编程实现要求的数学运算。 (1)实现两个复数相加。复数加运算的原则是:复数的实部和虚部分别相加。 (2...
Java基础精品课14-常用类1录屏3.实例内部类.mp4