Java-内部类,匿名内部类

内部类

  • 内部类定义:把类定义在其他类的内部,这个类就被称为内部类。比如在一个类中定义了另外一个类,这个里面的类就是内部类。

  • 内部类访问特点:
    (1)内部类可以直接访问外部类的成员,包括私有。
    (2)外部类要访问内部类的成员,必须创建对象。
    (3)按照内部类位置分类可以分为:
    a.成员位置:在类中方法外位置定义的类,被称为成员内部类。
    b.局部位置:在方法中定义的类,被称为局部内部类。
    (4)在测试类中直接访问内部类成员的格式:
    外部类名.内部类名 对象名 = 外部类对象.内部类对象;

  • 成员内部类

Student类

public class Student {
    private String name = "易烊千玺";
    public int age = 18;

    // 定义成员内部类 
    class Inner {
        private String sname = "周杰伦";
        public int age = 35;

        private void aa() {
            System.out.println("内部类私有成员方法");
        }

        public void bb() {
            System.out.println("内部类公共成员方法");
            System.out.println(name);
            System.out.println(age);

        }
    }

    // 定义成员方法
    public void show() {

        System.out.println("我是student的成员方法");
        //不能在外部类中直接访问内部类的成员
        //需要创建内部类的对象去访问方法

        Inner inner = new Inner();
        inner.aa();
        inner.bb();
        String sname = inner.sname;
        System.out.println(sname);

    }

}

Test类

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
        Student.Inner inner=new Student().new Inner();
        inner.bb();

        Student student = new Student();
        student.show();

    }

}
  • 局部内部类
Outer类
public class Outer {
    private String name = "周杰伦";
    public int age = 35;

    public void show() {
        // 定义一个局部内部类
        class Inner {
            private String name = "刘德华";
            public int age = 55;

            public void nei() {
                System.out.println(this.name);
                System.out.println(this.age);
                System.out.println(Outer.this.name);
                System.out.println(Outer.this.age);

            }

        }

        // 这里创建内部类的对象
        Inner inner = new Inner();
        //创建一个inner对象去调用nei方法
        //在test调用show方法的时候就会显示除nei方法中的内容
        inner.nei();
        //以下只是通过inner去调用Inner中的age
        int age2 = inner.age;
        System.out.println(age2);
        //可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

    }

    public void test() {

        show();

    }

}


Test类
public class Test {

    public static void main(String[] args) {
        new Outer().show();
    }
}

匿名内部类

  • 是局部内部类的一种简写方式,而匿名内部类的本质其实是一个对象,是一个继承了该抽象类的子类对象,或者实现了该接口的子类对象
  • 格式:
    new 类名或者接口名(){
    重写方法;} ;
Student类
public class Student {
    public void show() {
        System.out.println("学生的show方法");
    }
}

Teacher类
public abstract class Teacher {
    public abstract void look();
}

Test类
public class Test{

    public static void main(String[] args) {
    //采用匿名内部类来创建对象
        new Student(){
            public void show(){
                System.out.println("重写学生类中的show方法");
            }
    }.show();

    new Teacher() {

        @Override
        public void look() {
            System.out.println("重写老师类中的抽象方法");

        }
    };
}
}

你可能感兴趣的:(java基础知识)