如果你问Java程序员:Java最重要的语法是什么?
十个人里有九个会告诉你:面向对象。
没错,面向对象是Java语法的基石。如果这个章节不会,可以说整个Java就炸了——后面的集合、IO、多线程、框架全都学不下去。
很多初学者觉得面向对象很难,因为它太抽象了。但当你真正理解它的本质,会发现它其实很简单:就是把零散的数据组织成一个整体,就像把一堆散件装进一个盒子里。
今天这篇文章,我们就从零开始,彻底搞懂面向对象的核心概念:类与对象、数据安全、this关键字、构造方法,以及标准Javabean类的写法。
一、为什么需要面向对象?
想象一下,你要记录一只小狗的信息:名字、身高、体重、颜色、性别。
如果用最原始的方式,你需要定义5个变量:
String name = "小白"; int height = 30; int weight = 10; String color = "白色"; String gender = "公";如果只有一只狗,还好。但如果有三只狗呢?
String name1 = "小白", name2 = "小黑", name3 = "小黄"; int height1 = 30, height2 = 35, height3 = 28; int weight1 = 10, weight2 = 12, weight3 = 9; // ... 变量越来越多,越来越乱问题出在哪里?数据是零散的,变量之间没有关联。
解决问题的思路很简单:把零散的数据封装成一个整体。就像生活中,把散落的物品放进一个包里,以后只需要面对这个包。
在Java中,这个“包”就是对象。而面向对象编程,就是面向一个个完整的对象编程,不再处理零散的数据。
二、类与对象:先有类,后有对象
类的定义
类是对一类事物的统一描述。它规定了这类事物必须包含哪些属性。
public class Dog { String name; // 名字 int age; // 年龄 int weight; // 体重 String color; // 颜色 }重要:类中只定义属性变量,不赋值。因为类只是描述,不代表具体的某一只狗。如果提前赋值,所有狗都会有这个默认值,不符合现实逻辑。
创建对象
有了类的描述,就可以创建具体的对象了:
// 创建对象语法 Dog d = new Dog(); // 给属性赋值 d.name = "小白"; d.age = 2; d.weight = 10; d.color = "白色";new:Java关键字,开辟一块新内存,创建一个符合类定义的对象d:对象的名字(引用变量).:调用对象内部的属性或方法
如果有多只狗,重复这个过程即可。
Javabean类和测试类
在Java中,有两种特殊的类:
Javabean类:描述一类事物,不需要main方法。比如Dog、Student、Phone等。
测试类:带有main方法,是程序入口,用于创建Javabean对象并测试功能。
类的行为
类不仅能定义属性,还能定义行为(方法):
public class Teacher { String name; int age; // 行为:授课 public void teach() { System.out.println("老师在授课"); } // 行为:吃饭 public void eat() { System.out.println("老师在吃饭"); } }注意:Javabean类中的方法不加static关键字。
三、数据安全问题:private关键字
上面的代码有个严重问题:属性是公开的,外部可以直接修改。
Dog d = new Dog(); d.age = -200; // 语法正确,但逻辑错误!年龄不能为负解决这个问题,需要把属性“藏起来”,只暴露受控的访问方式。这就是封装。
private关键字
private是权限修饰符,被它修饰的成员只能在本类内部访问,外部无法直接访问。
public class Dog { private int age; // 私有化,外部不能直接访问 }get/set方法
私有化后,外部怎么访问?提供公共的get和set方法:
public class Dog { private int age; // set方法:赋值,可以做数据校验 public void setAge(int age) { if (age > 0 && age < 30) { this.age = age; } else { System.out.println("年龄非法!"); } } // get方法:获取值 public int getAge() { return age; } }测试类中使用:
Dog d = new Dog(); d.setAge(2); // 合法 d.setAge(-200); // 非法,被拦截数据安全的标准步骤:
所有成员变量都用
private修饰为每个私有属性提供对应的
publicget和set方法在set方法中做数据校验
四、this关键字:区分同名变量
在set方法中,我们希望参数名和属性名一致,这样更直观。但问题来了:参数和属性重名了怎么办?
public void setAge(int age) { age = age; // 这是把参数自己赋值给自己,没给属性赋值! }就近原则
Java在方法中使用变量时,遵循就近原则:优先找方法内的局部变量,找不到才找成员变量。
上面的代码中,两个age都是局部参数,所以age = age毫无意义。
this的作用
this代表当前对象的成员变量。加上this.前缀,就明确指定要访问的是成员变量。
public void setAge(int age) { this.age = age; // 把参数赋值给当前对象的成员变量 }练习:看代码说结果
public class Student { private int age; public void setAge() { int age = 10; System.out.println(age); // 10(局部变量) System.out.println(this.age); // 0(成员变量,没赋值默认0) } }五、构造方法:创建对象时直接赋值
用set方法赋值需要多行代码,如果属性很多就很麻烦:
Student s = new Student(); s.setName("张三"); s.setAge(23); s.setHeight(175); s.setWeight(65);有没有办法在创建对象的同时就把值赋好?
构造方法的定义
构造方法是一种特殊的方法,在创建对象时自动调用,用于给属性初始化。
格式:
public 类名(参数列表) { // 赋值逻辑 }三大特点:
方法名必须和类名完全相同(大小写也要一致)
没有返回值类型,连
void都不能写不能使用
return返回数据
示例:完整的学生类
public class Student { private String name; private int age; // 无参构造 public Student() { } // 带全部参数的构造 public Student(String name, int age) { this.name = name; this.age = age; } // get/set方法(省略) }使用:
// 调用无参构造 Student s1 = new Student(); // 调用带参构造,创建对象的同时完成赋值 Student s2 = new Student("张三", 23);构造方法注意事项
如果没有手动定义任何构造方法,Java虚拟机会自动提供一个默认的无参构造
如果手动定义了任意构造方法,虚拟机就不再提供默认的无参构造
多个构造方法可以构成方法重载(方法名相同,参数列表不同)
开发规范:无论是否用到,都要手动写出无参构造和带全部参数的构造。
六、标准Javabean书写规范
一个完整的标准Javabean必须包含以下5个部分:
类名见名知意
所有成员变量都用private修饰
为每个成员变量提供对应的get和set方法
手动编写无参构造和带全部参数的构造
根据需求添加成员方法(不加static)
完整示例:
public class Student { // 1. 属性私有化 private String name; private int age; // 2. 构造方法(无参 + 全参) public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } // 3. get/set方法 public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { if (age > 0 && age < 150) { this.age = age; } } public int getAge() { return age; } // 4. 行为方法(不加static) public void study() { System.out.println(name + "正在学习"); } }七、总结:面向对象核心要点
| 概念 | 作用 | 关键点 |
|---|---|---|
| 类 | 描述一类事物 | 只定义属性,不赋值 |
| 对象 | 具体的事物实例 | 用new创建,通过.属性访问 |
| private | 数据安全 | 成员变量私有化,外部不能直接访问 |
| get/set | 安全访问 | set中做数据校验 |
| this | 区分同名变量 | 代表当前对象的成员变量 |
| 构造方法 | 创建对象时赋值 | 方法名同类名,无返回值 |
| Javabean规范 | 标准写法 | 私有属性 + get/set + 无参/全参构造 |
写在最后
面向对象是Java的灵魂。掌握了今天的内容,你就拿到了面向对象的第一把钥匙。
记住:类是对事物的描述,对象是具体的实例。就像“狗”是一个概念,“小白”才是一只真实的狗。
现在,打开IDEA,按照标准Javabean规范,自己动手写一个学生类吧。