【Java篇】无形至有形,法与道的编织:类与对象初探

发布于:2025-03-18 ⋅ 阅读:(21) ⋅ 点赞:(0)

类和对象(上)

💬 欢迎讨论:如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区留言!我们一起学习、一起成长。

👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏并分享给更多想了解 Java 编程的朋友!

🚀 继续学习之旅:今天,我们将深入探讨 Java 中的类和对象。这些是每个 Java 程序员必备的技能。

一、面向对象的初步认知

1.1 什么是面向对象

Java是一门纯面向对象的语言(Object Oriented Programming,简称OOP)。在面向对象的世界中,一切皆为对象。
面向对象是一种解决问题的思想,主要依靠对象之间的交互来完成任务。采用面向对象的编程方式,不仅符合人们对事物本质的认识,还极大地有助于大型程序的设计、扩展和维护。

1.2 面向对象与面向过程

面向过程强调程序的执行流程,注重将问题拆解成一系列的操作步骤,每一步骤都必须严格按顺序执行。例如,传统的洗衣服过程要求依次完成浸泡、搓洗、漂洗、甩干等操作,任何一步出错都可能导致整体流程无法正常进行。

面向对象则更关注事物本身,通过对现实世界中对象的抽象,将事物的属性和行为封装在一个类中,借助对象之间的交互来完成复杂任务。以洗衣机为例,用户只需关心“放入衣物”、“添加洗衣粉”、“启动洗衣机”等接口,而无需了解内部的工作细节。这种方式使程序设计更加直观、灵活且易于维护。

注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。

二、类定义和使用

2.1 简单认识类

类是用来对一个实体(对象)进行描述的。它主要描述该实体具有哪些属性(例如外观尺寸、颜色等)以及哪些功能(例如洗衣、烘干等)。完成对实体的抽象之后,计算机便能识别这种描述,从而在程序中使用该类创建实际对象。

在这里插入图片描述

上图左侧就是对洗衣机简单的描述,该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认知),但是这些简化的抽象结果计算机也不能识别,开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语言。

2.2 类的定义格式

在Java中定义类时,需要使用关键字 class。基本语法格式如下:

// 创建类的基本格式
class ClassName {
    field;   // 字段(属性)或成员变量
    method;  // 行为或成员方法
}

类中包含的内容统称为类的成员。

  • 成员属性:用于描述类的特征;
  • 成员方法:用于描述类所具备的功能。

示例一:以洗衣机类为例的模板

class WashMachine {
    public String brand;   // 品牌
    public String type;    // 型号
    public double weight;  // 重量
    public double length;  // 长
    public double width;   // 宽
    public double height;  // 高
    public String color;   // 颜色
    
    public void washClothes() {   // 洗衣服功能
        System.out.println("洗衣功能");
    }
    
    public void dryClothes() {    // 脱水功能
        System.out.println("脱水功能");
    }
    
    public void setTime() {       // 定时功能
        System.out.println("定时功能");
    }
}

将洗衣机这一现实对象用Java语言描述后,经过 javac 编译生成 .class 文件,JVM便能识别并使用这个类。

注意事项:

  1. 类名应采用大驼峰命名法;
  2. 成员前一般统一使用 public 修饰(后续会详细说明);
  3. 此处所写的方法均不带 static 关键字(后续会讲解其意义)。

2.3 小练习

2.3.1 定义一个狗类
class PetDog {
    public String name;   // 狗的名字
    public String color;  // 狗的颜色

    // 狗的属性描述
    public void barks() {
        System.out.println(name + ": 旺旺旺~~~");
    }
    
    // 狗的行为描述
    public void wag() {
        System.out.println(name + ": 摇尾巴~~~");
    }
}
2.3.2 定义一个学生类

下面给出一个简单的学生类示例:

public class Student {
    public String name;
    public String gender;
    public short  age;
    public double score;
    
    public void DoClass() {
        // 上课方法
    }
    
    public void DoHomework() {
        // 做作业方法
    }
    
    public void Exam() {
        // 考试方法
    }
}

在定义类时需注意以下几点

  1. 一般一个文件中只定义一个类;
  2. 含有 main 方法的类通常应使用 public 修饰(例如Eclipse默认在 public 修饰的类中查找 main 方法);
  3. public 修饰的类名必须与文件名相同;
  4. 修改 public 类的名称需谨慎。

三、类的实例化

3.1 什么是实例化

当我们使用 class 关键字定义了一个类,就相当于在计算机中定义了一种新的类型(如同 intdouble 等内置类型)。只不过 intdouble 是 Java 语言自带的类型,而类是程序员自定义的类型。

有了这种新类型之后,就可以用它来创建对象(也称为类的实例)。用类类型创建对象的过程称为类的实例化,在 Java 中通过 new 关键字配合类名来完成。例如:

public class Student {
    public String name;
    public String gender;
    public short age;
    public double score;
    
    public void DoClass() {}
    public void DoHomework() {}
    public void Exam() {}

    public static void main(String[] args) {
        // 通过 new 关键字实例化对象
        Student s1 = new Student();
        s1.name = "Li Lei";
        s1.gender = "男";
        s1.age = 18;
        s1.score = 3.8;

        Student s2 = new Student();
        s2.name = "Han Meimei";
        s2.gender = "女";
        s2.age = 19;
        s2.score = 4.0;

        Student s3 = new Student();
        s3.name = "Jim";
        s3.gender = "男";
        s3.age = 18;
        s3.score = 2.6;
    }
}

注意事项:

  1. new 关键字用于创建对象的实例;
  2. 使用 . 号来访问对象的属性和方法;
  3. 同一个类可以创建多个对象,每个对象独立占用内存空间,存储各自的成员变量。

3.2 类和对象的说明

  1. 只是一个“模型”或“蓝图”,用来描述对象应该包含哪些成员变量和成员方法;它本身并不直接占用实际的存储空间。
  2. 对象 是类的实例化结果,才真正占用物理空间,可以用来存储数据,也能执行方法。
  3. 同一个类可以实例化出多个对象,对象之间的成员变量互不影响
  4. 类比:类就像“建筑设计图”,对象就像“根据设计图建造出来的房子”。设计图只有一份,但可以建造出很多房子,每个房子都有自己的空间和家具。

在这里插入图片描述
在这里插入图片描述

示例代码:

public class PetDog {
    public String name;
    public String color;

    public void barks() {
        System.out.println(name + ": 旺旺旺~~~");
    }

    public void wag() {
        System.out.println(name + ": 摇尾巴~~~");
    }

    public static void main(String[] args) {
        PetDog dog1 = new PetDog();
        dog1.name = "阿黄";
        dog1.color = "黑黄";
        dog1.barks();
        dog1.wag();

        PetDog dog2 = new PetDog();
        dog2.name = "赛虎";
        dog2.color = "棕白";
        dog2.barks();
        dog2.wag();
    }
}

执行结果:

阿黄: 旺旺旺~~~
阿黄: 摇尾巴~~~
赛虎: 旺旺旺~~~
赛虎: 摇尾巴~~~

四、this引用

4.1 为什么要有 this 引用

先来看一个日期类的例子:

public class Date {
    public int year;
    public int month;
    public int day;

    public void setDay(int y, int m, int d) {
        year = y;
        month = m;
        day = d;
    }

    public void printDate() {
        System.out.println(year + "/" + month + "/" + day);
    }

    public static void main(String[] args) {
        Date d1 = new Date();
        Date d2 = new Date();
        Date d3 = new Date();

        d1.setDay(2020, 9, 15);
        d2.setDay(2020, 9, 16);
        d3.setDay(2020, 9, 17);

        d1.printDate(); // 2020/9/15
        d2.printDate(); // 2020/9/16
        d3.printDate(); // 2020/9/17
    }
}

这个代码能正常运行,但仔细思考时,会有两个疑问:

在这里插入图片描述

  1. 如果形参名和成员变量名相同,例如都叫 yearmonthday,那在 setDay 方法里写 year = year; 究竟是谁给谁赋值?
  2. d1, d2, d3 分别调用了 setDayprintDate 方法,而这两个方法中并没有任何“对象标识”的信息,它们是如何知道当前要修改或打印的是哪个对象的数据呢?

为解决这两个疑惑,Java 提供了 this 引用。

4.2 什么是 this 引用

this 引用指向“当前对象”,也就是“调用该成员方法的那个对象”。在成员方法中,对所有成员变量的访问,实际上都隐式地通过 this 引用完成,但对程序员是透明的。

示例:当我们写 year = y; 时,编译器底层会将其视作 this.year = y;,其中 this 就是那个正在调用 setDay 方法的对象。

public void setDay(int year, int month, int day) {
    // 此时如果写: year = year;
    // 就会产生歧义. 下面使用this来指明是给当前对象的year赋值.
    this.year = year;
    this.month = month;
    this.day = day;
}

4.3 this 引用的特性

  1. this 的类型:与所在类相同,哪个对象在调用方法,this 就指向哪个对象;
  2. 只能在“成员方法”中使用this 不存在于静态方法或其他语法结构中;
  3. 只能引用当前对象:无法在一个对象的方法中让 this 指向另一个对象;
  4. this 是成员方法中的第一个“隐藏”参数:当对象调用成员方法时,编译器会自动将调用者对象的引用作为实参传给方法,方法体内的 this 则用于接收该引用。

示例:

public class Date {
    public int year;
    public int month;
    public int day;

    public void setDay(int year, int month, int day) {
        this.year = year;   // this.year 表示“当前对象的 year”
        this.month = month; // this.month 表示“当前对象的 month”
        this.day = day;     // this.day 表示“当前对象的 day”
    }

    public void printDate() {
        System.out.println(this.year + "/" + this.month + "/" + this.day);
    }

    public static void main(String[] args) {
        Date d = new Date();
        d.setDay(2021, 6, 9);
        d.printDate();  // 2021/6/9
    }
}

在这里插入图片描述


五、总结与展望

5.1 总结

  1. 面向对象思想:通过对现实事物的抽象,利用类来描述其属性和行为,并通过实例化对象进行具体操作。这种方法比面向过程更能体现人们对事物本质的认知,特别适合大型程序的设计和维护。
  2. 类的定义与使用:使用 class 关键字创建类,并在类中定义成员变量(属性)和成员方法(行为),为后续实例化提供模板。
  3. 对象的实例化:通过 new 关键字和类名生成对象,每个对象都拥有独立的内存空间,用于存储自身的成员变量和方法。
  4. this 引用:在成员方法中用于指代“当前对象”,可以有效避免形参与成员变量重名带来的歧义,并在方法内部显式访问或修改当前对象的属性。

5.2 展望

  • 对象的构造与初始化:了解构造方法、默认初始化、就地初始化等机制,掌握对象在创建时如何完成初始赋值。
  • 封装与访问控制:通过访问限定符(如 publicprivate 等)保护对象内部数据,保证程序的安全性和可维护性。
  • 静态成员与代码块:学习 static 修饰符的作用以及静态成员变量、静态方法的特点;同时深入理解普通代码块、构造代码块和静态代码块在初始化中的应用。
  • 内部类:探索在类中定义类的高级用法,包括实例内部类、静态内部类、局部内部类和匿名内部类的语法和应用场景。

通过本篇的学习,我们已经打下了面向对象编程的基础。后续内容将进一步扩展和深入,让你在编写 Java 程序时更加得心应手。若有任何疑问,欢迎在评论区留言交流,让我们一起学习、共同进步!


以上就是关于【Java篇】无形至有形,法与道的编织:类与对象初探啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️
在这里插入图片描述