08 – 面向对象编程的高阶部分解析

一、类中的组成部分 - 代码块

基本概况

代码块是类的五大组成部分之一,其余部分包含成员变量、构造器、方法以及内部类。

代码块的种类

静态代码块

其格式为static {},特性是在类加载时自动执行,由于类仅加载一次,所以静态代码块也仅执行一次。它的作用是完成类的初始化,比如对静态变量进行初始化赋值。

示例代码:

public class CodeBlock {
    // 静态资源
    public static String name;
    public static String[] pokeCards = new String[54];

    // 静态代码块
    // 主要功能:对类的静态资源进行初始化
    static {
        System.out.println("===静态代码块执行了===");
        name = "可乐";
        pokeCards[0] = "A";
        pokeCards[1] = "2";
        // 此处省略其他类似赋值语句
    }

    public static void main(String[] args) {
        // 目的:认识代码块,理解代码块的执行顺序与基本作用
        System.out.println("===main方法执行了===");
    }
}

执行结果:

===静态代码块执行了===
===main方法执行了===
实例代码块

格式为{},特点是每次创建对象时都会执行实例代码块,且在构造器之前执行。作用与构造器相同,用于完成对象的初始化,例如对实例对象进行初始化。

示例代码:

public class CodeBlock {
    // 实例变量
    private String name;
    private String[] direction = new String[4];

    // 实例代码块,无static修饰,属于对象相关
    // 基本功能:初始化对象的实例资源
    {
        System.out.println("===实例代码块执行了===");
        name = "可乐";
        direction[0] = "东";
        direction[1] = "南";
        direction[2] = "西";
        direction[3] = "北";
    }

    public static void main(String[] args) {
        // 目的:认识代码块,理解代码块的执行顺序与基本作用
        System.out.println("===main方法执行了===");
        new CodeBlock();
    }
}

执行结果:

===main方法执行了===
===实例代码块执行了===

二、内部类

基本概述

若一个类定义在另一个类的内部,该类便称为内部类。使用场景为当一个类的内部包含完整事物且无单独设计必要时,可将该事物设计为内部类。

示例代码:

public class Car {
    // 内部类
    public class Engine {
    }
}
成员内部类

是类中的普通成员,如同普通成员变量、成员方法。

示例代码:

// 外部类
public class OuterClass {
    // 外部类静态变量
    public static String name = "可乐";

    // 外部类实例变量
    private int age;

    // 外部类静态方法
    public static void test() {
    }

    // 成员内部类,无static修饰,属于外部类对象持有
    public class InnerClass {
        public void show() {
            System.out.println("成员内部类的show方法");
            // 成员内部类可直接访问外部类的静态变量
            System.out.println(name);

            // 成员内部类可直接访问外部类的静态方法
            test();

            // 成员内部类可直接访问外部类的实例成员
            System.out.println(age);
        }
    }
}

public class InnerClassDemo {
    public static void main(String[] args) {
        // 目标:理解成员内部类的语法
        // 成员内部类创建对象的格式
        // 外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
        OuterClass.InnerClass oi = new OuterClass().new InnerClass();
        oi.show();
        // 成员内部类访问外部类成员的特点:
        // 1、成员内部类可直接访问外部类的静态成员,也可直接访问外部类的实例成员
    }
}
静态内部类

带有static修饰的内部类,属于外部类自身持有。

示例代码:

// 外部类
public class OuterClass {
    // 静态内部类
    public static class InnerClass {
    }
}

// 语法
// 外部类名.内部类名 对象名 = new 外部类.内部类();
OuterClass.InnerClass oi = new OuterClass.InnerClass();

// 外部类
public class OuterClass {
    // 外部类静态变量
    public static String name = "可乐";

    // 外部类实例变量
    private int age;

    // 外部类静态方法
    public static void test() {
    }

    // 静态内部类,有static修饰,属于外部类持有
    public static class InnerClass {
        public void show() {
            System.out.println("静态内部类的show方法");
            // 静态内部类可直接访问外部类的静态变量
            System.out.println(name);

            // 静态内部类可直接访问外部类的静态方法
            test();

            // 静态内部类 不可 直接访问外部类的实例成员
            System.out.println(age); // 会报错
        }
    }
}

public class InnerClassDemo {
    public static void main(String[] args) {
        // 目标:理解静态内部类的语法
        // 静态内部类创建对象的格式
        // 外部类名称.内部类名称 对象名 = new 外部类名称.内部类名称();
        OuterClass.InnerClass oi = new OuterClass.InnerClass();
        oi.show();
        // 静态内部类访问外部类成员的特点:
        // 1、静态内部类可直接访问外部类的静态成员,不可直接访问外部类的实例成员
    }
}
局部内部类(了解)

局部内部类定义在方法、代码块、构造器等执行体中。

示例代码:

public class OuterClass {
    public static void main(String[] args) {

    }

    public static void go() {
        // 局部内部类
        class A {

        }

        abstract class B {

        }

        interface C {

        }
    }
}
匿名内部类(重点)

是特殊的局部内部类,所谓匿名,指程序员无需为该类声明名字,默认有隐藏名字。

语法:

new 类 或 接口(参数值) {
    类体(一般为方法重写);
};

示例:

new Animal() {
    @Override
    public void eat() {
    }
};

特点:匿名内部类本质是子类,会立即创建子类对象。作用是更方便地创建子类对象。

示例代码:

// 父类
public abstract class Animal {
    public abstract void cry();
}

// main
public class TestDemo {
    public static void main(String[] args) {
        // 匿名内部类 创建子类对象
        // 匿名内部类实际有名字,外部类名$编号.class(TestDemo$1.class)
        Animal a = new Animal() {
            @Override
            public void cry() {
                System.out.println("cat~");
            }
        };

        a.cry();
    }
}

匿名内部类在开发中常作为对象参数传输给方法,例如学生、老师参加游泳比赛场景。

// main
public class TestDemo {
    public static void main(String[] args) {
        // 目标:理解匿名内部类在开发中的用途,常作为对象参数传输给方法
    }
}

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12984.html

(0)
LomuLomu
上一篇 2025 年 7 月 26 日
下一篇 2025 年 7 月 26 日

相关推荐

  • 微软开源!Office 文档轻松转 Markdown!

    大家好,我是 Java陈序员。 今天,给大家介绍一款微软开源的文档转 Markdown 工具。 关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。 项目介绍 MarkItDown —— 微软开源的 Python 工具,能够将多种常见的文件格式(如 PDF、PowerPoint、Word、Excel、图像、音频…

    2025 年 1 月 10 日
    37200
  • MySQL 面试题

    MySQL 中有哪几种锁? 全局锁、行级锁、自增锁、记录锁、外键锁、间隙锁、表级锁、元数据锁、意向锁、临键锁 MySQL 中有哪些不同的表格? 基础表、临时表、系统表、信息表、性能模式表、分区表、外键表、触发器使用的表、存储过程和函数使用的表 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别? 事务支持 InnoDB:支持事务处理,具有提…

    未分类 2025 年 1 月 13 日
    33400
  • 2025年最新PyCharm激活码及永久破解教程(支持2099年)

    本方法适用于Jetbrains全家桶,包括PyCharm、IDEA、DataGrip、Goland等开发工具! 先给大家看看最新PyCharm版本成功破解的截图,有效期直达2099年,完美解决激活问题! 下面我将用详细的图文教程,手把手教你如何将PyCharm激活至2099年。这个方法不仅适用于最新版本,之前的旧版本也同样有效! Windows/Mac/Li…

    PyCharm激活码 2025 年 8 月 18 日
    42700
  • 2024 DataGrip最新激活码,DataGrip永久免费激活码2025-01-16 更新

    DataGrip 2024最新激活码 以下是最新的DataGrip激活码,更新时间:2025-01-16 🔑 激活码使用说明 1️⃣ 复制下方激活码 2️⃣ 打开 DataGrip 软件 3️⃣ 在菜单栏中选择 Help -> Register 4️⃣ 选择 Activation Code 5️⃣ 粘贴激活码,点击 Activate ⚠️ 必看!必看! 🔥 …

    2025 年 1 月 16 日
    32100
  • GoLand破解版安装步骤详解,适合小白入门!

    声明:以下教程中提到的 GoLand 破解补丁、激活码均来自互联网公开渠道,仅供个人学习研究,禁止商业用途。若条件允许,请支持正版! 先放一张成果图:GoLand 2025.2.1 已顺利激活到 2099 年,稳! 下面用图文方式,手把手带你完成最新版 GoLand 的激活流程。 前期准备 ⚠️ 如果你之前尝试过其他破解方案失败,建议先卸载干净再重装,或手动…

    1天前
    2200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信