Java基础 面向对象基础

2 阅读10分钟

一、面向对象思想入门(视频核心导入)

1. 两种编程思想对比(视频重点强调)

Java是纯面向对象编程语言(OOP),核心是“找对象、用对象、造对象”,与面向过程思想对比清晰,视频中用“洗衣服”案例举例,便于理解:

  • 面向过程(POP) :关注“步骤和流程”,一步一步执行,亲力亲为。比如洗衣服:拿衣服→放水→放洗衣液→搓洗→漂洗→拧干→晾晒,每一步都要自己实现。
  • 面向对象(OOP) :关注“对象和交互”,找能完成对应功能的对象,让对象做事。比如洗衣服:找“洗衣机”(对象),把衣服交给洗衣机,洗衣机(对象)自己完成搓洗、漂洗等操作,无需关注内部细节。

核心区别:面向过程关注“怎么做”,面向对象关注“谁来做”;面向过程适合简单业务,面向对象适合复杂、可扩展的业务开发。

2. 面向对象核心概念

面向对象的核心是“类”和“对象”,两者是模板与实例的关系,类比“图纸和房子”:

  • 对象:现实世界中具体的事物/实体,有自己的“属性”(特征)和“方法”(行为)。比如:具体的一个人、一辆车、一台洗衣机。
  • :对一类具有相同属性和方法的对象的抽象描述,是创建对象的“模板”。比如:“人类”是所有具体的人的抽象,“洗衣机类”是所有具体洗衣机的抽象。

类与对象的关系:类是抽象的、没有实体的;对象是类的具体实例,一个类可以创建多个对象(比如一个“人类”可以创建“张三”“李四”两个具体对象)。

3. 面向对象三大特征

核心定义:

  • 封装:把对象的属性和方法打包在一起,隐藏内部细节,只对外暴露访问接口(比如洗衣机,我们只需要按按钮,不需要知道内部怎么转动)。
  • 继承:一个类(子类)可以继承另一个类(父类)的属性和方法,减少重复代码(比如“学生类”可以继承“人类”的姓名、年龄属性)。
  • 多态:同一行为,在不同对象上有不同的表现(比如“吃饭”,人用筷子吃,动物用嘴巴吃)。

二、类与对象的核心语法(视频重点代码演示)

1. 类的定义

类是创建对象的模板,定义类时,必须明确类的“属性”(成员变量)和“方法”(成员方法),语法格式严格遵循视频要求:

// 修饰符:基础阶段只学public,代表公共访问
public class 类名 {
    // 1. 成员变量(属性):描述类的特征,直接定义在类中、方法外
    数据类型 变量名; // 未初始化,JVM会赋默认值
    数据类型 变量名 = 初始值; // 可直接初始化
    
    // 2. 成员方法(行为):描述类的功能,无static修饰(视频重点强调:区别于之前的静态方法)
    方法返回值类型 方法名(参数列表) {
        方法体; // 具体执行逻辑
        return 返回值; // 有返回值必须写,无返回值写void且可省略return
    }
}

命名规范(视频强调) :类名必须遵循“大驼峰命名法”,首字母大写,后续每个单词首字母也大写,见名知意,比如Person、Student、WashingMachine,不能用拼音或关键字。

视频示例:Person类

// 人类:抽象描述人的属性和行为
public class Person {
    // 成员变量(属性):姓名、年龄、性别
    String name; // 未初始化,默认值null
    int age; // 默认值0
    String gender; // 默认值null
    
    // 成员方法(行为):说话、吃饭
    public void speak() {
        // 直接使用成员变量
        System.out.println(name + "在说话");
    }
    
    public void eat(String food) {
        System.out.println(name + "在吃" + food);
    }
}

2. 对象的创建与使用

类只是模板,必须通过“实例化”创建具体对象,才能使用类的属性和方法,视频中明确步骤:创建对象→操作属性→调用方法。

(1)创建对象语法(视频固定写法)

// 格式:类名 对象名 = new 类名();
Person p1 = new Person(); // 创建Person类的对象p1

视频讲解:new关键字的作用是“在堆内存中创建对象”,为成员变量分配默认值;对象名(p1)是栈内存中的引用,指向堆内存中的具体对象。

(2)操作对象的属性和方法

通过“对象名.属性名”访问/赋值成员变量,通过“对象名.方法名(参数)”调用成员方法,视频代码示例:

public class TestPerson {
    public static void main(String[] args) {
        // 1. 创建对象
        Person p1 = new Person();
        
        // 2. 为对象的属性赋值(修改默认值)
        p1.name = "张三";
        p1.age = 20;
        p1.gender = "男";
        
        // 3. 访问对象的属性
        System.out.println("姓名:" + p1.name); // 输出:姓名:张三
        System.out.println("年龄:" + p1.age); // 输出:年龄:20
        
        // 4. 调用对象的方法
        p1.speak(); // 输出:张三在说话
        p1.eat("米饭"); // 输出:张三在吃米饭
        
        // 5. 创建第二个对象(与p1相互独立)
        Person p2 = new Person();
        p2.name = "李四";
        p2.eat("面条"); // 输出:李四在吃面条
    }
}

(3)成员变量的默认值

创建对象时,若未给成员变量赋值,JVM会自动分配默认值,和数组元素默认值一致,视频中总结表格:

数据类型默认值
整数型(int、long等)0
浮点型(float、double等)0.0
布尔型(boolean)false
字符型(char)\u0000(空字符,控制台不显示)
引用类型(String等)null

3. 局部变量与成员变量的区别

对比维度成员变量(类中、方法外)局部变量(方法内、参数)
定义位置类的内部,所有成员方法外部方法体内部、参数列表、代码块内
内存位置堆内存(跟随对象)栈内存(跟随方法)
默认值有JVM分配的默认值无默认值,必须显式赋值才能使用
作用域整个类,所有成员方法都能访问仅在定义的方法/代码块内有效

三、封装(视频核心重点,必掌握)

1. 封装的定义

封装就是“隐藏内部细节,对外暴露接口”,视频中用“手机”举例:我们使用手机时,只需要按屏幕(接口),不需要知道手机内部的芯片、线路怎么工作;对应到Java中,就是把对象的属性隐藏,不让外部直接访问,通过专门的方法访问/修改属性。

2. 封装的实现步骤

  1. 属性私有化:用private修饰成员变量,让成员变量只能在当前类内部访问,外部无法直接操作(视频强调:private是封装的核心关键字)。
  2. 提供getter方法:用于获取私有化的属性值,方法名固定格式:public 数据类型 get属性名()(布尔型特殊,用is开头)。
  3. 提供setter方法:用于修改私有化的属性值,方法名固定格式:public void set属性名(数据类型 参数),可在方法中添加数据校验,保证数据安全。

视频示例:Person类封装

public class Person {
    // 1. 属性私有化(private修饰)
    private String name;
    private int age;
    private boolean isStudent; // 布尔型属性
    
    // 2. getter方法:获取属性值
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
    
    // 布尔型属性的getter方法:用is开头(视频重点强调)
    public boolean isStudent() {
        return isStudent;
    }
    
    // 3. setter方法:修改属性值,添加数据校验
    public void setName(String name) {
        // this关键字:区分成员变量和局部变量(视频重点讲解)
        this.name = name;
    }
    
    public void setAge(int age) {
        // 数据校验:年龄不能小于0或大于150(视频演示的校验逻辑)
        if (age >= 0 && age <= 150) {
            this.age = age;
        } else {
            System.out.println("年龄输入无效,默认赋值18");
            this.age = 18;
        }
    }
    
    public void setStudent(boolean student) {
        isStudent = student;
    }
    
    // 成员方法
    public void speak() {
        System.out.println(name + "今年" + age + "岁");
    }
}

3. this关键字

视频中明确this的核心作用,只有1个:区分成员变量和局部变量(当方法的形参名和成员变量名相同时,必须用this.成员变量名表示当前对象的属性)。

补充:this代表“当前对象的引用”,只能在成员方法中使用,不能在静态方法中使用(视频强调:后续会详细讲解静态方法)。

4. 封装的使用

封装后,外部不能直接通过“对象名.属性名”访问属性,只能通过getter/setter方法,视频代码示例:

public class TestPerson {
    public static void main(String[] args) {
        Person p = new Person();
        
        // 错误:不能直接访问private属性(编译报错)
        // p.age = -20;
        
        // 正确:通过setter方法修改属性,触发数据校验
        p.setAge(-20); // 输出:年龄输入无效,默认赋值18
        p.setName("张三");
        p.setStudent(true);
        
        // 正确:通过getter方法获取属性值
        System.out.println(p.getName()); // 张三
        System.out.println(p.getAge()); // 18
        System.out.println(p.isStudent()); // true
        
        p.speak(); // 张三今年18岁
    }
}

四、构造方法

1. 构造方法的定义

构造方法是类的特殊方法,专门用于创建对象时初始化属性,视频中强调:只要用new关键字创建对象,就会自动调用构造方法,无需手动调用。

2. 构造方法的语法规则

  • 方法名必须与类名完全一致(包括大小写),比如Person类的构造方法名只能是Person。
  • 没有返回值类型,甚至连void都不能写(视频重点强调:区别于普通方法)。
  • 修饰符:基础阶段只用public,和类的修饰符一致。
  • 方法体中可以编写初始化逻辑,为成员变量赋值。

3. 构造方法的分类

(1)无参构造方法

没有参数的构造方法,视频中强调:若类中没有手动定义任何构造方法,JVM会自动生成一个默认的无参构造(空方法体);若手动定义了构造方法,默认无参构造会被覆盖(易错点)。

// 无参构造方法(手动编写)
public Person() {
    // 初始化属性,可省略(JVM会赋默认值)
    this.name = "未知姓名";
    this.age = 18;
}

(2)有参构造方法

带有参数的构造方法,用于创建对象时直接为属性赋值,无需再调用setter方法,视频示例:

// 有参构造:为姓名、年龄赋值
public Person(String name, int age) {
    this.name = name;
    this.age = age; // 可添加数据校验
}

// 有参构造:为所有属性赋值(构造方法重载)
public Person(String name, int age, boolean isStudent) {
    this.name = name;
    this.age = age;
    this.isStudent = isStudent;
}

4. 构造方法的使用

创建对象时,根据传入的参数个数、类型,自动匹配对应的构造方法(构造方法重载),视频代码示例:

public class TestPerson {
    public static void main(String[] args) {
        // 调用无参构造
        Person p1 = new Person();
        p1.speak(); // 未知姓名今年18岁
        
        // 调用带2个参数的有参构造
        Person p2 = new Person("李四", 22);
        p2.speak(); // 李四今年22岁
        
        // 调用带3个参数的有参构造
        Person p3 = new Person("王五", 25, true);
        System.out.println(p3.getName() + "是否是学生:" + p3.isStudent());
    }
}

5. 构造方法的注意事项

  • 构造方法可以重载(和普通方法重载规则一致):方法名相同,参数列表不同(个数、类型、顺序)。
  • 手动定义构造方法后,默认无参构造会消失,若需要用无参创建对象,必须手动编写无参构造(视频重点强调,避免编译报错)。
  • 构造方法不能手动调用,只能在new对象时由JVM自动调用(比如p1.Person(); 编译报错)。
  • 可以用this(参数)在一个构造方法中调用本类的其他构造方法,必须写在构造方法的第一行(视频简要提及,后续详细讲解)。

五、视频总结与课后注意事项

  • 面向对象基础核心是“类和对象”,类是模板,对象是实例,记住“new关键字创建对象”。
  • 封装的核心是private修饰属性,提供getter/setter方法,this关键字区分成员变量和局部变量。
  • 构造方法用于初始化对象,无参、有参均可,手动定义构造方法必须补全无参构造。
  • 课后练习:编写Student类,实现封装,编写无参、有参构造,测试类中创建对象并使用(视频要求)。