类与对象
一、核心概念
- 类(Class):是对象的模板 / 蓝图,描述一类事物的属性(特征)*和*行为(功能),是抽象的概念(如:人类、汽车类)。
- 对象(Object):是类的实例,是具体存在的个体,拥有类定义的属性和行为(如:张三、某辆汽车)。
- 关系:先定义类,再通过类创建对象,一个类可以创建多个对象。
二、类的定义格式(固定语法)
类是 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. 封装(面向对象核心特性)
目的:保护数据,禁止外部直接访问 / 修改类的私有属性,提高代码安全性。
实现
:
- 用
private(私有)修饰成员变量; - 提供
public的getXxx()(获取)和setXxx()(修改)方法操作属性。
2. this 关键字
含义:代表当前对象(谁调用方法,this 就代表谁)。
作用:
- 区分局部变量和成员变量重名问题;
- 在本类构造方法中调用其他构造方法(
this(参数),必须写在第一行)。
3. 构造方法
作用:创建对象时,初始化对象的属性。
特点:
- 方法名必须和类名完全一致;
- 没有返回值类型(连 void 都没有);
- 每个类默认有一个无参构造,若手动写了有参构造,必须补写无参构造。
五、成员变量 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; }
}
浙公网安备 33010602011771号