package IneerClass; /* * 类的内部成员之5:内部类 * 1.Java中允许将一个类A声明在类B中,则类A就是内部类,类B称为外部类 * * 2.内部类的分类:成员内部类(静态、非静态) vs 局部内部类(方法内、代码块内、构造器内) * * 3.成员内部类: * 一方面,作为外部类的成员: * >可以调用外部类的结构 * >可以被static修饰(外部类只能public或者缺省) * >可以被4种不同的权限修饰 * 另一方面,作为一个类: * >类内部可以定义属性、方法、构造器等 * >可以被final修饰,表示此类不能被继承,言外之意,不使用final修饰则可以被继承 * >可以被abstract修饰,表示不能被实例化 * >abstract不能和final一起使用 * 4.关注以下3个问题: * 4.1如何实例化成员内部类的对象 * 4.2如何在成员内部类中区分调用外部类的结构 * 4.3开发中局部内部类的使用 */ public class IneerClasstest { public static void main(String[] args) { //创建Dog实例(静态成员内部类) Person.Dog dog=new Person.Dog(); dog.show(); //创建Bird实例(非静态成员内部类) //Person.Bird b1=new Person.Bird(); 错误的写法 Person p=new Person(); Person.Bird b2=p.new Bird(); b2.sing(); Person p1=new Person(); Person.Bird b3=p1.new Bird(); b3.display("String.鸟"); } } class Person{ String name="Per.鸟"; int age; public void eat() { System.out.println("人:吃饭"); } //静态成员内部类 static class Dog{ String name; public void show() { System.out.println("忠犬八公"); } //静态不能调用非静态,因为静态加载的早,非静态加载的晚 //eat(); } //非静态成员内部类 class Bird{ String name="Bird.鸟"; public Bird() { } public void sing() { System.out.println("我是一只小小鸟"); Person.this.eat(); //调用外部类的非静态属性 } public void display(String name) { System.out.println(name); //调用形参name System.out.println(this.name); //调用成员内部类的name System.out.println(Person.this.name); //调用外部类的属性 } } public void method() { //局部内部类 class AA{ } } { //局部内部类 class BB{ } } public Person(){ //局部内部类 class CC{ } } }
内部类的使用
package IneerClass; import com.sun.org.apache.bcel.internal.generic.RETURN; public class IneerClassTest1 { public void method() { class AA{ } } //返回一个实现了Comparable接口的类的对象 public Comparable getComparable() { //创建一个实现了Comparable接口的类 class MyComparable implements Comparable{ // @Override // public int compareTo(Object o) { // // TODO Auto-generated method stub // return 0; // } // // } // MyComparable m=new MyComparable(); // return m; //匿名内部类的匿名对象 return new Comparable() { public int compareTo(Object o) { // TODO Auto-generated method stub return 0; } }; } } }