JAVA从零开始15_内部类

内部类可以是静态的,也可以是非静态的。局部内部类可以访问外部类的所有成员,但对于声明它的方法内的局部变量,只能访问被声明为 final 或实际上是 final 的变量(从 Java 8 开始,局部变量可以隐式地被视为 final,只要它们的值没有被修改)。然而,如果匿名内部类的实现变得复杂,建议将其转换为常规的内部类或独立的类,以保持代码的结构清晰。匿名内部类可以访问外部类的成员和方法:匿名内部类可以访问外部类的成员变量和方法,但只能访问声明为 final 或实际上是 final 的局部变量。
摘要由CSDN通过智能技术生成

一、内部类

内部类(Inner Class)是定义在另一个类(外部类)内部的类。内部类可以访问外部类的成员(包括私有成员),因为它们位于同一个类中。内部类可以是静态的,也可以是非静态的。非静态内部类(也称为实例内部类)隐式地持有对外部类实例的引用,而静态内部类则不会持有外部类的实例引用。

内部类可以分为以下四种类型:

  1. 成员内部类:在外部类的成员位置定义的类,可以被任意访问修饰符修饰。成员内部类可以访问外部类的所有成员。
  2. 静态内部类:在外部类的成员位置定义的用static修饰的类。静态内部类不能访问外部类的非静态成员,但可以访问外部类的静态成员。
  3. 局部内部类:在外部类的方法体内定义的类。局部内部类只能访问外部类的成员以及方法内的final局部变量。
  4. 匿名内部类:没有名称的内部类,通常用于实现接口或继承类的简化版本。匿名内部类可以访问外部类的成员以及方法内的final局部变量。

类的五大成员指的是一个类的五种基本组成部分:

  1. 属性(Field):类的属性是用于描述类的状态或特征的变量。属性可以被赋予不同的访问修饰符(如public、private、protected),限制其访问范围。
  2. 方法(Method):类的方法是用于实现类的行为或操作的函数。方法可以被赋予不同的访问修饰符,限制其访问范围。方法可以是实例方法(需要对象调用)或静态方法(可以直接通过类名调用)。
  3. 构造方法(Constructor):类的构造方法是用于初始化类的实例的特殊方法。构造方法的名称与类名相同,没有返回类型。一个类可以有多个构造方法,以支持不同方式的初始化。
  4. 内部类(Inner Class):如前所述,内部类是定义在另一个类内部的类。内部类可以访问外部类的成员,也可以有自己的成员。
  5. 代码块(Block):代码块是一组在类中定义的语句。代码块可以是普通的代码块、静态代码块或实例代码块。静态代码块在类被加载时执行,实例代码块在创建类的实例时执行。

五种成员共同构成了类的基本结构,它们分别表示类的状态(属性)、行为(方法)、初始化过程(构造方法)、嵌套结构(内部类)以及执行逻辑(代码块)。这些成员相互协作,使得类能够实现其预定功能,满足应用程序的需求。

通过定义不同的属性、方法、构造方法、内部类和代码块,开发者可以设计出具有特定功能和行为的类。这些类可以相互交互,形成一个完整的应用程序。在面向对象编程中,类是基本的组织单元,五种成员使得类具有丰富的表现力和灵活性。

内部类(Inner Class)在某些特定场景下可以提供更好的封装和组织代码的能力。以下是一些内部类的应用场景和原因:

  1. 当一个类只在另一个类中有用时,可以将其定义为内部类,以避免不必要的外部访问。这有助于减少代码的耦合度,提高类的内聚性。

  2. 内部类可以访问外部类的成员(包括私有成员),这使得内部类可以与外部类更紧密地协作,实现某些特定功能。

  3. 内部类可以用于实现某些设计模式,例如工厂模式、装饰器模式、观察者模式等。在这些情况下,内部类可以提供更清晰、简洁的代码结构。

  4. 当需要实现一个接口,但不希望创建一个完整的类时,可以使用匿名内部类。这种方法常用于创建回调函数、事件处理器等。

定义内部类的时机主要取决于其使用场景。如果你觉得定义一个内部类能够提高代码的可读性、可维护性,或者更好地实现某种设计模式,那么就可以考虑定义一个内部类。

内部类的访问特点如下:

  1. 内部类可以访问外部类的所有成员(包括私有成员)。

  2. 静态内部类不能访问外部类的非静态成员,但可以访问外部类的静态成员。

  3. 非静态内部类(实例内部类)隐式地持有一个对外部类实例的引用。因此,在创建非静态内部类的实例时,需要先创建外部类的实例。例如:OuterClass.InnerClass inner = outerInstance.new InnerClass();

  4. 外部类可以访问内部类的成员,但需要通过内部类的实例来访问。对于静态内部类,可以直接通过类名访问其静态成员。

  5. 内部类可以使用任意访问修饰符,如public、private、protected。访问修饰符可以限制内部类在其他类中的可见性。


二、成员内部类

成员内部类是定义在外部类中的非静态内部类。在编写成员内部类时,需要注意以下几点:

  1. 成员内部类可以访问外部类的所有成员(包括私有成员),因为它们处于同一个外部类中。然而,外部类不能直接访问内部类的成员,需要通过内部类的实例来访问。

  2. 成员内部类不能定义任何静态成员(除非它们是编译时常量),因为成员内部类与外部类的实例关联。

  3. 当成员内部类和外部类具有相同名称的成员时,可以使用外部类名.this.成员名来引用外部类的成员。

  4. 在成员内部类中,不能定义与外部类中的成员同名的局部变量。

要获取成员内部类的实例,有以下几种方式:

  1. 在外部类的方法中创建成员内部类的实例:

public class Outer {
   
    public class Inner {
   
        // ...
    }

    public void createInner() {
   
        Inner inner = new Inner();
    }
}
  1. 在外部类的外部创建成员内部类的实例。由于成员内部类与外部类的实例关联,因此需要先创建外部类的实例,然后使用外部类实例.new 内部类名()的语法创建内部类实例:
public class Main {
   
    public static void main(String[] args) {
   
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
    }
}
  1. 如果内部类与外部类需要相互访问对方的成员,可以将外部类的实例传递给内部类的构造函数,然后在内部类中保存一个对外部类的引用。这样,内部类可以通过引用访问外部类的成员:
public class Outer {
   
    private String name;

    public class Inner
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值