面向对象的理解
什么是类?什么是对象?
| 概念 | 说明 | 类比 |
|---|---|---|
| 类(Class) | 模板、图纸,定义了事物的属性和行为 | 汽车设计图纸 |
| 对象(Object) | 类的实例,根据类创建出来的具体个体 | 根据图纸造出来的具体一辆车 |
面向过程 vs 面向对象
面向过程写法:
public static void main(String[] args) {
int age = 19;
String name = "唐伯虎";
String local = "苏州";
showInfo(name, age, local);
int age2 = 20;
String name2 = "祝枝山";
String local2 = "苏州";
showInfo(name2, age2, local2);
}
public static void showInfo(String name, int age, String local) {
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
System.out.println("籍贯:" + local);
}Code language: JavaScript (javascript)
面向过程的问题:
| 弊端 | 说明 |
|---|---|
| 缺乏对数据的封装 | 每个学生的数据分散为多个独立变量,没有统一管理 |
| 数据和方法分离 | 数据(age、name)和操作数据的方法(showInfo)是独立的,没有归属关系 |
面向对象写法:
class Person {
// 属性(成员变量)
int age;
String name;
String local;
// 行为(方法)
void showInfo() {
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
System.out.println("籍贯:" + local);
}
}
public class Test {
public static void main(String[] args) {
Person s = new Person();
s.age = 12;
s.name = "张三";
s.local = "杭州";
s.showInfo();
Person s2 = new Person();
s2.age = 13;
s2.name = "李四";
s2.local = "杭州";
s2.showInfo();
}
}Code language: JavaScript (javascript)
如何创建类
class 类名 {
// 成员变量(属性)
// 成员方法(行为)
}Code language: JavaScript (javascript)
class Person {
int age;
String name;
String local;
void showInfo() {
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
System.out.println("籍贯:" + local);
}
}Code language: JavaScript (javascript)
如何创建对象
使用 new 关键字创建对象:
类名 对象名 = new 类名();
Person p = new Person();Code language: JavaScript (javascript)
对象的成员及访问方式
| 成员类型 | 访问方式 | 示例 |
|---|---|---|
| 成员变量 | 对象名.变量名 | p.age = 18; |
| 成员方法 | 对象名.方法名() | p.showInfo(); |
Person p = new Person();
p.age = 18; // 访问成员变量
p.name = "王五"; // 访问成员变量
p.showInfo(); // 调用成员方法Code language: JavaScript (javascript)
数据类型的演进
| 阶段 | 类型 | 特点 |
|---|---|---|
| 基本数据类型 | int、double 等 | 只能装一个值 |
| 数组 | int[]、String[] 等 | 只能装同类型的多个值 |
| 自定义类 | Person、Student 等 | 想装什么就装什么,整合数据和方法 |
面向对象的核心特点
| 特点 | 说明 |
|---|---|
| 封装 | 将数据和行为封装在一个类中,形成一个整体 |
| 数据归属 | 数据属于对象本身,方法操作的是对象自己的数据 |
| 可复用 | 一个类可以创建多个对象,每个对象独立 |
| 可扩展 | 可以在类中随时添加新属性和新方法 |
多个对象的内存关系
Person s1 = new Person(); // 在堆中创建第一个 Person 对象
Person s2 = new Person(); // 在堆中创建第二个 Person 对象Code language: JavaScript (javascript)
| 对象 | 内存 | 数据 |
|---|---|---|
s1 | 堆中对象 A | age=12, name="张三", local="杭州" |
s2 | 堆中对象 B | age=13, name="李四", local="杭州" |
s1 和 s2 是两个独立的对象,互不影响。修改 s1.age 不会改变 s2.age。
总结
面向对象的最大特点就是可以封装一种新的类型出来,这种类型整合了数据和方法。然后通过这个自定义类型可以创建更多的变量(对象),每个对象都有自己的数据和行为。
Previous: 练习——获取随机字符数组
Next: 自己创建数据类型——类