Java 面向对象基础:类、对象、实例化与调用

发布时间:2026/9/12 19:36:58
Java 面向对象基础:类、对象、实例化与调用 摘要本文系统讲解 Java 面向对象编程的核心基础涵盖面向对象与面向过程的区别、类的创建与命名规范、类的实例化与成员变量默认值、对象调用成员方法、this 关键字的三种作用、构造方法及其重载、包的组织与导入、封装与四种访问限定符、static 静态成员的特点以及静态代码块、构造代码块、局部代码块和同步代码块的执行优先级。全文通过大量可运行的 Student 类代码示例帮助读者循序渐进地掌握 Java 面向对象的核心概念。一、面向对象与面向过程在开始学习类与对象之前先要理解什么是面向对象什么是面向过程。简单来说面向对象是指对象之间互相交互来完成一件事面向过程则是通过一系列函数或过程来解决问题。Java 是一门很纯正的面向对象的编程语言而平时写的代码如果只是自己实现某个功能往往属于面向过程的写法。二、类的创建类的概念类是对象的模板对象是类的实例。可以把类理解成一份设计图而对象是根据这份设计图实际制造出来的产品。类的命名规范在 Java 中类的创建使用class关键字。需要注意的是类的命名采用大驼峰UpperCamelCase方式书写即每个单词首字母大写例如Student、TestStudent。类的组成类里面包含成员变量和成员方法。成员变量用于描述对象的属性如姓名、年龄成员方法用于描述对象的行为如学习、跑步。成员变量和成员方法都分为两种一种是静态的使用static修饰一种是非静态的后面会专门讲到static关键字。代码示例下面是一个简短的 Java 类定义示例包含成员变量和成员方法// 定义一个学生类 public class Student { // 成员变量描述对象的属性 String name; // 姓名 int age; // 年龄 // 成员方法描述对象的行为 public void study() { System.out.println(name 正在学习); } }注意事项public修饰的类要和文件名相同并且一个 Java 文件只能有一个public修饰的类。三、类的实例化创建了类之后还需要通过实例化来真正得到一个对象一个类可以实例化出很多个对象。实例化的语法格式如下引用类型 引用名 new 引用类型();其中new关键字用于在内存中创建对象并把对象的地址赋值给引用变量。下面是一个简短的实例化示例演示如何创建Student对象public class TestStudent { public static void main(String[] args) { // 实例化根据 Student 类创建对象 Student stu new Student(); } }对于成员变量来说如果没有进行初始化会有一个对应的默认值默认值遵循如下规则成员变量类型默认值byte、short、int0long0Lfloat0.0fdouble0.0dchar\u0000空字符booleanfalse引用类型如 String、数组、对象null四、类的调用对象创建好之后就可以通过对象来调用类中的成员方法。调用格式为「对象名.方法名()」。下面是一个简短的调用示例演示如何通过对象调用成员方法public class TestStudent { public static void main(String[] args) { Student stu new Student(); stu.study(); // 调用成员方法 } }五、this 关键字this关键字用于指代当前对象本身。它最常见的用途是区分局部变量和成员变量当局部变量与成员变量名称相同时使用this可以明确指定访问的是成员变量从而避免歧义。this关键字目前阶段的三个作用访问成员变量调用成员方法调用构造方法下面是一个完整的代码示例展示this的两种常见用法在成员方法中调用另一个成员方法以及返回当前对象。public class Student { String name; int age; public Student(String name, int age) { this.name name; this.age age; } // 用法一在成员方法中调用另一个成员方法 public void study() { System.out.println(name 正在学习); this.rest(); // 调用另一个成员方法 rest() } public void rest() { System.out.println(name 正在休息); } // 用法二返回当前对象便于链式调用 public Student setAge(int age) { this.age age; return this; // 返回当前对象 } }在上面的示例中this.rest()演示了在成员方法中调用另一个成员方法return this演示了返回当前对象这样调用方就可以继续对同一个对象进行后续操作。六、构造方法构造方法是一种特殊的方法用于在创建对象时完成初始化工作。因为构造方法要和类的名称一致多个构造方法有点重载的意思。这里要记住一个原则构造方法救急不救穷。也就是说如果在实例化时没有显式定义任何构造方法Java 会自动提供一个无参的构造方法但一旦我们自己定义了带参数的构造方法那么在实例化时就必须传入与之对应的参数。构造方法按照顺序执行如果构造方法里面调用构造方法要注意调用的要执行。public class Student { String name; int age; // 带参构造方法自己定义了带参构造方法后Java 不再提供无参构造方法 public Student(String name, int age) { this.name name; this.age age; } } public class TestStudent { public static void main(String[] args) { // 必须传入与构造方法对应的参数否则编译报错 Student stu new Student(张三, 18); } }构造方法的特点方法名必须与类名完全相同。没有返回值类型也不能写void。创建对象时使用new会自动调用构造方法。如果没有显式定义构造方法编译器会提供一个无参的默认构造方法。下面是一个包含构造方法的示例public class Student { String name; int age; // 构造方法创建对象时自动调用用于初始化成员变量 public Student(String name, int age) { this.name name; // this 用于区分成员变量和参数 this.age age; } public void study() { System.out.println(name 正在学习); } }用this关键字可以调用本类的另外一个构造方法但这条调用语句必须写在构造方法的第一行。下面是一个简单的示例public class Student { String name; int age; // 无参构造方法通过 this 调用带参构造方法 public Student() { this(张三, 18); // 调用本类另一个构造方法必须写在第一行 } // 带参构造方法完成真正的初始化 public Student(String name, int age) { this.name name; this.age age; } }七、包什么是包Package包是 Java 中一种组织类的方式用于防止类名冲突和提高代码的可读性。包允许将类组织在一个层次结构中类似于文件系统中的目录。包的主要作用如下防止类名冲突不同包中可以有同名的类通过包名加以区分。便于管理把功能相近的类放在同一个包中让项目结构更清晰。控制访问权限配合访问修饰符可以控制类或成员的可见范围。创建包使用package关键字且该语句必须写在 Java 源文件的第一行。下面是一个简单的示例// 声明包必须写在文件第一行 package com.example.student; public class Student { String name; int age; public void study() { System.out.println(name 正在学习); } }使用其他包中的类时需要通过import关键字导入例如// 导入 com.example.student 包中的 Student 类 import com.example.student.Student; public class TestStudent { public static void main(String[] args) { Student stu new Student(); stu.study(); } }八、封装封装就是将类里面的成员变量和成员方法用private关键字修饰让外部无法直接改变里面的值而需要调用的时候通过写入set()和get()方法来进行调用封装在此就体现了代码的严谨和安全性。访问限定符访问修饰符用于控制类、成员变量和成员方法的可见范围。Java 中常用的访问限定符有四种public、protected、默认不写和private。它们的区别如下访问限定符同一包中同一类同一包中不同类不同包中的子类不同包中非子类public✓✓✓✓protected✓✓✓默认不写✓✓private✓简单来说public权限最大任何地方都能访问private权限最小只有本类内部能访问protected和默认权限介于两者之间区别在于protected允许不同包中的子类访问而默认权限不允许。九、static 关键字被static修饰的成员变量和成员方法叫做静态变量和静态方法。静态成员属于类本身是所有对象共享的在测试方法中需要使用类名直接调用不能用实例化的对象来调用。实例方法动态方法可以直接调用静态变量、静态方法以及实例变量、实例方法而静态方法只能调用静态的成员不能直接访问实例成员。下面是一个完整的代码示例展示静态变量和静态方法的定义与调用方式并对比静态方法不能直接访问实例成员的限制public class Student { // 静态变量属于类本身所有对象共享 static String school 清华大学; // 实例变量属于每个对象各自独立 String name; // 静态方法可以直接通过类名调用 public static void showSchool() { System.out.println(学校 school); // 错误静态方法不能直接访问实例变量 name // System.out.println(name); } // 实例方法可以访问静态成员也可以访问实例成员 public void showInfo() { System.out.println(姓名 name); System.out.println(学校 school); // 实例方法可以访问静态变量 } } public class TestStudent { public static void main(String[] args) { // 使用类名直接调用静态方法无需实例化 Student.showSchool(); // 使用类名直接访问静态变量 System.out.println(Student.school); // 实例方法需要通过对象来调用 Student stu new Student(); stu.name 张三; stu.showInfo(); } }静态成员的特点总结如下属于类本身静态变量和方法不依赖某个具体对象所有对象共享同一份静态变量。通过类名调用在外部使用「类名.静态成员」的方式访问无需先创建对象。加载时机早静态成员在类加载时就已经初始化早于对象的创建。访问限制静态方法只能直接访问静态成员不能直接访问实例成员实例方法则两者都可以访问。十、代码块代码块是用一对花括号{}括起来的一段代码。Java 中的代码块主要分为四种静态代码块、构造代码块实例代码块、局部代码块和同步代码块。我们通常写的main方法括号里面的代码本质上也是一个代码块。代码块之间存在执行优先级通常情况下静态代码块 构造代码块 构造方法 局部代码块。下面分别介绍这几种代码块静态代码块使用static {}定义在类加载时执行且只执行一次常用于初始化静态变量。构造代码块实例代码块直接写在类中、方法外的{}每次创建对象时都会在构造方法之前执行常用于初始化实例成员。局部代码块写在方法内部的{}用于限制局部变量的作用范围按代码顺序执行。同步代码块使用synchronized修饰的代码块用于多线程并发场景保证同一时刻只有一个线程访问共享资源。下面是一个完整的代码示例展示静态代码块、构造代码块、构造方法和局部代码块的执行顺序并在注释中标注输出结果public class Student { // 静态代码块类加载时执行只执行一次 static { System.out.println(1. 静态代码块); } // 构造代码块每次创建对象时在构造方法之前执行 { System.out.println(2. 构造代码块); } // 构造方法创建对象时执行 public Student() { System.out.println(3. 构造方法); } public void study() { // 局部代码块方法内部按顺序执行 { System.out.println(4. 局部代码块); } } } public class TestStudent { public static void main(String[] args) { Student stu new Student(); stu.study(); System.out.println(--- 再次创建对象 ---); Student stu2 new Student(); stu2.study(); } } /* 输出结果 静态代码块 构造代码块 构造方法 局部代码块 --- 再次创建对象 --- 构造代码块 构造方法 局部代码块 说明静态代码块只在类加载时执行一次因此第二次创建对象时不再输出 构造代码块每次创建对象都会在构造方法之前执行验证了 静态代码块 构造代码块 构造方法 局部代码块的优先级顺序。 */十一、总结与练习本文围绕 Java 面向对象的核心知识点展开下面用 8 条要点概括全文内容面向对象与面向过程的区别面向对象通过对象之间的交互来完成任务面向过程则通过一系列函数或过程来解决问题Java 是一门纯正的面向对象语言。类的创建类是对象的模板使用class关键字创建命名采用大驼峰一个 Java 文件只能有一个public修饰的类且类名要与文件名相同。类的实例化通过new关键字创建对象格式为「引用类型 引用名 new 引用类型()」成员变量未初始化时会得到对应类型的默认值。类的调用对象创建后通过「对象名.方法名()」的方式调用成员方法。this 关键字用于指代当前对象可以区分局部变量和成员变量、调用本类成员方法以及调用本类另一个构造方法必须写在第一行。构造方法方法名与类名相同、无返回值构造方法救急不救穷一旦自定义带参构造方法Java 就不再提供无参构造方法。包与封装包用于组织类、防止类名冲突封装通过private修饰成员配合set()和get()方法控制访问体现代码的严谨与安全。static 与代码块静态成员属于类本身通过类名调用代码块执行优先级为静态代码块 构造代码块 构造方法 局部代码块。练习题练习一定义一个带封装和静态变量的学生类定义一个Student类将成员变量name和age用private封装提供set()和get()方法再定义一个静态变量school和一个静态方法showSchool()在测试类中通过类名调用静态方法并设置学生信息。public class Student { // 静态变量属于类本身所有对象共享 static String school 清华大学; // 私有成员变量封装外部不能直接访问 private String name; private int age; // set 方法用于设置成员变量的值 public void setName(String name) { this.name name; } public void setAge(int age) { this.age age; } // get 方法用于获取成员变量的值 public String getName() { return name; } public int getAge() { return age; } // 静态方法通过类名直接调用 public static void showSchool() { System.out.println(学校 school); } } public class TestStudent { public static void main(String[] args) { // 通过类名直接调用静态方法无需实例化 Student.showSchool(); // 创建对象并通过 set 方法赋值 Student stu new Student(); stu.setName(张三); stu.setAge(18); // 通过 get 方法取值 System.out.println(姓名 stu.getName()); System.out.println(年龄 stu.getAge()); } } /* 运行结果 学校清华大学 姓名张三 年龄18 */练习二使用 this 实现链式调用定义一个Student类成员方法setName()和setAge()都返回this在测试类中通过链式调用一次性完成赋值并输出结果。public class Student { private String name; private int age; // 返回 this支持链式调用 public Student setName(String name) { this.name name; return this; } public Student setAge(int age) { this.age age; return this; } public void showInfo() { System.out.println(姓名 name 年龄 age); } } public class TestStudent { public static void main(String[] args) { // 链式调用连续调用多个方法 Student stu new Student(); stu.setName(李四).setAge(20).showInfo(); } } /* 运行结果 姓名李四年龄20 */练习三验证代码块的执行顺序定义一个Student类依次编写静态代码块、构造代码块、构造方法和局部代码块在测试类中创建两个对象并调用方法观察输出结果验证执行优先级。public class Student { // 静态代码块类加载时执行只执行一次 static { System.out.println(1. 静态代码块); } // 构造代码块每次创建对象时在构造方法之前执行 { System.out.println(2. 构造代码块); } // 构造方法创建对象时执行 public Student() { System.out.println(3. 构造方法); } public void study() { // 局部代码块方法内部按顺序执行 { System.out.println(4. 局部代码块); } } } public class TestStudent { public static void main(String[] args) { Student stu new Student(); stu.study(); System.out.println(--- 再次创建对象 ---); Student stu2 new Student(); stu2.study(); } } /* 运行结果 静态代码块 构造代码块 构造方法 局部代码块 --- 再次创建对象 --- 构造代码块 构造方法 局部代码块 说明静态代码块只在类加载时执行一次因此第二次创建对象时不再输出 构造代码块每次创建对象都会在构造方法之前执行验证了 静态代码块 构造代码块 构造方法 局部代码块的优先级顺序。 */