当前位置:首页 > 全部子站 > IT > 思科认证

Java内部类(InnerClass)详解

来源:长理培训发布时间:2017-12-23 14:45:43

 百度广告

简单的说,内部(inner)类指那些类定义代码被置于其它类定义中的类;而对于一般的、类定义代码不嵌套在其它类定义中的类,称为顶层(top-level)类。对于一个内部类,包含其定义代码的类称为它的外部(outer)类。1 Static member class(静态成员类)类声明中包含"static"关键字的内部类。如以下示例代码,Inner1/Inner2/Inner3/Inner4就是Outer的四个静态成员类。静态成员类的使用方式与一般顶层类的使用方式基本相同。 public class Outer{
//access privilege level: public 
public Inner1() {
staticMethod(); 
//instanceMethod(); 
}

//access privilege level: default 

}

//access privilege level: private 
//define a nested inner class in another inner class 
}

private static void staticMethod() {
/*public static class Inner4() {
}

private void instanceMethod() {
Inner3 inner3 = new Inner3();
Inner3.Inner4 inner4 = new Inner3.Inner4();
}

class Test {
//Test and Outer are in the same package, so Inner2 can be accessed here
//Compile error: Inner3 cannot be accessed here
}
1.1 静态成员类特性

静态成员类可访问外部类的任一静态字段或静态方法 像静态方法或静态字段一样,静态成员类有public/private/default权限修饰符 1.2 静态成员类约束 静态成员类不能与外部类重名 像外部类的静态方法一样,不能直接访问外部类的实例字段和实例方法 静态成员类只能定义于外部类的顶层代码或外部类其它静态成员类的顶层代码中(嵌套定义);不能定义于外部类的某个函数中。 1.3 新增语法如示例代码所示,可以以"OuterClass.InnerClass"的方式来引用某个内部类。1.4 什么时候使用静态成员类B为A的辅助类,且只为A所用时,可将B定义为A的静态成员类。例如JDK中的LinkedList类就有Entry静态成员类:public class LinkedList extends AbstractSequentialList  …;
E element;
Entry previous;

Entry(E element, Entry next, Entry previous) {
this.next = next;
}
…;

2 Member class(成员类)
一个静态成员类,若去掉"static"关键字,就成为成员类。如下示例代码,Inner1/Inner2/Inner3/Inner4就是Outer的四个成员类
//just like instance method, member class has public/private/default access privilege levels

//access privilege level: public 
private int data;
public Inner1() {
data1 = 1;
data = 1;
Outer.this.data = 1;
}

//access privilege level: default
//can not define static filed, method, class in member class

//but, "static final" compound is allowed 
}

//access privilege level: private 
public class Inner4 {

}

//in fact, Inner5 is not a member class but a static member class
}

private static void staticMethod() {
//Inner1 inner1 = new Inner1();

private void instanceMethod() {
Inner1 inner1 = new Inner1();
}

class Test {
//cannot create member class instance directly in class other than outer class

//create a member class instance outside it's outer class
Outer.Inner1 inner1 = outer.new Inner1();
}2.1 成员类特性
· 类似于外部类的实例函数,成员类有public/private/default权限修饰符· 一个成员类实例必然所属一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数。2.2 成员类约束

成员类不能与外部类重名 不能在成员类中定义static字段、方法和类(static final形式的常量定义除外)。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去 成员类不能是接口(interface)。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的。事实上,如示例代码所示,如果你以成员类的形式定义一个接口,该接口实际上是一个静态成员类,static关键字对inner interface是内含(implicit)的。 2.3 新增语法一个成员类实例必然所属于其外部类的一个实例,那么如何在成员类内部获得其所属外部类实例呢?如示例代码所示,采用"OuterClass.this"的形式。2.4 指定内部类实例所属的外部类实例内部类实例可在其外部类的实例方法中创建,此新创建内部类实例所属的外部类实例自然就是创建它的外部类实例方法对应的外部类实例。另外,如示例代码所示,对于给定的一个外部类实例outerClass,可以直接创建其内部类实例,语法形式为:
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
2.5 什么时候使用成员类成员类的显著特性就是成员类能访问它的外部类实例的任意字段与方法。方便一个类对外提供一个公共接口的实现是成员类的典型应用。以JDK Collection类库为例,每种Collection类必须提供一个与其对应的Iterator实现以便客户端能以统一的方式遍历任一Collection实例。每种Collection类的Iterator实现就被定义为该Collection类的成员类。例如JDK中AbstractList类的代码片断:public abstract class AbstractList extends AbstractCollection implements List { private class Itr implements Iterator {
}

public Iterator iterator() {
}

3 Local class(局部类)
对一个静态成员类,去掉其声明中的"static"关键字,将其定义移入其外部类的静态方法或静态初始化代码段中就成为了局部静态成员类。对一个成员类,将其定义移入其外部类的实例方法或实例初始化代码中就成为了局部成员类。局部静态成员类与静态成员类的基本特性相同。例如,都只能访问外部类的静态字段或方法,但不能访问外部类的实例字段和实例方法等。局部成员类与成员类的基本特性相同。例如,局部成员类实例必属于其外部类的一个实例,可通过OuterClass.this引用其外部类实例等。另外,局部类也有其自己的特性,如以下代码所示: public class Outer {
private static int staticField;

//define a local member class in instance code block
int localVirable1 = 0;
class Inner1 {
//can access its outer class' field and method directly
//use OuterClass.this to get its corresponding outer class instance

//can not access the not final local virable in its containing code block

//can access the final local virable in its containing code block
}

//local class can not have privilege modifier 
}*/

// define a local static member class in static code block
class Inner2 {
staticField = 1;
//intanceField = 2;
}

public void intanceMethod() {
class Inner3 {

//local class is visible only in its containning code block
}

private static void staticMethod() {
class Inner4 { 
staticField = 2;
}

//can not define a interface as a local class
}*/
}
3.1 局部类特性
如示例代码所示,局部类能且只能访问其所属代码段中的声明为final的局部变量。为什么只能访问声明为final的局部变量呢?我们知道,局部变量在其所属的代码段(譬如某个函数)执行完毕后就会被回收,而一个局部类的实例却可以在其类定义所属代码段执行完毕后依然存在,如果它可操控非final的局部变量,用户就可以通过该实例修改已不存在的局部变量,无意义。3.2 局部类约束

如示例代码所示,内部类只在定义它的代码段中可见,不能在它所属代码段之外的代码中使用;因此也就没有public/private/default权限修饰符(无意义) 不能以局部类形式定义一个接口。局部类只在其所属代码段中可见,定义这样的接口无意义 局部类类名不能与其外部类类名重复 3.3 什么时候使用局部类局部类大部分以匿名类的形式使用。4 Anonymous class(匿名类)没有类名的局部类就是匿名类。用一条语句完成匿名类的定义与实例创建。例如如下代码:public class Outer { public void instanceMethod() {
Action action = new Action() {
System.out.println("a simple anonymous class demo");
action.doAction();

//define a nonoymous class which extends BaseClass and create an instance of it
public void printData(){
}
}

interface Action {
}

class BaseClass {

public BaseClass (int data) {
}

public int getData() {
}

匿名类是一种特殊的局部类。局部类的特性与约束都适用与它。4.2 新增语法4.2.1 继承自某个基类的匿名类

new class-name ( [ argument-list ] ) { class-body }
创建匿名类实例时,"argument-list"将被传入其基类(即class-name)对应的构造函数。4.2.2 实现某个接口的匿名类
new interface-name () { class-body }
4.3 什么时候使用匿名类 该类定义代码段很短 只需要创建该类的一个实例 类的定义代码与类的使用代码紧邻 使用匿名不影响代码的易读性 譬如,如下实现类似与c的callback功能的代码就是匿名类的典型应用: File f = new File("/src"); // The directory to list

// Now call the list() method with a single FilenameFilter argument
// as part of the method invocation expression. 
public boolean accept(File f, String s) { return s.endsWith(".java"); }

 

责编:罗莉

发表评论(共0条评论)
请自觉遵守互联网相关政策法规,评论内容只代表网友观点,发表审核后显示!

国家电网校园招聘考试直播课程通关班

  • 讲师:刘萍萍 / 谢楠
  • 课时:160h
  • 价格 4580

特色双名师解密新课程高频考点,送国家电网教材讲义,助力一次通关

配套通关班送国网在线题库一套

课程专业名称
讲师
课时
查看课程

国家电网招聘考试录播视频课程

  • 讲师:崔莹莹 / 刘萍萍
  • 课时:180h
  • 价格 3580

特色解密新课程高频考点,免费学习,助力一次通关

配套全套国网视频课程免费学习

课程专业名称
讲师
课时
查看课程
在线题库
面授课程更多>>
图书商城更多>>
在线报名
  • 报考专业:
    *(必填)
  • 姓名:
    *(必填)
  • 手机号码:
    *(必填)