Java内部类

Java内部类

  • 内部类
    • 成员内部类
      • 概念
      • 访问权限
      • 举例
    • 静态内部类
      • 举例
    • 局部内部类
      • 访问权限
      • 举例
    • 匿名内部类
      • 举例

内部类

主要用来服务外部类的,在外部类定义体内,临时定义的类

成员内部类

概念

定义在与成员变量、方法同一层级,身份上充当成员之一

访问权限

可以访问外部类所有成员(包括私有),直接写成员名

注意,外部类成员与内部类成员同名,调用是将使用自身的成员(变量和方法)

外部类方法可以访问内部类所有成员包括私有,先创建内部类对象

如果内外类的成员名冲突,内部类的成员使用this指定,外部类使用“外部类名.this”指定,后面几个内部类也是如此

举例

定义成员内部类变量:外部类.内部类 变量名 = 外部类对象.new 内部类()

// 前提是已经创建了外部类对象outer
Outer.Inner inner = outer.new Inner();

举例

package inner;

public class OuterClass {

    private String tag;
    private String description;

    public OuterClass(String tag, String description) {
        this.tag = tag;
        this.description = description;
    }

    public String getDescription() {
        return this.description;
    }

    // 定义一个成员内部类
    class MemberInnerClass {
        // 命名冲突,使用时需要特殊指定
        private String tag;

        public void showDescription() {
            // 可以访问外部类的成员(包括私有)
            System.out.println("内部类标签:" + this.tag + ", 外部类的标签是:" + OuterClass.this.tag + ", 外部类的描述是:" + getDescription());
        }
    }

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass("outer", "这是一个普通类");
        // 定义一个成员内部类变量
        OuterClass.MemberInnerClass memberInnerClass = outerClass.new MemberInnerClass();
        memberInnerClass.tag = "inner";
        memberInnerClass.showDescription();
    }

}

静态内部类

属于静态成员,除了自身的成员,所以只能访问外部类的静态成员

举例

定义:不需要创建外部类对象

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

举例

package inner;

public class TestStaticInner {

    private static final String tag = "outer";
    private String description;

    public static class StaticInnerClass{
        public void showDescription() {
            // 可以访问外部类的静态成员(包括私有)
            System.out.println("外部类的标签是:" + tag);
        }
    }

    public static void main(String[] args) {
        // 不依靠外部类对象,创建静态内部类对象
        TestStaticInner.StaticInnerClass innerClass = new TestStaticInner.StaticInnerClass();
        innerClass.showDescription();
    }

}

局部内部类

方法体或代码块中创建的类,代码块结束,类的作用随之消失

访问权限

  • 可以访问外部类的所有成员(类似于成员内部类)
  • 代码块中的不变或不可变的变量(常量)
  • 类作用在代码块,外部类即用即访问,但是别的代码块就无法使用了

举例

package inner;

class Outer {
    private int outerData = 30;

    public void doSomething() {
        final int localVariable = 40;
        class LocalInner {
            public void showData() {
                System.out.println("外部类的数据: " + outerData);
                System.out.println("局部变量的值: " + localVariable);
            }
        }
        LocalInner localInner = new LocalInner();
        localInner.showData();
    }
}

public class TestLocalClass {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.doSomething();
    }
}

匿名内部类

一般用于临时继承接口或者别的类,因为实现方式特殊在别处用不上(小众哥),所以即时定义,即时使用

当实现的接口是函数式接口,常常使用lambda表达式,简化代码

举例

package inner;

// 定义接口
interface MyInterface {
    void doWork();
}

class OuterA {
    public void performAction() {
        // 创建匿名内部类实现 MyInterface 接口
        MyInterface myInterface = new MyInterface() {
            // 即刻实现
            @Override
            public void doWork() {
                System.out.println("执行接口中的方法,通过匿名内部类实现");
            }
        };
        
        // 本例子,接口MyInterface只有一个抽象方法,即这是一个函数式接口,可使用lambda表达式,简化代码
        MyInterface lambdaMyInterface = ()->{
            System.out.println("lambda表达式的方式实现接口");
        };
        // 即刻使用
        myInterface.doWork();
        lambdaMyInterface.doWork();
    }
}

public class TestAnonymousClass {
    public static void main(String[] args) {
        OuterA outer = new OuterA();
        outer.performAction();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值