💬 欢迎讨论:如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区留言!我们一起学习、一起成长。 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏并分享给更多想了解 Java 编程的朋友! 🚀 继续学习之旅:今天,我们将深入探讨 Java 中的类和对象。这些是每个 Java 程序员必备的技能。
Java是一门纯面向对象的语言(Object Oriented Programming,简称OOP)。在面向对象的世界中,一切皆为对象。 面向对象是一种解决问题的思想,主要依靠对象之间的交互来完成任务。采用面向对象的编程方式,不仅符合人们对事物本质的认识,还极大地有助于大型程序的设计、扩展和维护。
面向过程强调程序的执行流程,注重将问题拆解成一系列的操作步骤,每一步骤都必须严格按顺序执行。例如,传统的洗衣服过程要求依次完成浸泡、搓洗、漂洗、甩干等操作,任何一步出错都可能导致整体流程无法正常进行。
而面向对象则更关注事物本身,通过对现实世界中对象的抽象,将事物的属性和行为封装在一个类中,借助对象之间的交互来完成复杂任务。以洗衣机为例,用户只需关心“放入衣物”、“添加洗衣粉”、“启动洗衣机”等接口,而无需了解内部的工作细节。这种方式使程序设计更加直观、灵活且易于维护。
注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。
类是用来对一个实体(对象)进行描述的。它主要描述该实体具有哪些属性(例如外观尺寸、颜色等)以及哪些功能(例如洗衣、烘干等)。完成对实体的抽象之后,计算机便能识别这种描述,从而在程序中使用该类创建实际对象。
上图左侧就是对洗衣机简单的描述,该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认知),但是这些简化的抽象结果计算机也不能识别,开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语言。
在Java中定义类时,需要使用关键字 class
。基本语法格式如下:
// 创建类的基本格式
class ClassName {
field; // 字段(属性)或成员变量
method; // 行为或成员方法
}
类中包含的内容统称为类的成员。
示例一:以洗衣机类为例的模板
class WashMachine {
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double length; // 长
public double width; // 宽
public double height; // 高
public String color; // 颜色
public void washClothes() { // 洗衣服功能
System.out.println("洗衣功能");
}
public void dryClothes() { // 脱水功能
System.out.println("脱水功能");
}
public void setTime() { // 定时功能
System.out.println("定时功能");
}
}
将洗衣机这一现实对象用Java语言描述后,经过 javac
编译生成 .class
文件,JVM便能识别并使用这个类。
注意事项:
public
修饰(后续会详细说明);static
关键字(后续会讲解其意义)。class PetDog {
public String name; // 狗的名字
public String color; // 狗的颜色
// 狗的属性描述
public void barks() {
System.out.println(name + ": 旺旺旺~~~");
}
// 狗的行为描述
public void wag() {
System.out.println(name + ": 摇尾巴~~~");
}
}
下面给出一个简单的学生类示例:
public class Student {
public String name;
public String gender;
public short age;
public double score;
public void DoClass() {
// 上课方法
}
public void DoHomework() {
// 做作业方法
}
public void Exam() {
// 考试方法
}
}
在定义类时需注意以下几点:
main
方法的类通常应使用 public
修饰(例如Eclipse默认在 public
修饰的类中查找 main
方法);public
修饰的类名必须与文件名相同;public
类的名称需谨慎。当我们使用 class
关键字定义了一个类,就相当于在计算机中定义了一种新的类型(如同 int
、double
等内置类型)。只不过 int
和 double
是 Java 语言自带的类型,而类是程序员自定义的类型。
有了这种新类型之后,就可以用它来创建对象(也称为类的实例)。用类类型创建对象的过程称为类的实例化,在 Java 中通过 new
关键字配合类名来完成。例如:
public class Student {
public String name;
public String gender;
public short age;
public double score;
public void DoClass() {}
public void DoHomework() {}
public void Exam() {}
public static void main(String[] args) {
// 通过 new 关键字实例化对象
Student s1 = new Student();
s1.name = "Li Lei";
s1.gender = "男";
s1.age = 18;
s1.score = 3.8;
Student s2 = new Student();
s2.name = "Han Meimei";
s2.gender = "女";
s2.age = 19;
s2.score = 4.0;
Student s3 = new Student();
s3.name = "Jim";
s3.gender = "男";
s3.age = 18;
s3.score = 2.6;
}
}
注意事项:
new
关键字用于创建对象的实例;.
号来访问对象的属性和方法;示例代码:
public class PetDog {
public String name;
public String color;
public void barks() {
System.out.println(name + ": 旺旺旺~~~");
}
public void wag() {
System.out.println(name + ": 摇尾巴~~~");
}
public static void main(String[] args) {
PetDog dog1 = new PetDog();
dog1.name = "阿黄";
dog1.color = "黑黄";
dog1.barks();
dog1.wag();
PetDog dog2 = new PetDog();
dog2.name = "赛虎";
dog2.color = "棕白";
dog2.barks();
dog2.wag();
}
}
执行结果:
阿黄: 旺旺旺~~~
阿黄: 摇尾巴~~~
赛虎: 旺旺旺~~~
赛虎: 摇尾巴~~~
先来看一个日期类的例子:
public class Date {
public int year;
public int month;
public int day;
public void setDay(int y, int m, int d) {
year = y;
month = m;
day = d;
}
public void printDate() {
System.out.println(year + "/" + month + "/" + day);
}
public static void main(String[] args) {
Date d1 = new Date();
Date d2 = new Date();
Date d3 = new Date();
d1.setDay(2020, 9, 15);
d2.setDay(2020, 9, 16);
d3.setDay(2020, 9, 17);
d1.printDate(); // 2020/9/15
d2.printDate(); // 2020/9/16
d3.printDate(); // 2020/9/17
}
}
这个代码能正常运行,但仔细思考时,会有两个疑问:
year
,month
,day
,那在 setDay
方法里写 year = year;
究竟是谁给谁赋值?d1
, d2
, d3
分别调用了 setDay
和 printDate
方法,而这两个方法中并没有任何“对象标识”的信息,它们是如何知道当前要修改或打印的是哪个对象的数据呢?为解决这两个疑惑,Java 提供了 this
引用。
this
引用指向“当前对象”,也就是“调用该成员方法的那个对象”。在成员方法中,对所有成员变量的访问,实际上都隐式地通过 this
引用完成,但对程序员是透明的。
示例:当我们写 year = y;
时,编译器底层会将其视作 this.year = y;
,其中 this
就是那个正在调用 setDay
方法的对象。
public void setDay(int year, int month, int day) {
// 此时如果写: year = year;
// 就会产生歧义. 下面使用this来指明是给当前对象的year赋值.
this.year = year;
this.month = month;
this.day = day;
}
this
的类型:与所在类相同,哪个对象在调用方法,this
就指向哪个对象;this
不存在于静态方法或其他语法结构中;this
指向另一个对象;this
是成员方法中的第一个“隐藏”参数:当对象调用成员方法时,编译器会自动将调用者对象的引用作为实参传给方法,方法体内的 this
则用于接收该引用。示例:
public class Date {
public int year;
public int month;
public int day;
public void setDay(int year, int month, int day) {
this.year = year; // this.year 表示“当前对象的 year”
this.month = month; // this.month 表示“当前对象的 month”
this.day = day; // this.day 表示“当前对象的 day”
}
public void printDate() {
System.out.println(this.year + "/" + this.month + "/" + this.day);
}
public static void main(String[] args) {
Date d = new Date();
d.setDay(2021, 6, 9);
d.printDate(); // 2021/6/9
}
}
class
关键字创建类,并在类中定义成员变量(属性)和成员方法(行为),为后续实例化提供模板。new
关键字和类名生成对象,每个对象都拥有独立的内存空间,用于存储自身的成员变量和方法。public
、private
等)保护对象内部数据,保证程序的安全性和可维护性。static
修饰符的作用以及静态成员变量、静态方法的特点;同时深入理解普通代码块、构造代码块和静态代码块在初始化中的应用。