Java-内部类

目录

概述

类的五大成员

定义

使用场景

访问特点

分类

成员内部类

如何书写

如何创建对象

变量重名时,内部类访问变量的内存图

静态内部类

局部内部类

匿名内部类


概述

类的五大成员

属性、方法、构造方法、代码块、内部类

定义

在一个类里面再定义一个类,这个类就被称为内部类。

使用场景

内部类表示的事物是外部类的一部分,且内部类单独存在没有意义。

访问特点

内部类可以直接访问外部类的成员,包括私有成员。

外部类要访问内部类的成员,则必须创建对象。

分类

成员内部类

如何书写

  • 写在成员位置的,属于外部类的成员
  • 成员内部类可以被修饰符所修饰
  • 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量

如何创建对象

  • 在外部类中编写方法,对外提供内部类的对象(在成员内部类被private修饰的情况下)
  • 直接创建格式:外部类名.内部类名  对象名 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().new Inner();

变量重名时,内部类访问变量的内存图

public class Outer {
    private int a = 10;
    class Inner {
        private int a = 20;
        public void show() {
            int a = 30;
            System.out.println(Outer.this.a);
            System.out.println(this.a);
            System.out.println(a);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Outer.Inner oi = new Outer().new Inner();
        oi.show();
    }
}

输出a:就近原则,所以输出值为30;

输出this.a: this指代方法的调用者,即内部类对象002地址中的值20;

输出Outer.this.a:在创建内部类对象的时候,除了有成员变量外,还会有一个隐含的外部类对象的地址,这个时候会首先找到002地址,再找到它的外部类对象001地址中的a值10。

静态内部类

  • 实际上静态内部类就是成员内部类用static修饰符来修饰,是一种特殊的成员内部类

  • 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的则需要创建外部类的对象 ,即:

    Outer o = new Outer();

  • 创建静态内部类对象的格式:外部类名.内部类名  对象名 = new 外部类名.内部类名();

Outer.Inner oi = Outer.Inner();
  • 调用静态方法的格式:外部类名.内部类名.方法名();

局部内部类

  • 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
  • 外界无法直接使用,需要在方法内部创建对象并使用
  • 该类可以直接访问外部类中的成员,也可以访问方法内的局部变量

匿名内部类

  • 匿名内部类本质上就是隐藏了名字的内部类。格式如下:
new 类名或者接口名() {
    重写方法;
};
  • 实质上大括号包含的部分就是一个类,这个类继承了前面的类或者实现了前面的接口,加上new之后,整体就是一个类的子类对象或者接口的实现类对象。匿名内部类实际上包含了继承或实现、方法重写以及创建对象这几个过程
  • 如果实现类只要使用一次,就可以使用匿名内部类简化代码
  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值