面向对象(Object-Oriented)
核心思想
-
对象为中心:将现实世界的事物抽象为对象
-
三大特征:封装、继承、多态
-
编程范式:以对象为基本单位组织代码
类和对象
类(Class)
-
定义:具有相同属性和行为的对象的抽象描述
-
作用:对象的蓝图或模板
-
特点:描述"是什么",而不是具体实例
对象(Object)
-
定义:类的具体实例
-
特点:真实存在的具体个体
-
关系:基于类创建的具体实体
类和对象的关系
-
类 → 对象:类是创建对象的模板
-
对象 → 类:对象是类的具体实现
-
一对多:一个类可以创建多个对象
类的定义
基本结构
java
public class 类名 {
// 1. 成员变量(属性)
// 2. 成员方法(行为)
// 3. 构造方法
// 4. 代码块
// 5. 内部类
}
类名规范
-
首字母大写:遵循驼峰命名法
-
见名知意:体现类的功能或属性
-
名词形式:通常使用名词
一个Java文件的规则
-
可以定义多个class
-
只能有一个public修饰的class
-
public类的类名必须与文件名相同
对象的创建与使用
创建对象
java
类名 对象名 = new 类名();
-
new:在堆内存中分配空间
-
类名():调用构造方法初始化对象
使用对象
java
// 访问属性
对象名.成员变量;
// 调用方法
对象名.方法名(参数);
JavaBean类
特点
-
专用描述类:仅用于描述一类事物
-
无main方法:不包含程序入口
-
标准结构:私有属性 + 公共getter/setter
示例
java
// JavaBean类 - 描述学生
public class Student {
// 私有属性
private String name;
private int age;
// 公共构造方法
public Student() {}
// Getter和Setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试类
特点
-
包含main方法:程序入口
-
用于测试:创建并测试其他类的对象
-
分离关注点:业务逻辑和测试逻辑分离
示例
java
// 测试类
public class Test {
public static void main(String[] args) {
// 创建JavaBean对象
Student stu = new Student();
// 设置属性
stu.setName("张三");
stu.setAge(20);
// 获取并显示属性
System.out.println("姓名:" + stu.getName());
System.out.println("年龄:" + stu.getAge());
}
}
封装(Encapsulation)
封装的概念
-
数据保护:隐藏对象的内部实现细节
-
接口暴露:只提供必要的访问方式
-
安全控制:防止外部随意修改内部数据
Private关键字
作用
-
访问限制:仅允许本类内部访问
-
数据保护:防止外部直接修改
-
强制规范:要求通过特定方法操作
使用示例
java
public class Person {
// 私有成员变量
private String name;
private int age;
private double salary;
// 公共构造方法
public Person() {}
// Getter方法 - 获取值
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Setter方法 - 设置值(可添加验证)
public void setName(String name) {
if (name != null && !name.trim().isEmpty()) {
this.name = name;
}
}
public void setAge(int age) {
if (age >= 0 && age <= 150) {
this.age = age;
}
}
}
封装的优势
1. 提高安全性
-
防止非法数据赋值
-
控制访问权限
-
隐藏实现细节
2. 提高灵活性
-
内部实现可随时修改
-
不影响外部调用
-
便于维护和升级
3. 提高可维护性
-
代码结构清晰
-
职责分离明确
-
易于调试和测试
4. 提高代码复用性
-
标准化接口
-
便于其他类使用
-
促进代码复用
封装的最佳实践
1. 属性私有化
java
private 数据类型 属性名;
2. 提供公共访问方法
java
public 数据类型 get属性名() {
return 属性名;
}
public void set属性名(数据类型 参数) {
// 可添加验证逻辑
this.属性名 = 参数;
}
3. 方法命名规范
-
Getter方法:
get+ 属性名(首字母大写) -
Setter方法:
set+ 属性名(首字母大写) -
布尔属性:
is+ 属性名(首字母大写)
4. 添加数据验证
java
public void set属性名(数据类型 值) {
if (验证条件) {
this.属性名 = 值;
} else {
// 处理错误情况
}
}
封装的实际意义
-
符合现实逻辑:现实中的对象都有其内部状态
-
促进模块化:每个类都是独立的模块
-
降低耦合度:类之间依赖减少
-
提高开发效率:便于团队协作
javapublic class Phone { //属性 String brand ; double price ; //行为 public void call(){ System.out.println("手机在打电话"); } public void playGame(){ System.out.println("手机在玩游戏"); } }javapublic class PhoneTest { public static void main(String[] args) { //创建手机的对象 Phone p = new Phone(); //给手机赋值 p.brand = "小米"; p.price = 1999.98; //获取手机对象中的值 System.out.println(p.brand); System.out.println(p.price); //调用手机中的方法 p.call(); p.playGame(); } }javapublic class GirlFriend { //属性 private String name ; private int age ; private String gender ; //针对每一个私有化的成员变量,都提供get和set方法 //set方法:给成员变量赋值 //get方法:对外提供成员变量 public void setName(String n){ name = n; } public String getName(){ return name; } public void setAge(int a){ if (a >= 18 && a <= 50){ age = a; }else { System.out.println("非法参数"); } } public int getAge(){ return age; } public void setGender(String g){ gender = g; } public String getGender(){ return gender; } //行为 public void sleep(){ System.out.println("女朋友在睡觉"); } public void eat(){ System.out.println("女朋友在吃饭"); } }javapublic class GirlFriendText { public static void main(String[] args) { GirlFriend g = new GirlFriend(); g.setName ("刘亦菲"); g.setAge(18); g.setGender("女"); System.out.println(g.getName()); System.out.println(g.getAge()); System.out.println(g.getGender()); g.sleep(); g.eat(); } }