(十二)内部类

本文介绍了Java中的四种内部类:成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可以直接访问外部类的所有成员,而静态内部类不能直接访问外部类的非静态成员。局部内部类仅存在于方法内,不能有静态成员,而匿名内部类通常用于简洁地实现继承或接口。创建内部类对象通常需要外部类对象的引用。

        我们正常的类都是定义在一个个的java文件中,内部类,顾名思义,就是在类中定义的类。根据内部类定义位置的不同,可以将内部类分成员内部类,静态内部类,局部内部类以及匿名内部类。

成员内部类

定义位置

        类中,方法外

语法

        访问权限修饰符 修饰符 类名 extends 父类名 implements 接口。。。。{ }

注意

  • 在成员内部类中,成员内部类可以定义非静态成员,包括非静态常量,非静态方法,非静态代码块,构造函数。
  • 如果成员内部类中的属性名与外部类中的属性名一直,外部类的属性名用,外部类类名.this.属性名区分,内部类的属性名前加this,同名方法名一致。

创建对象

        内部类所在的外部类中创建对象:

        内部类类名 对象名 = 外部类对象.new 内部类构造函数();

        内部类所在的外部类外创建对象:

        外部类类名.内部类类名 对象名 = 外部类对象.new 内部类构造函数();

静态内部类

定义位置

        类中方法外

语法

        访问权限修饰符 static 类名 extends 父类名 implements 接口。。。。{ }

注意

  • 静态内部类中不能直接使用外部类的非静态成员。
  • 如果静态内部类中的静态属性或方法和外部类中的静态属性或方法同名,在内部类中想要调用外部类的方法需要外部类类名.属性名

创建对象

       外部类类名.内部类类名 对象名 = new 外部类类名.内部类构造函数名();  

局部内部类

定义位置

        类中,方法中

语法

        class 类名 extends 父类名 implements 接口。。。。{}

注意

  • 局部内部类中不能定义静态成员,包括静态属性,静态方法,静态代码块。
  • 局部内部类中的属性和外部类的属性名重名时,在内部类中调用外部类属性,需要用外部类类名.this.属性名用以区分
  • 局部内部类是定义在方法中的,在定义的方法外无法调用这个内部类。

创建对象

内部类类名 对象名 = new 内部类构造函数();

匿名内部类

定义位置

        类中,实参或值。

语法

        new 父类名\接口名(){}

注意

        匿名内部类相当于将 类继承父类,实现接口,创建子类对象并转换为父类对象或接口对象合并成一步。类似于我们创建匿名对象一样,匿名内部类同样没有类名。

        因此我们在匿名内部类中无法定义构造函数,只能使用JVM提供的无参构造。

### Java `Object` 类的常用方法 #### 1. `equals(Object obj)` 此方法用于指示某个其他对象是否与此对象相等。默认情况下,该方法比较的是两个对象的引用地址;通常建议在自定义类中重写此方法来实现基于属性的内容比较[^2]。 #### 2. `hashCode()` 返回该对象的哈希码值。支持使用 HashMap 或 HashSet 等散列表时,如果两个对象通过 equals 方法比较是相同的,则它们的 hashCode 应当相同[^3]。 #### 3. `toString()` 返回表示该对象的字符串形式。对于大多数类而言,默认行为是以类名加上 @ 符号以及对象的十六进制哈希码组成的一串字符。推荐开发者针对具体业务逻辑覆盖 toString 来提高可读性调试便利性。 #### 4. `getClass()` 返回改对象运行时常量池所记录的对象类型信息 Class 实例。注意 getClass 的结果受 JVM 加载机制影响,在某些特殊场景下可能不完全反映实际编译期类型关系。 #### 5. `clone()` 创建并返回当前实例的一个副本。只有实现了 Cloneable 接口的类才能安全调用 clone 方法,否则会抛出 CloneNotSupportedException 异常。浅拷贝只复制基本数据类型的字段指向同一内存位置的对象引用,深拷贝则构建全新的独立对象树。 ```java public class Person implements Cloneable { private String name; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } ``` #### 6. `finalize()` 已废弃的方法,曾经被设计成由垃圾收集器触发执行清理工作前调用。由于其不确定的行为特性,现代编程实践中应避免依赖 finalize 进行资源释放或其他重要操作。 #### 7. `notify()` 唤醒在此对象监视器上等待的单个线程。只有处于 wait 状态下的线程才会成为候选者之一,而最终哪个会被选中取决于操作系统调度策略。 #### 8. `notifyAll()` 唤醒所有在此对象监视器上等待的线程。这并不意味着这些线程立即恢复运行状态,而是说它们都获得了竞争 CPU 时间片的机会。 #### 9. `wait()` 使当前线程进入等待状态直到另一个线程调用了 notify() 或 notifyAll() 方法。此外还有带超时参数版本可用于设置最大等待时间。 #### 10. `wait(long timeout)` 带有指定毫秒数作为最长等待时限的变体。即使没有收到通知信号也会自动醒来继续往下走程序流程。 #### 11. `wait(long timeout, int nanos)` 更精确的时间控制方式,除了整数部分外还额外指定了纳秒级精度。不过需要注意的是并不是所有平台都能达到如此高的分辨率。 #### 12. `registerNatives()` 这是一个本地方法注册接口,主要用于内部框架层面的功能扩展,并不适合一般应用程序直接调用或修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值