day12内部类

92 阅读3分钟
	将一个类A定义在另一个类B里面,里面的那个类A就称为内部类
        1.成员内部类: 定义在外部类的成员位置(和成员变量/成员方法 地位相同)
            可以使用: public/private/static进行修饰
        2.局部内部类: 定义在外部类的方法内部,该内部类出了方法就没有用了 

成员内部类的定义和使用

成员内部类(和成员变量/成员方法 处于同一位置)
public class 外部类名 {//外部类
        //外部类成员变量
        //外部类成员方法
        //外部类构造方法
        //成员内部类
        public class 内部类名 {
            //内部类成员变量
        	//内部类成员方法
        	//内部类构造方法
        }
    }
 使用  (1)外部类要访问内部类的成员,必须要建立内部类的对象。
   外部类 Person 内部类 Heart
         //创建外部类对象
        Person p = new Person();
        //使用外部类成员变量
        System.out.println(p.age);//5
        简单来讲: 外.内 对象名 = new 外().new 内();
        //创建内部类对象: new 外部类名(...).new 内部类名(...)
        Person.Heart h2 = new Person().new Heart();
    (2)内部类可以直接访问外部类的成员,包括私有成员。 
    (3)内部类也是类,编译后也有对应的class文件: 外部类名$内部类名.class
    (4)内部类可以使用public修饰,也可以使用private修饰,还可以使用static修饰
    (5)可以在方法内部定义内部类(局部内部类),出了方法就失效了(必须在方法内部创建内部类的对象并使用)
    
*/  

内部类中3个重名变量的使用

内部类中3个重名变量的使用
    直接写变量名: 方法内部局部变量
    this.变量名: 内部类成员变量
    Outer.this.变量名: 外部类成员变量
 public class Outer {//外部类
    //外部类的成员变量
    int num = 1;
    public class Inner {//内部类
        //内部类的成员变量
        int num = 11;
        //内部类成员方法
        public void show() {
            int num = 111;
            //输出111
            System.out.println(num);//111
            //输出11
            System.out.println(this.num);//11
            //输出1
            System.out.println(Outer.this.num);//1
        }
    }
}
//测试类
public class Demo02InnerClass {
    public static void main(String[] args) {
        //创建内部类对象
        Outer.Inner inner = new Outer().new Inner();
        //内部类对象调用方法
        inner.show();
    }
}

匿名内部类

把创建实现(子类)类,覆盖重写抽象方法,创建实现类对象,实现类对象调用方法这四步合成一步完成

  new 抽象父类/接口(); //错误: 不能直接new抽象父类/接口的对象

        new 抽象父类/接口() {
            覆盖重写所有的抽象方法;
        }
  public abstract class Animal {
    //抽象方法
    public abstract void eat();
    public abstract void sleep();
}
//抽象类,演示匿名内部类对象的使用
public class Demo10AbstractNiMing {
    public static void main(String[] args) {  
        //多态的方式创建抽象类的匿名内部类对象
        Animal a = new Animal() {
            @Override
            public void eat() {
                System.out.println("小猫在吃....");
            }

            @Override
            public void sleep() {
                System.out.println("小猫在睡....");
            }
            //特有方法
            public void catchMouse() {
                System.out.println("小猫在逮老鼠....");
            }
        };
        a.eat(); 
        ((Animal) a).catchMouse();  错误: 多态不能调用子类的特有方法
    }
}