问:简述一下内部类的实质是什么?

书上看到的一个问题,整理下来

简述一下内部类的实质是什么?

内部类是Java的类的一种形式,它的使用语法比较奇怪

分析:

package abc;
class A {//定义外部类A
   class B {//定义内部类B
      ...
   }
}

对于B类来说,它的完整类名就是abc.A.B,命名空间进一步缩小了,并且B对A产生了一种依赖关系,只有A存在的时候B才存在。

根据内部类定义结构的不同, 可以把内部类分为两种:成员式和局部式。成员式内部类指的是它们定义的地方与成员变量和成员方法类似,就好像一个类的成员一样。局部式内部类则是定义在方法体中,仅属于局部范围所有。

然后成员式内部类又分为:静态内部类和成员内部类。局部式又可以分为:普通局部内部类和匿名内部类。

1、静态内部类

package abc;
class Outter {//定义外部类Outter
	static class Inner {//定义静态内部类Inner
		...
	}
}

在外部类加载的时候,静态内部类也随之加载,它的完整类名是abc.Outter.Inner,编译后的class文件名为“Outer$Inner.class”。由于静态内部类是静态的,所以它无法访问外部类的非静态成员。其实,静态内部类相对于外部类来说,几乎是独立的,它可以在没有外部类对象的情况下,单独创造一个内部类的对象。(某种程度上来说,公开的静态内部类就相当于一个普通的类)

总结一下,静态内部类相对于外部类来说,仅仅是包含关系,缩小了命名空间,完整的类名中多了一个外部类的名称。本质上是独立的两个类,JVM也不知道他们两个有包含关系。

2、成员内部类

没有使用static修饰的内部类,例如下面的代码:

package abc;
class Outter {//定义外部类Outter
	class Inner {//定义成员内部类Inner
		...
	}
}

此时的内部类需要等外部类创建了对象以后才会被加载到JVM中,它属于外部类的某个实例,因此它可以访问外部类的静态和非静态成员。创建成员内部类的时候,语法比较特殊,首先创建一个外部类的实例,然后用这个实例调用new语句,代码如下:

public static void main(String[] args) {
		Outter o = new Outter();//创建外部类实例
		Outter.Inner i = o.new Inner();//创建内部类实例
	}

对于成员内部类的构造方法来说,系统会自动为他加上一个外部类的参数以及一个外部类的成员变量,这是为了遵循先有外部类实例才能有内部类实例的原则,代码如下:

class Inner(Outter o){//成员内部类的本质构造方法
		this.o = o;
	}

当内部类访问外部类的成员时,则是通过该自动添加的成员变量进行访问,就好像下面的代码

o.abc();

3、局部内部类

局部内部类就没有范围的概念了,它仅在定义它的方法中有效,例如下面的代码:

public void adc(){ //成员方法
		class MyLocal{  //定义局部内部类
			...			//局部内部类体
		}
	}

本质上来说,局部内部类它也是以独立的类,只不过它的一些使用受到了限制,例如,它不能使用static关键字,只能使用final、abstract关键字,仅可以访问外部类带有final关键字的局部变量,因为它访问的是一个字面量或镜像,该局部变量已经不存在了。但是,它可以任意的访问外部类对象的成员变量。

说明:与成员内部类类似,局部内部类的构造方法也会自动加上一个外部类型的参数,以及为该内部类加一个外部类型的成员变量。

当局部内部类定义在静态方法中时就相当于静态内部类:当定义在普通的成员方法中时,则相当于成员内部类。

4、匿名内部类

如果一个局部内部类没有名字,则它就是匿名内部类,例如下面的代码:

public void adc(){ //成员方法
		new OneInterface(){  //直接new一个接口
			public void interMethod(){//接口方法
				...
			}
		};
	}

在以上代码中,匿名内部类的定义和使用根本没有出现class关键字,但事实上它还是创建了。该类实现了OneInterface接口,直接在方法体中就提供具体的实现,如果需要提供构造方法的参数,则直接在OneInterface后边的那个括号中提供即可,显得非常的灵活。其实,它的工作原理相当于局部内部类,只是没有一个具体的名字而已,外部也无法直接使用它。

注意:匿名内部类编译后的class文件的命名是按照匿名内部类的排列顺序来进行的,直接在外部类后面加上“$”和序号,例如Outter$1.class。

【答案】

内部类根据定义的情况可以分为以下4种。

(1)静态内部类:它相当于外部类的静态成员一样,使用static修饰的内部类,它隶属于外部类,使用起来相当于一个独立的外部类。

(2)成员内部类:它相当于外部类普通的成员一样,隶属于外部类的具体对象,在定义它的时候,需要先创建外部类对象,再创建它的实例。

(3)局部内部类:它定义在一个方法的方法体中,它往往仅作为方法短暂的使用,只能访问用final修饰的局部变量。

(4)匿名内部类:它也定义在方法体中,但是没有一个具体的名字,具有非常大的灵活性,工作本质与局部内部类类似。

时间: 2024-08-28 19:41:25

问:简述一下内部类的实质是什么?的相关文章

内部类与匿名类(转)

Java 中的内部类和匿名类* 为什么需要内部类? Java 内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口.由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能. 不过你可能要质疑,更改一下方法的不就行了吗? 的确,以此作为设计内部类的理由,实在没有说服力.真正的原因是这样的,java 中的内部类和接口

Java的内部类

提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦.学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地

【转 Java 中的内部类和匿名类

 Java 中的内部类和匿名类 2008-10-16 13:47:41 标签:Java 内部类 匿名类 休闲 职场 Java 中的内部类和匿名类* 为什么需要内部类? Java 内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口.由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能. 不过你可能要质疑,更改一

android 内部类的优化

developer.android.com 文档中有一篇关于性能的文章,里面提到了内部类的使用.文章建议"对于私有内部类 使用 包訪问权限取代私有权限訪问", 这里说的是在内部类訪问外部类的成员或方法时假设 内部类是私有的而且外部类的成员也是私有的,那么编译器就会为内部类在外部类中添加一个静态方法. 真的是这种吗?仅仅有试一试才知道. 我们使用一个简单的样例来測试下: public class One { private int a; private class B{ public i

9)Java内部类(Inner Class)

内部类:不可以有静态数据,静态方法或者又一个静态内部类 内部类的优点:隐藏类的细节,内部类可以声明为私有.内部类可以访问外部类的对象(包括private) 静态内部类:可以有静态数据,静态方法或者又一个静态内部类 局部内部类:定义在一个方法或者一个代码块中的类,作用域为相应代码块 匿名内部类:该类没有名字,一般直接写为(new 接口(..))并返回一个实现了某接口的对象.   为什么需要内部类?     典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象.所以你

java中内部类的积累

放在一个类的内部的类我们就叫内部类. 二. 作用 1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以 2.内部类拥有外围类的所有元素的访问权限 3.可是实现多重继承 4.可以避免修改接口而实现同一个类中两种同名方法的调用. 提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就是在类中又定

java内部类的作用分析

提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦.学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地

JAVA 第二天 内部类

package com.company; /** * Created by Administrator on 2016/8/23. */ public class Outter {//生成的字节码文件是Outter.class /** * 嵌套的概念 * 类中除了变量和方法之外,还可以定义一个类 * 这个类就是内部类,就是嵌套 * * 调用内部类 需要创建内部类的对象 * */ private int a=1; //内部类可以调用外部类的成员,外部类不可以调用内部类的成员. private in

【转】Java中的内部类和匿名类

Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦.学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地设计你的程序结构.下面从以下几个方面来介绍: 第一次见面 public interface Contents {    int value();} public interfac