java内部类

一、简单介绍

在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性 定义方式一致。

 

Java 内部类,分为以下四种:

  • 成员内部类
  • 静态成员内部类
  • 局部内部类
  • 匿名内部类

 

二、成员内部类

1、定义

在一个类中定义了另一个类,则将定义在类中的那个类称之为成员内部类。成员内部类也是最普通的内部类。

 

2、使用

class InnerTest {
    public static void main(String[] args) {
        Outer out = new Outer();
        // 创建成员内部类
        Outer.Inner inner = out.new Inner();
        inner.sayHi();
    }
}

class Outer {
    public Outer() {
        System.out.println("Outer Class.");
    }
    class Inner {
        public void sayHi() {
            System.out.println("Hi, Inner.");
        }
    }
}

 

3、成员内部类 对象的创建

Outer.Inner inner = new Outer().new Inner();

 

4、内部类访问外部类

Outer.this.xxx

 

5、外部类访问内部类

new Inner().xxx

 

6、小结

  • 成员内部类可直接访问外部类(使用:外部类.this.xxx);
  • 外部成员类要访问内部类,必须先建立成员内部类对象;
  • 成员内部类可使用任意作用域修饰(public、protected、默认、private);
  • 成员内部类可访问外部类任何作用域修饰的属性和方法;
  • 外部类建立成员内部类对象之后,可以访问任何作用域修饰的内部类属性和方法。

 

三、静态成员内部类

1、定义

在一个类中定义了另一个 static 类,则将定义在类中的那个 static 类称之为静态成员内部类

静态成员内部类也就是给内部成员类加上 static 修饰符。

 

2、使用

class OuterClass {
    public OuterClass() {
        System.out.println("OuterClass Init.");
    }
    protected static class InnerClass {
        public void sayHi() {
            System.out.println("Hi, InnerClass.");
        }
    }
}

class InnerClassTest {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        innerClass.sayHi();
    }
}

与内部成员类的创建方式 new Outer().new Inner() 不同,静态成员内部类可使用 new OuterClass.InnerClass() 的方式进行创建。

 

3、注意点

不能从静态成员内部类中访问非静态外部类对象。

 

四、局部内部类

1、定义

一个类定义在另一个类的局部(方法或者任意作用域),这个类就称之为局部内部类。

 

2、使用

class OutClass {
    public void sayHi() {
        class InnerClass {
            InnerClass(String name) {
                System.out.println("InnerClass:" + name);
            }
        }
        System.out.println(new InnerClass("Three"));
        System.out.println("Hi, OutClass");
    }
}

class OutTest {
    public static void main(String[] args) {
        new OutClass().sayHi();
    }
}

 

3、注意点

局部内部类不能使用任何访问修饰符;

局部类如果在方法中,可以直接使用方法中的变量,不需要通过 OutClass.this.xxx 的方式获得。

 

五、匿名内部类

1、定义

没有名字的内部类就叫做匿名内部类。

 

2、使用

interface AnonymityOuter {
    void hi();
}
class AnonymityTest {
    public static void main(String[] args) {
        AnonymityOuter anonymityOuter = new AnonymityOuter() {
            @Override
            public void hi() {
                System.out.println("Hi, AnonymityOuter.");
            }
        };
        anonymityOuter.hi();
    }
}

其中,new AnonymityOuter() 之后的 {…} 大括号包含的部分就为匿名内部类。

 

3、注意点

匿名内部类必须继承一个父类或者实现一个接口;

匿名内部类不能定义任何静态成员和方法;

匿名内部类中的方法不能是抽象的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值