文章目录
类和对象(上)
💬 欢迎讨论:如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区留言!我们一起学习、一起成长。
👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏并分享给更多想了解 Java 编程的朋友!
🚀 继续学习之旅:今天,我们将深入探讨 Java 中的类和对象。这些是每个 Java 程序员必备的技能。
一、面向对象的初步认知
1.1 什么是面向对象
Java是一门纯面向对象的语言(Object Oriented Programming,简称OOP)。在面向对象的世界中,一切皆为对象。
面向对象是一种解决问题的思想,主要依靠对象之间的交互来完成任务。采用面向对象的编程方式,不仅符合人们对事物本质的认识,还极大地有助于大型程序的设计、扩展和维护。
1.2 面向对象与面向过程
面向过程强调程序的执行流程,注重将问题拆解成一系列的操作步骤,每一步骤都必须严格按顺序执行。例如,传统的洗衣服过程要求依次完成浸泡、搓洗、漂洗、甩干等操作,任何一步出错都可能导致整体流程无法正常进行。
而面向对象则更关注事物本身,通过对现实世界中对象的抽象,将事物的属性和行为封装在一个类中,借助对象之间的交互来完成复杂任务。以洗衣机为例,用户只需关心“放入衣物”、“添加洗衣粉”、“启动洗衣机”等接口,而无需了解内部的工作细节。这种方式使程序设计更加直观、灵活且易于维护。
注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。
二、类定义和使用
2.1 简单认识类
类是用来对一个实体(对象)进行描述的。它主要描述该实体具有哪些属性(例如外观尺寸、颜色等)以及哪些功能(例如洗衣、烘干等)。完成对实体的抽象之后,计算机便能识别这种描述,从而在程序中使用该类创建实际对象。
上图左侧就是对洗衣机简单的描述,该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认知),但是这些简化的抽象结果计算机也不能识别,开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语言。
2.2 类的定义格式
在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
关键字(后续会讲解其意义)。
2.3 小练习
2.3.1 定义一个狗类
class PetDog {
public String name; // 狗的名字
public String color; // 狗的颜色
// 狗的属性描述
public void barks() {
System.out.println(name + ": 旺旺旺~~~");
}
// 狗的行为描述
public void wag() {
System.out.println(name + ": 摇尾巴~~~");
}
}
2.3.2 定义一个学生类
下面给出一个简单的学生类示例:
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
类的名称需谨慎。
三、类的实例化
3.1 什么是实例化
当我们使用 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
关键字用于创建对象的实例;- 使用
.
号来访问对象的属性和方法; - 同一个类可以创建多个对象,每个对象独立占用内存空间,存储各自的成员变量。
3.2 类和对象的说明
- 类 只是一个“模型”或“蓝图”,用来描述对象应该包含哪些成员变量和成员方法;它本身并不直接占用实际的存储空间。
- 对象 是类的实例化结果,才真正占用物理空间,可以用来存储数据,也能执行方法。
- 同一个类可以实例化出多个对象,对象之间的成员变量互不影响。
- 类比:类就像“建筑设计图”,对象就像“根据设计图建造出来的房子”。设计图只有一份,但可以建造出很多房子,每个房子都有自己的空间和家具。
示例代码:
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();
}
}
执行结果:
阿黄: 旺旺旺~~~
阿黄: 摇尾巴~~~
赛虎: 旺旺旺~~~
赛虎: 摇尾巴~~~
四、this引用
4.1 为什么要有 this 引用
先来看一个日期类的例子:
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
引用。
4.2 什么是 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;
}
4.3 this 引用的特性
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
}
}
五、总结与展望
5.1 总结
- 面向对象思想:通过对现实事物的抽象,利用类来描述其属性和行为,并通过实例化对象进行具体操作。这种方法比面向过程更能体现人们对事物本质的认知,特别适合大型程序的设计和维护。
- 类的定义与使用:使用
class
关键字创建类,并在类中定义成员变量(属性)和成员方法(行为),为后续实例化提供模板。 - 对象的实例化:通过
new
关键字和类名生成对象,每个对象都拥有独立的内存空间,用于存储自身的成员变量和方法。 - this 引用:在成员方法中用于指代“当前对象”,可以有效避免形参与成员变量重名带来的歧义,并在方法内部显式访问或修改当前对象的属性。
5.2 展望
- 对象的构造与初始化:了解构造方法、默认初始化、就地初始化等机制,掌握对象在创建时如何完成初始赋值。
- 封装与访问控制:通过访问限定符(如
public
、private
等)保护对象内部数据,保证程序的安全性和可维护性。 - 静态成员与代码块:学习
static
修饰符的作用以及静态成员变量、静态方法的特点;同时深入理解普通代码块、构造代码块和静态代码块在初始化中的应用。 - 内部类:探索在类中定义类的高级用法,包括实例内部类、静态内部类、局部内部类和匿名内部类的语法和应用场景。
通过本篇的学习,我们已经打下了面向对象编程的基础。后续内容将进一步扩展和深入,让你在编写 Java 程序时更加得心应手。若有任何疑问,欢迎在评论区留言交流,让我们一起学习、共同进步!
以上就是关于【Java篇】无形至有形,法与道的编织:类与对象初探啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️