Java 面向对象入门:初识类、对象与构造方法

128 阅读7分钟

Java 面向对象入门:初识类、对象与构造方法 ✨

Java 是一门面向对象的编程语言。理解面向对象的思想是掌握 Java 的关键。今天,我们将从最基础的概念入手,探索类和对象的奥秘,学习如何创建它们,以及如何使用构造方法初始化对象。

🤔 什么是类?什么是对象?

  • 现实世界的映射:我们的现实世界由各种各样的“对象”组成,比如人、汽车、书籍等。基于这些具体的对象,我们可以抽象出它们的“类型”或“类别”,这就是“类”的概念。
    • 对象:软件中真实存在的、具有独立特性的个体
    • :类型或类别,代表一类个体的通用描述。
  • 模子与实例:类可以理解为对象的模子、模板或图纸,它定义了这一类对象有哪些属性和行为。对象则是类的具体实例,根据类的模板创建出来的实体。一个类可以创建出多个不同的对象。
  • 类的组成:类通常包含两个核心部分:
    • 📊 对象的属性/特征/数据:这在类中被称为成员变量,用来描述对象的静态特征。
    • ⚙️ 对象的行为/动作/功能:这在类中被称为方法,用来描述对象的动态能力。

🏗️ 创建类与对象:从蓝图到实体

理解了类和对象的概念后,我们来看如何在 Java 中创建它们。

  • 创建类:使用 class 关键字定义一个类,并在其中定义成员变量和方法。

    public class Student { // 自己创造的一种数据类型
        // 成员变量 --- 描述对象的属性
        String name;
        int age;
        String className;
        String stuId;
    
        // 方法 ------ 描述对象的行为
        void study(){
            System.out.println(name+"在学习...");
        }
        void sayHi(){
            System.out.println("大家好,我叫"+this.name+",今年"+this.age+"岁了,所在班级为"+this.className+",学号为:"+this.stuId);
        }
        void playWith(String anotherName){
            System.out.println(this.name+"正在和"+anotherName+"一起玩...");
        }
    }
    
  • 创建对象:使用 new 关键字根据类创建对象。

    // 声明 Student 类型引用 zs 指向一个学生对象
    // Student 是数据类型 (引用类型)
    // zs 是引用类型变量 (引用)
    // = 指向
    // new Student() 创建对象
    Student zs = new Student();
    
  • 访问成员:使用对象的引用变量和点运算符 (.) 来访问对象的成员变量和调用方法。

    public class StudentTest {
        public static void main(String[] args) {
            // 创建一个学生对象 zg
            Student zg = new Student();
            // 访问成员变量并赋值
            zg.name = "张光";
            zg.age = 22;
            zg.className = "jsd2309";
            zg.stuId = "001";
            // 调用方法
            zg.study();
            zg.sayHi();
            zg.playWith("李林");
    
            // 创建另一个学生对象 ll
            Student ll = new Student();
            ll.name = "李林";
            ll.age = 23;
            ll.className = "jsd2309";
            ll.stuId = "002";
            ll.study();
            ll.sayHi();
            ll.playWith("张光");
    
            // 创建一个没有手动赋值成员变量的学生对象 zl
            // 1) 创建了一个学生对象
            // 2) 给所有成员变量赋默认值 (name, className, stuId 默认 null, age 默认 0)
            Student zl = new Student();
            zl.study(); // 输出 "null在学习..."
            zl.sayHi(); // 输出 "大家好,我叫null,今年0岁了,所在班级为null,学号为:null"
            zl.playWith("张光"); // 输出 "null正在和张光一起玩..."
        }
    }
    

    默认值规则:

    • byte, short, int, long, char: 0
    • float, double: 0.0
    • boolean: false
    • 引用类型 (如 String): null

👋 this:指代当前对象

this 是一个特殊的关键字,它指代当前正在调用方法的那个对象

  • 使用位置:this 只能用在方法中。
  • 默认存在:在方法中访问成员变量时,前面默认隐藏着一个 this.
  • 主要用法:
    • this.成员变量名访问成员变量 (必须掌握)。当成员变量与方法中的局部变量同名时,若想访问成员变量,则 this 不能省略。
    • this.方法名():调用方法 (一般不用)。
    • this():调用构造方法 (一般不用)。

⚙️ 构造方法:初始化对象的利器

构造方法是一种特殊的方法,主要作用是给对象的成员变量赋初始值。它在创建对象时被自动调用。

  • 作用:给成员变量赋初始值

  • 语法:

    • 方法名与类名完全相同。
    • 没有返回值类型 (连 void 都没有)
  • 调用:在创建 (new) 对象时被自动调用

  • 默认构造方法:如果你自己不编写任何构造方法,Java 编译器会默认提供一个无参构造方法。一旦你编写了任何构造方法,编译器就不再提供默认的无参构造方法。

  • 重载:构造方法可以重载,即可以定义多个同名但参数列表不同的构造方法。

    public class Student {
        // 成员变量 --- 描述对象的属性
        String name;
        int age;
        String className;
        String stuId;
    
        // 构造方法 1: 无参构造方法
        Student(){
            // 可以在这里设置一些默认值或执行初始化逻辑
        }
    
        // 构造方法 2: 有参构造方法
        Student(String name,int age,String className,String stuId){
            this.name = name; // 使用 this.name 访问成员变量,因为它与形参 name 同名
            this.age = age;
            this.className = className;
            this.stuId = stuId;
        }
    
        // 方法 ------ 描述对象的行为 (为了简洁,这里省略了 playWith 方法)
        void study(){
            System.out.println(name+"在学习...");
        }
        void sayHi(){
            System.out.println("大家好,我叫"+name+",今年"+age+
                 "岁了,所在班级为"+className+",学号为:"+stuId);
        }
    }
    

    使用构造方法创建对象并初始化:

    public class ConsDemo {
        public static void main(String[] args) {
            // 使用无参构造方法创建对象,然后手动赋值
            Student zg = new Student();
            zg.name = "张光";
            zg.age = 25;
            zg.className = "jsd2311";
            zg.stuId = "001";
            zg.sayHi(); // 输出:大家好,我叫张光,今年25岁了,所在班级为jsd2311,学号为:001
    
            // 使用有参构造方法创建对象并初始化
            Student ll = new Student("李林",24,"jsd2311","002");
            ll.sayHi(); // 输出:大家好,我叫李林,今年24岁了,所在班级为jsd2311,学号为:002
    
            // 使用有参构造方法创建另一个对象并初始化
            Student zl = new Student("赵亮",22,"jsd2311","003");
            zl.sayHi(); // 输出:大家好,我叫赵亮,今年22岁了,所在班级为jsd2311,学号为:003
        }
    }
    

    好处:复用给成员变量赋初始值的代码。通过不同的构造方法,我们可以以不同的方式创建并初始化对象,避免了重复编写赋值代码。

🚗 综合练习:模拟汽车对象

让我们通过一个模拟汽车的例子来巩固所学知识。

public class Car {
    String brand; // 品牌
    String color; // 颜色
    double price; // 价格

    // 无参构造方法
    Car(){
    }

    // 有参构造方法
    Car(String brand,String color,double price){
        this.brand = brand;
        this.color = color;
        this.price = price;
    }

    // 启动方法
    void start(){
        System.out.println(brand+"牌子的"+color+"颜色的"+price+"块钱的车启动了...");
    }
    // 运行方法
    void run(){
        System.out.println(brand+"牌子的"+color+"颜色的"+price+"块钱的车开始跑了...");
    }
    // 停止方法
    void stop(){
        System.out.println(brand+"牌子的"+color+"颜色的"+price+"块钱的车停止了...");
    }
}

public class CarTest {
    public static void main(String[] args) {
        // 使用无参构造方法创建对象并手动赋值
        Car car1 = new Car();
        car1.brand = "奔弛";
        car1.color = "黑";
        car1.price = 80;
        car1.start();
        car1.run();
        car1.stop();

        // 使用有参构造方法创建对象并初始化
        Car car2 = new Car("奥迪","银",40);
        car2.start();
        car2.run();
        car2.stop();

        // 使用有参构造方法创建另一个对象并初始化
        Car car3 = new Car("特斯拉","白",70);
        car3.start();
        car3.run();
        car3.stop();
    }
}

📖 补充知识点:

  • 面向过程 vs 面向对象
    • 面向过程:以方法为单位解决问题,适合简单业务(例如:大象装冰箱、去银行取钱)。
    • 面向对象:以对象为单位解决问题,适合复杂业务(例如:造汽车、造航母)。
  • OO 术语
    • OO: 面向对象 (Object-Oriented)
    • OOA: 面向对象分析 (Object-Oriented Analysis)
    • OOD: 面向对象设计 (Object-Oriented Design)
    • OOAD: 面向对象分析与设计 (Object-Oriented Analysis and Design)
    • OOP: 面向对象编程 (Object-Oriented Programming) - 我们主要参与的部分。
  • 高质量的代码:我们未来的目标,包括复用性、扩展性、维护性、移植性、可读性、健壮性和效率等。
  • 内存管理:Java 的内存主要由 JVM 管理,包括:
    • 堆 (Heap):存放 new 出来的对象(包括实例变量、数组元素、方法地址)。
    • 栈 (Stack):存放局部变量(包括方法参数)。
    • 方法区 (Method Area):存放 .class 字节码文件(包括所有方法、静态变量)。

总结

  • 类和对象:
    • 类:自己创造的一种数据类型,模板、模子,表示一类个体
    • 对象:真实存在的单个个体/东西
  • this和构造方法:
    • this:用在方法中,指代当前对象,哪个对象调用方法指的就是哪个对象 当成员变量和局部变量同名时,若想访问成员变量,this不能省略
    • 构造方法:作用、语法、调用、特点

提示

  1. 什么是类?
  2. 什么是对象?
  3. 类与对象的关系
  4. this的作用
  5. 构造方法的作用
  6. 构造方法的应用场景