Java SE中的类与对象基础
1. 面向对象初步理解
1.1 什么是面向对象
Java是一门纯面向对象语言(Object Oriented Programming,简写为OOP),在OOP的世界中,一切皆被视为对象。面向对象是一种以对象间协同工作来解决问题的编程思想,它更符合人类对现实世界的认知模式,对于大型软件的设计、扩展和维护具有明显优势。
1.2 面向对象 vs 面向过程
- 面向过程:关注操作步骤和流程
- 面向对象:关注对象本身——寻找对象、创建对象、使用对象完成交互
2. 类的定义与使用
2.1 类与对象的关系
类是对某一类对象的抽象描述,而对象是类的具体实例。类定义了对象的结构和行为。
2.2 类的定义格式
// 定义类
class ClassName{
field; // 字段(属性)或成员变量
method; // 方法(行为)或成员方法
}
建议每个Java文件只定义一个类,以提高可维护性。
3. 类的实例化
3.1 实例化概念
从类创建对象的过程称为实例化。
Dog dog = new Dog();
关键字 new 用于创建对象实例,使用 . 操作符访问对象属性和方法。同一个类可以实例化多个对象。
class Dog{
public String name; // 成员变量
public int age; // 成员变量(默认初始化为0)
public void eat(){
System.out.println(name + " 正在吃东西");
}
}
成员变量遵循默认初始化规则:引用类型为 null,基本类型为其默认值(如 int 为 0)。通过对象引用可访问成员变量和方法。
4. this 引用
4.1 为何需要 this
当多个对象调用同一个方法时,可能出现形参与成员变量同名的情况。this 引用指向当前对象,用于解决命名冲突。
this 代表当前对象的引用。哪个对象调用了方法,this 就指向哪个对象。
4.2 this 的特性与用法
- this 的类型与当前类类型一致,它指向调用该方法的对象
- this 只能在成员方法中使用
- this 只能引用当前对象,不能引用其他对象
- this 是成员方法的一个隐藏参数,编译器自动传递
底层实现等价于:public void setDate(Date this, int year, int month, int day) { ... }
this 的主要用途:访问当前对象的成员变量、调用非静态成员方法、调用其他构造方法。
5. 对象的构造与初始化
5.1 构造方法
5.1.1 概念
构造方法(构造器)是一种特殊方法,其名称必须与类名相同。在创建对象时由编译器自动调用,且在对象生命周期内只执行一次。
5.1.2 语法
方法名() {
// 初始化逻辑
}
public class Date {
public int year;
public int month;
public int day;
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
System.out.println("构造方法被调用");
}
public void printDate() {
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date d = new Date(2021, 6, 9); // 自动调用构造方法
d.printDate();
}
}
注意事项:
- 构造方法主要用于初始化对象
- 一个类可以定义多个构造方法(重载)
- 若未显式定义构造方法,Java会提供默认无参构造;一旦自定义,默认构造不再提供
- 构造方法可以重载
- 可使用
this(...)调用其他构造方法,但必须放在第一行,且不能形成循环调用
6. 封装
6.1 封装的概念
封装是面向对象三大特性之一(封装、继承、多态)。它通过隐藏内部实现细节,只对外暴露必要的接口,提高模块的安全性和可维护性。例如计算机用户只需知道如何开关和输入,而不需要了解CPU、内存等内部工作原理。
6.2 访问限定符
Java提供多种访问权限控制:public、protected、private 和默认(包权限)。通过合理使用限定符,可以实现数据的封装。
6.3 包的概念
包类似于文件系统中的文件夹,用于组织和管理类。使用 import java.util.*; 导入包中类,也可以自定义包。常用包包括:
java.lang:基础类(String、Object等),自动导入java.lang.reflect:反射编程java.net:网络编程java.sql:数据库支持java.util:工具类(集合等)java.io:输入输出
7. static 成员
static 修饰的成员变量被称为静态成员变量,它不属于某个具体对象,而是被所有对象共享。静态成员可以直接通过类名访问,无需依赖对象引用。
static 修饰的成员方法被称作静态成员方法,它属于类而非特定对象。静态方法通常用来访问静态成员。
- 非静态方法可以直接调用静态方法,反之不可——静态方法中必须通过
new创建对象才能访问非静态成员 - 静态方法中不能使用
this关键字
8. 代码块
静态成员变量的初始化方式包括:就地初始化、通过 getter/setter、构造方法以及代码块。代码块分为:
- 静态代码块:在类加载时执行一次
- 非静态代码块(实例代码块/构造代码块):每次创建对象时执行
执行顺序为:静态代码块 → 实例代码块 → 构造方法。静态代码块仅执行一次。
9. 对象的打印
通过重写 toString() 方法,可以自定义对象的字符串表示,便于调试和输出。
public class Person {
String name;
String gender;
int age;
public Person(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
@Override
public String toString() {
return "[" + name + "," + gender + "," + age + "]";
}
public static void main(String[] args) {
Person person = new Person("Jim", "男", 18);
System.out.println(person);
}
}