最常使用内部类和匿名类的地方是GUI[图形用户界面 Graphic User Interface]。由于匿名类并没有名称,因此生成的类文件会用数字表示,如Outer$1.class
如果内部类是匿名的,那么编译器会简单地生成数字,把它们作为内部类标识符使用。若内部类嵌套于其他内部类中,则它们的名字简单地追加在一个$以及外部类标识符的后面。
这种生成内部名称的方法除了非常简单和直观以外,也非常“健壮”,可适应大多数场合的要求。由于它是Java的标准命名机制,所以产生的文件会自动具备“与平台无关”的能力(注意Java编译器会根据情况改变内部类,使其在不同的平台中能正常工作)。
1. 内部类的定义和使用: 2.内部类(inner).可分为三种: 另外一个概念是:嵌套类,Java 中的四种嵌套类:嵌套静态类、成员类、本地类和匿名类 public class String { private static class CaseInsensitiveComparator implements Comparator, Serializable {//嵌套静态类 //… }//就是静态内部类 } class PeerFixer implements AdjustmentListener, java.io.Serializable { //…成员类,很像嵌套静态类,只是不带 static 关键字。在一个类(外部类)中直接定义的内部类 } } 本地类是在代码块中声明的,一般来说,本地类在方法中进行声明。 成员类和本地类之间最重要的差别是,本地类只能访问 final 的变量或者参数。 匿名类允许我们把类的定义和实例的分配组合在一起。我们可以直接用 new SomeClass() 实例化对象,并且在实例化的位置把整个类的实现都放在花括号中。 3. 内部类的优缺点: 内部类同其它类一样也可以继承外部其它包的类和实现外部其它地方的接口.同样它也可以继承同一层次的其它的内部类,甚至可以继承外部类本身.下面我们给出最后一个例子做为结束:
public class Layer // 测试第二个内部类
内部类有如下特性:
◇ 一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称.名字不能与包含它的类名相同。
◇ 可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量。
◇ 可以定义为abstract。
◇ 可以声明为private或protected。
◇ 若被声明为static,就变成了顶层类,不能再使用局部变量。
◇ 若想在Inner Class中声明任何static成员,则该Inner Class必须声明为static。
(1) 在一个类(外部类)中直接定义的内部类;
(2) 在一个方法(外部类的方法)中定义的内部类;
(3) 匿名内部类.
◇ 优点:节省编译后产生的字节码文件的大小
◇ 缺点:使程序结构不清楚
内部类使用的其它的问题
{
private String testStr = "testStr";
class Person {
String name;
Email email;
public void setName(String nameStr)
{ this.name = nameStr; }
public String getName()
{ return this.name; }
public void setEmail(Email emailObj)
{ this.email = emailObj; }
public String getEmail()
{ return this.email.getMailStr(); }
class Email{ // 内部类的内部类, 多层内部类
String mailID;
String mailNetAddress;
Email(String mailId, String mailNetAddress) {
this.mailID = mailId;
this.mailNetAddress = mailNetAddress;
}
String getMailStr() {
return this.mailID + "@" + this.mailNetAddress;
} } }
// 另一个内部类继承外部类本身
class ChildLayer extends Layer{
void print(){
System.out.println(super.testStr);// 访问父类的成员变量
} }
// 另个内部类继承内部类Person
class OfficePerson extends Person{
void show() {
System.out.println(name);
System.out.println(getEmail());
} }
// 外部类的测试方法
public void testFunction() {
// 测试第一个内部类
ChildLayer childLayer = new ChildLayer();
childLayer.print();
OfficePerson officePerson = new OfficePerson();
officePerson.setName("abner chai");
// 注意此处, 必须用对象.new 出来对象的子类对象
// 而不是Person.new Email(...)
// 也不是new Person.Email(...)
officePerson.setEmail(officePerson.new Email("josserchai", "yahoo.com"));
officePerson.show();
}
public static void main(String[] args) {
Layer layer = new Layer();
layer.testFunction();
}
}