第6节 内部类
7.6 内部类
内部类
在另一个类或方法的定义中定义的类
可访问其外部类中的所有数据成员和方法成员
可对逻辑上相互联系的类进行分组
对于同一个包中的其他类来说,能够隐藏
可非常方便地编写事件驱动程序
声明方式
命名的内部类:可在类的内部多次使用
匿名内部类:可在new关键字后声明内部类,并立即创建一个对象
假设外层类名为Myclass,则该类的内部类名为
Myclass$c1.class (c1为命名的内部类名)
Myclass$1.class (表示类中声明的第一个匿名内部类)
7.6 内部类——Parcel1.java
public class Parcel1 { class Contents { //内部类
private int i = 11;
public int value() { return i; } }
class Destination { //内部类
private String label;
Destination(String whereTo) { label = whereTo; }
String readLabel() { return label; } }
public void ship(String dest) { Contents c = new Contents();
Destination d = new Destination(dest);
System.out.println(d.readLabel()); }
public static void main(String[] args) { Parcel1 p = new Parcel1();
p.ship("Tanzania"); }}
说明
在Parcel1类中声明了两个内部类Contents、Destination
在ship方法中生成两个内部类对象,并调用了内部类中声明的一个方法
7.6 内部类——Parcel1.java
外部类的方法可以返回内部类的引用变量
public class Parcel2 { class Contents { private int i = 11;
public int value() { return i; } }
class Destination { private String label;
Destination(String whereTo) { label = whereTo; }
String readLabel() { return label; }
} public Destination to(String s){ return new Destination(s); }
public Contents cont() { return new Contents(); }
public void ship(String dest) { Contents c = cont();
Destination d = to(dest);
System.out.println(d.readLabel());
}
public static void main(String[] args) { Parcel2 p = new Parcel2();
p.ship("Tanzania");
Parcel2 q = new Parcel2();
Parcel2.Contents c = q.cont();
Parcel2.Destination d =q.to("Borneo");
}}说明
to()方法返回内部类Destination的引用
cont()方法返回内部类Contents的引用
7.6 内部类——内部类实现接口
内部类实现接口
可以完全不被看到,而且不能被调用
可以方便实现“隐藏实现细则”。你所能得到的仅仅是指向基类(base class)或者接口的一个引用
例子
abstract class Contents { abstract public int value();}
interface Destination { String readLabel();}
7.6 内部类——Parcel3.java
public class Parcel3 { private class PContents extends Contents { private int i = 11;
public int value() { return i; }
}
protected class PDestination implements Destination { private String label;
private PDestination(String whereTo) { label = whereTo;}
public String readLabel() { return label; } }
public Destination dest(String s) { return new PDestination(s); }
public Contents cont() { return new PContents(); }}
7.6 内部类——Parcel3测试
class Test {
public static void main(String[] args) { Parcel3 p = new Parcel3();
Contents c = p.cont();
Destination d = p.dest("Tanzania");
// Illegal -- can't access private class:
Parcel3.PContents c = p.new PContents();
}} 说明
内部类PContents实现了抽象类Contents
内部类PDenstination实现了接口Destination
外部类Test中不能声明对private的内部类的引用
7.6 内部类——方法中的内部类
在方法内定义一个内部类
为实现某个接口,产生并返回一个引用
为解决一个复杂问题,需要建立一个类,而又不想它为外界所用
7.6 内部类——匿名的内部类
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(); } }
基类需要一个含参数的构造方法
例子
public class Parcel7 { public Wrapping wrap(int x) { return new Wrapping(x) public int value() { return super.value() * 47; }
};
}
public static void main(String[] args) { Parcel7 p = new Parcel7();
Wrapping w = p.wrap(10); }}
内部类
在另一个类或方法的定义中定义的类
可访问其外部类中的所有数据成员和方法成员
可对逻辑上相互联系的类进行分组
对于同一个包中的其他类来说,能够隐藏
可非常方便地编写事件驱动程序
声明方式
命名的内部类:可在类的内部多次使用
匿名内部类:可在new关键字后声明内部类,并立即创建一个对象
假设外层类名为Myclass,则该类的内部类名为
Myclass$c1.class (c1为命名的内部类名)
Myclass$1.class (表示类中声明的第一个匿名内部类)
7.6 内部类——Parcel1.java
public class Parcel1 { class Contents { //内部类
private int i = 11;
public int value() { return i; } }
class Destination { //内部类
private String label;
Destination(String whereTo) { label = whereTo; }
String readLabel() { return label; } }
public void ship(String dest) { Contents c = new Contents();
Destination d = new Destination(dest);
System.out.println(d.readLabel()); }
public static void main(String[] args) { Parcel1 p = new Parcel1();
p.ship("Tanzania"); }}
说明
在Parcel1类中声明了两个内部类Contents、Destination
在ship方法中生成两个内部类对象,并调用了内部类中声明的一个方法
7.6 内部类——Parcel1.java
外部类的方法可以返回内部类的引用变量
public class Parcel2 { class Contents { private int i = 11;
public int value() { return i; } }
class Destination { private String label;
Destination(String whereTo) { label = whereTo; }
String readLabel() { return label; }
} public Destination to(String s){ return new Destination(s); }
public Contents cont() { return new Contents(); }
public void ship(String dest) { Contents c = cont();
Destination d = to(dest);
System.out.println(d.readLabel());
}
public static void main(String[] args) { Parcel2 p = new Parcel2();
p.ship("Tanzania");
Parcel2 q = new Parcel2();
Parcel2.Contents c = q.cont();
Parcel2.Destination d =q.to("Borneo");
}}说明
to()方法返回内部类Destination的引用
cont()方法返回内部类Contents的引用
7.6 内部类——内部类实现接口
内部类实现接口
可以完全不被看到,而且不能被调用
可以方便实现“隐藏实现细则”。你所能得到的仅仅是指向基类(base class)或者接口的一个引用
例子
abstract class Contents { abstract public int value();}
interface Destination { String readLabel();}
7.6 内部类——Parcel3.java
public class Parcel3 { private class PContents extends Contents { private int i = 11;
public int value() { return i; }
}
protected class PDestination implements Destination { private String label;
private PDestination(String whereTo) { label = whereTo;}
public String readLabel() { return label; } }
public Destination dest(String s) { return new PDestination(s); }
public Contents cont() { return new PContents(); }}
7.6 内部类——Parcel3测试
class Test {
public static void main(String[] args) { Parcel3 p = new Parcel3();
Contents c = p.cont();
Destination d = p.dest("Tanzania");
// Illegal -- can't access private class:
Parcel3.PContents c = p.new PContents();
}} 说明
内部类PContents实现了抽象类Contents
内部类PDenstination实现了接口Destination
外部类Test中不能声明对private的内部类的引用
7.6 内部类——方法中的内部类
在方法内定义一个内部类
为实现某个接口,产生并返回一个引用
为解决一个复杂问题,需要建立一个类,而又不想它为外界所用
7.6 内部类——匿名的内部类
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(); } }
基类需要一个含参数的构造方法
例子
public class Parcel7 { public Wrapping wrap(int x) { return new Wrapping(x) public int value() { return super.value() * 47; }
};
}
public static void main(String[] args) { Parcel7 p = new Parcel7();
Wrapping w = p.wrap(10); }}


