类与对象

一、核心概念

  1. 类(Class):是对象的模板 / 蓝图,描述一类事物的属性(特征)*和*行为(功能),是抽象的概念(如:人类、汽车类)。
  2. 对象(Object):是类的实例,是具体存在的个体,拥有类定义的属性和行为(如:张三、某辆汽车)。
  3. 关系先定义类,再通过类创建对象,一个类可以创建多个对象。

二、类的定义格式(固定语法)

类是 Java 程序的核心组织单元,包含成员变量(属性)*和*成员方法(行为)

// 类的定义:修饰符 class 类名 { }
public class 类名 {
    // 1. 成员变量(属性):描述对象的特征,定义在方法外、类内
    修饰符 数据类型 属性名; // 例:private String name;
    修饰符 数据类型 属性名 = 默认值;

    // 2. 构造方法:创建对象时初始化属性,无返回值,方法名=类名
    // 无参构造(默认自带,写了有参构造后需手动写)
    public 类名() {}
    // 有参构造:给对象属性赋值
    public 类名(数据类型 参数名, 数据类型 参数名) {
        this.属性名 = 参数名; // this代表当前对象
    }

    // 3. 成员方法(行为):描述对象的功能
    修饰符 返回值类型 方法名(参数列表) {
        // 方法体
        return 返回值; // 无返回值用void
    }

    // 4. 封装必备:get/set方法(获取/修改私有属性)
    public 数据类型 get属性名() { return this.属性名; }
    public void set属性名(数据类型 参数名) { this.属性名 = 参数名; }
}

三、对象的创建与使用

1. 创建对象(实例化)

// 格式:类名 对象名 = new 类名();
类名 对象名 = new 类名(); // 无参构造创建
类名 对象名 = new 类名(参数1, 参数2); // 有参构造创建

2. 使用对象

调用属性对象名.属性名(私有属性不能直接调用,必须用 get/set)

调用方法对象名.方法名(参数)


四、三大核心知识点(必掌握)

1. 封装(面向对象核心特性)

目的:保护数据,禁止外部直接访问 / 修改类的私有属性,提高代码安全性。

实现

  1. private(私有)修饰成员变量;
  2. 提供publicgetXxx()(获取)和setXxx()(修改)方法操作属性。

2. this 关键字

含义:代表当前对象(谁调用方法,this 就代表谁)。

作用:

  1. 区分局部变量成员变量重名问题;
  2. 在本类构造方法中调用其他构造方法(this(参数),必须写在第一行)。

3. 构造方法

作用:创建对象时,初始化对象的属性

特点:

  1. 方法名必须和类名完全一致
  2. 没有返回值类型(连 void 都没有);
  3. 每个类默认有一个无参构造,若手动写了有参构造,必须补写无参构造。

五、成员变量 vs 局部变量

表格

区别点 成员变量 局部变量
定义位置 类内、方法外 方法内或方法参数中
作用域 整个类中可用 仅当前方法内可用
默认值 有默认值(int=0,String=null) 无默认值,必须赋值才能使用
内存位置 堆内存 栈内存

六、完整示例(类 + 对象使用)

创建类

public class Main {
public static void main(String[] args) {
// 创建冰箱对象
Refrigerator fridge = new Refrigerator();

// 设置冰箱属性
fridge.brand = "海尔";
fridge.color = "白色";
fridge.capacity = 300;
fridge.isOn = true;

// 调用冰箱方法
fridge.openDoor();
}
}

public class Refrigerator {

        // --- 成员变量(描述特征)---
        String brand;      // 品牌
        String color;      // 颜色
        double capacity;  // 容量
        boolean isOn;     // 是否通电

    // --- 成员方法(描述行为)---
    // 行为1:打开冰箱门(对外公开)
    public void openDoor() {

        System.out.println(color + "的" + brand + "冰箱门打开了");
        // 假设开门后,我们调用一下内部制冷逻辑(模拟内部调用)
        coolDown(4);
    }

    // 行为2:制冷(内部私有,外部无法直接调用)
    private void coolDown(int temp) {
        System.out.println("【内部运作】正在启动压缩机,设定温度:" + temp + "度");
    }
}

微头条

Main

// 导入ArrayList和Scanner
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    // 静态集合:存放所有注册的用户对象
    static ArrayList<User> userList = new ArrayList<>();//动态增删元素的容器
    // 静态集合:存放所有新闻对象
    static ArrayList<News> newsList = new ArrayList<>();
    // 当前登录的用户对象,未登录时为null
    static User currentUser = null;
    // 扫描器,用于接收键盘输入
    static Scanner scanner = new Scanner(System.in);
    //程序入口
    public static void main(String[] args) {

        while (true) {// 无限循环,一直显示主菜单除非用户主动退出
            System.out.println("\n====== 微头条主菜单 ======");
            System.out.println("1. 注册");
            System.out.println("2. 登录");
            System.out.println("3. 查看新闻列表");
            System.out.println("4. 发布新闻");
            System.out.println("5. 退出");
            System.out.print("请选择:");
            int choice = scanner.nextInt();//输入整数,创建scanner同时导入包
            scanner.nextLine(); // 吃掉换行符,否则会读到空字符,跳过输入

            switch (choice) {
                case 1:
                    register();      // 调用注册方法
                    break;//回到while
                case 2:
                    login();         // 调用登录方法
                    break;
                case 3:
                    showNewsList();  // 显示新闻列表
                    break;
                case 4:
                    publishNews();   // 发布新闻
                    break;
                case 5:
                    System.out.println("再见!");
                    scanner.close();
                    return;          // 结束main方法,程序退出
                default:
                    System.out.println("无效选择!");
            }
        }
    }

    // 注册方法
    static void register() {
        System.out.print("用户名:");
        String name = scanner.nextLine();

        // 遍历userList,检查用户名是否已存在
        for (User u : userList) {//增强型for循环:依次取出userList中每一个User赋值给u,循环体是对u的操作
            if (u.getUsername().equals(name)) {  // 用equals比较字符串
                System.out.println("用户名已存在!");
                return;   // 结束方法,不再往下执行,回到调用点
            }
        }
//对比后发现不存在就可以设置密码了
        System.out.print("密码:");
        String pwd = scanner.nextLine();

        // 创建User对象并添加到userList集合中
        userList.add(new User(name, pwd));//创建了一个新的User对象,需要看User定义
        System.out.println("注册成功!");
    }

    // 登录方法
    static void login() {
        System.out.print("用户名:");
        String name = scanner.nextLine();
        System.out.print("密码:");
        String pwd = scanner.nextLine();

        // 遍历userList,查找匹配的用户名和密码
        for (User u : userList) {
            if (u.getUsername().equals(name) && u.getPassword().equals(pwd)) {
                currentUser = u;  // 记录当前登录的用户对象,为什么?
                System.out.println("登录成功!");
                return;   // 登录成功,结束方法
            }
        }
        // 未找到匹配的用户
        System.out.println("用户名或密码错误!");
    }

    // 发布新闻方法
    static void publishNews() {
        // 检查是否已登录
        if (currentUser == null) {
            System.out.println("请先登录!");
            return;
        }

        System.out.print("标题:");
        String title = scanner.nextLine();
        System.out.print("内容:");
        String content = scanner.nextLine();

        // 创建News对象,自动生成发布时间,并添加到newsList集合中
        newsList.add(new News(title, content));
        System.out.println("发布成功!");
    }

    // 查看新闻列表方法
    static void showNewsList() {
        System.out.println("\n====== 新闻列表 ======");
        // 遍历newsList,按顺序显示每条新闻的标题和发布时间
        for (int i = 0; i < newsList.size(); i++) {
            News n = newsList.get(i);
            // 编号从1开始,所以用(i+1)
            System.out.println((i+1) + ". " + n.getTitle() + " (" + n.getPublishTime() + ")");
        }
    }
}

News

public class News {    // 定义一个公开的News类(新闻类),用于封装新闻信息
    private String title;      // 私有属性:新闻标题,只能在当前类内部访问
    private String content;     // 私有属性:新闻内容,只能在当前类内部访问
    private String publishTime; // 私有属性:发布时间(字符串类型),存储格式化后的时间

    // 有参构造方法,创建新闻对象必须传入标题和内容
    public News(String title, String content) {
        this.title = title;    // 将参数title赋值给当前对象的title属性
        this.content = content;// 将参数content赋值给当前对象的content属性
        // 获取当前系统时间,格式化为"年-月-日 时:分:秒"后存入publishTime
        this.publishTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }

    // getter方法:获取新闻标题
    public String getTitle() {
        return title;    // 返回当前对象的title属性值
    }

    // getter方法:获取发布时间
    public String getPublishTime() {
        return publishTime; // 返回当前对象的publishTime属性值
    }
}

User

// 定义一个公开的User类,用于封装用户的用户名和密码信息
public class User {
    private String username;   // 私有属性:用户名,只能在当前类内部访问
    private String password;   // 私有属性:密码,只能在当前类内部访问

    // 无参构造方法,用于创建空User对象(某些框架需要)
    public User() {}

    // 有参构造方法,创建对象时同时初始化用户名和密码
    public User(String username, String password) {
        this.username = username; // this.username是当前对象的属性,将参数username赋值给它
        this.password = password; // this.password是当前对象的属性,将参数password赋值给它
    }

    // getter方法:通过此公共方法获取私有属性username(用户名)
    public String getUsername() { return username; }
    // setter方法:通过此公共方法修改私有属性username
    public void setUsername(String username) { this.username = username; }
    // getter方法:通过此公共方法获取私有属性password(密码)
    public String getPassword() { return password; }
    // setter方法:通过此公共方法修改私有属性password
    public void setPassword(String password) { this.password = password; }
}
posted @ 2026-06-03 21:05  伊沃·凡特森  阅读(22)  评论(0)    收藏  举报