Java学习笔记:内部类

  • Post author:
  • Post category:java


成员内部类:

是一种可以访问外部类的私有成员或属性,可以再内部类中直接存取其所在的类的私有成员变量。其语法格式如下:

权限修饰符 class 外部类名{
    权限修饰符 class 内部类名{

    }
}

成员内部类的特点:

1.内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为 private ,但是

对于处于其内部的内部类还是可见的。)

2.成员内部类不能定义静态成员,只能定义对象成员,但是可以使用 static final 关键字定义常量。

3.创建成员内部类的实例时,外部类的实例必须已经存在。换句话说,就是内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。

4.当内部类和外部类有同名的成员时,内部类可以通过使用 this 关键字来访问外部类成员,语法如下:

外部类名.this.变量名

建立内部类对象时应注意:

在外部类的内部可以直接使用 Inner s = new Inner(); (因为外部类知道inner是哪个类,所以可以生成对象);而在外部类的外部,要生成(new)一个内部类对象,需要首先建立一个外部类对象(外部类可用),然后再生成一个内部类对象。在其他类中创建内部类对象的语法如下:

Outer outer = new Outer();//先建立外部类对象
Outer.Inner inner = outer.new Inner();//再建立一个该此外部类对象的内部类对象
Outer.Inner inner1 = new Outer().new Inner();//直接使用new Outer().new Inner() 方法创建一个Inner对象

例如:

public class Outer{
    private String a = "a";
    private class Inner{
        private String a = "b";
        public void test(){
            System.out.println(this.a);          //内部类成员
            System.out.println(Outer.this.a);    //外部类成员
        }
    }
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        Outer.Inner inner1 = new Outer().new Inner();
        inner.test();
        inner1.test();
    }
}

局部内部类:

也称方法内部类,被定义在方法的内部的类。有特点如下:

1.局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。且局部内部类中还可以包含内部类,同样不能被上述访问控制修饰符和 static 修饰符修饰。

2.局部内部类只在当前方法中有效。

3.局部内部类中不能定义 static 成员。

举例如下:

public class Test{
    String a = "a";
    public void function(){
        String b = "b";
        final String c = "c";
        class Inner{
            String a1 = a;
            String b1 = b;
            String c1 = c;
        }
        Inner i = new Inner();
        System.out.println(i.a1);
        System.out.println(i.b1);
        System.out.println(i.c1);
    }
    public static void main(String[] args) {
        Test t1 = new Test();
        t1.function();
    }
}

匿名内部类:

匿名类是只在创建对象时才会编写类体的一种写法。抽象类或者接口本不可以直接创建对象,可以使用匿名内部类方法直接创建,用来创建一个接口或者抽象类的对象。匿名类的特点是“现用现写”,语法如下:

new 父类/父接口(){
    子类实现的内容
};     //最后一个大括号之后要加分号
abstract class People{
    String sex;
    public abstract void jump();
}

public class Test{
    public static void main(String[] args) {
        People tom = new People(){
            public void jump(){
                System.out.println("JUMP!");
            }
        };  //匿名类后面要记得加分号,否则报错
        tom.sex = "male";
        tom.jump();
    }
}

代码输出结果为:

JUMP!

注意事项:

1.匿名类不能使用构造方法进行初始化。

2.匿名类中不可以使用 static 关键字来定义静态成员。


部分摘抄自 明日科技《Java从入门到精通》



版权声明:本文为imag1n3原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。