Java 类与对象
“Sometimes we stare so long at a door that is closing that we see too late the one that is open.”
— Alexander Graham Bell, Inventor
「我们有时候专注于消失中的机会太久,以致于太晚发现开启的机会。」– 亚历山大‧贝尔 (发明家)
关卡说明
关卡描述:Java
是一门面向对象的语言,类
和对象
是 Java
中最重要的概念,本关将介绍这两个重要的概念,并通过一个简单的栗子来进行说明,你能否通过本关的考验呢?
过关条件:理解面向对象编程的特点,理解 Java
中类
和对象
的关系,以及如何使用它们
关卡难度:⭐️⭐️
面向对象程序设计
面向对象编程(Object Oriented Programming 简称OOP)是当今主流的程序设计规范,Java是完全面向对象的,所以必须熟悉++OOP++才能编写出优秀的Java代码。
面向对象编程,顾名思义,重点就在于这个对象,没有对象怎么编程(手动滑稽)。咳咳,言归正传,面向对象的程序是由许许多多的对象组成,每个对象具有一定的属性和行为,通过对象之间的交互来实现软件的功能。从根本上来说,只要这个对象能满足功能要求,就不必关心它的具体实现过程。换句话说,不管是黑猫白猫,能抓耗子的猫就是好猫。
传统的程序设计是面向过程编程,在传统的程序设计过程中,通常需要先设计一系列的算法来求解问题,然后再考虑存储数据的方式。这就是所谓的:
算法 + 数据结构 = 程序
在面向过程的设计中,算法是放在第一位的,数据结构是为了适应算法而存在的。
而在OOP中,这个顺序刚好相反,数据结构放在第一位,然后再考虑操作数据的算法。
两种开发方式各有利弊,一些简单的问题,使用面向过程的开发方式是比较容易的,因为它符合人们的惯常思考方式,先这样做,再那样做,最后得到一个什么样的结果。而面向对象的编程适合于解决更复杂的问题。比如实现一个网站也许需要1000个函数,这些过程可能会对一组全局的数据进行操作。如果采用面向对象的方式来设计,可能只需要大约100个类,每个类10个方法,而且大多数情况下,面向过程开发的代码中有很多设计是可以使用面向对象的方式简化和复用的。所以后者显然更容易掌握和维护,而且如果万一某个数据出了问题,在10个方法中排查总比在1000个函数中排查要容易得多。
Java中的类和对象
既然面向对象编程这么优秀,那么我们就来好好认识一下这其中的主人公——类和对象。
“类”是对具有相同属性的一系列事物的抽象,比如说,“人类”,描述的就是有“人”这个共同属性和行为的群体,普通的人都有两只手,两只脚等基本外貌特征,也具有说话,吃东西等能力,比如“轿车”描述的是有四个轮子,可以驾驶,可以载人的小型车辆,不管你是黑色的奔驰还是白色的宝马,都可以叫做轿车。
那么什么是对象呢?对象就是类的某个具体实例,就好比你和我都是“人类”的一个具体实例,所以我们都是“人类”的一个对象。你家车库里的那辆轿车(不管是奔驰还是大众),也是“轿车”的一个对象。
类是抽象的概念,是对具有共同特征的事物的抽象,而对象则是具体的概念,是指某一个具体的实例。
类可以看作是对象的模子,可以用它来生产任意多个对象。
类的定义
先来看一个小栗子,我们来定义一个人类:
public class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("开始吃饭...");
}
public void say(){
System.out.println("我叫" + name + ",我今年" + age + "岁");
}
}
这里我们定义了一个类,类的名字叫做Person
,它有两个属性,一个是name
,一个是age
。并且有三个方法,一个是构造函数,两个是Person的行为,吃饭和说话。
可以看到,定义类的时候,我们是这样的:
public class Person{
...
}
定义类的格式为:
[访问权限修饰符] + class + [类名]
其中访问权限修饰符用来表示类是否可以被外部类访问,public
是最宽松的访问权限,表示这个类可以被外部的类访问和使用。关于访问权限修饰符,后面还会有更详细的介绍。
class
是用来声明一个类的关键字。什么是关键字呢?可以理解为一种声明,就像武功招式一样,大都会有一个起手式。Java
中的关键字其实不多,常用的就更少,所以在之后的学习过程中慢慢掌握就好了,不用太担心。
关于类名,跟变量名一样,必须以字母开头,可以由字母、数字和下划线和$组成,但跟变量命名不同的是,Java中的类名规范通常使用大驼峰命名法,即每个单词的首字母都大写。比如:SmallCar、SecondhandBook。
类的组成
一个类主要由实例域和方法域组成,实例域由类的成员变量组成,上面的栗子中,Person类的实例域为:
private String name;
private int age;
这是Person类的两个成员变量,也叫Person类的属性,一个人有名字和年龄,在这里对应的两个属性就是name
和age
。
成员变量定义的规则为:
[访问修饰符] + [成员变量类型] + [变量名]
接下来是方法域,顾名思义便是由各种方法组成的。方法的定义规则为:
[访问修饰符] + [方法返回值类型] + [方法名]
public void eat(){
System.out.println("开始吃饭...");
}
public void say(){
System.out.println("我叫" + name + ",我今年" + age + "岁");
}
这里,void
表示当前方法无返回值。方法的命名跟变量的命名规则一样,也使用小驼峰命名法。需要注意的一点是,无论是类名、方法名还是变量名,都需要具有一定的意义,也就是要能够传达出它代表的含义,做到见名知义。像a1
、a2
这样的命名就尽量不要出现。
也许你会好奇,上面不是还有一个方法吗?为什看起来有点奇怪呢?为什么它不使用小驼峰,为什么它跟类名是一样的?
public Person(String name, int age){
this.name = name;
this.age = age;
}
这是一个好问题,它叫做构造函数,是创建变量时使用的一个特殊的方法,与类名同名。这个方法有两个参数,一个是String
类型,一个是int
类型,name
和age
是参数名,跟变量名类似。这里面还用了一个this
关键字,代表当前对象,可以看到参数名跟上面的成员变量名相同,为了将它们区分开来,就使用了this.name
和this.age
来表示成员变量。这个方法的作用就是接收传进来的两个参数,并将它们分别赋值给成员变量。关于构造函数的具体作用会在之后的篇章里做说明,这里就先不详细介绍了。
对象的创建和使用
既然已经有了类,那么如何创建对象呢?这时候就需要使用新的招式——new
关键字。下面我们在Person类中加入一个main方法(如果不记得main方法是干嘛的了,可以翻看一下上一篇的内容),并在其中创建一个Person对象并调用它的方法。
public class Person {
...
public static void main(String[] args){
Person alice = new Person("Alice", 18);
alice.say();
alice.eat();
}
}
输出如下:
我叫Alice,我今年18岁
开始吃饭...
老规矩,我们来逐行分析,首先我们使用了new
关键字创建了一个对象:
Person alice = new Person("Alice", 18);
在前面我们已经介绍过变量的声明方式了,回顾一下:
[类名] + [变量名]
Person是类名,alice是变量的名字,后面半段的作用是创建对象。往里面传了两个参数:Alice
和18
。创建好对象后,赋值给alice变量。
然后我们分别调用了两个方法,say
和eat
。方法调用的格式为:
[对象] + 点号 + [方法名] + [参数]
alice.say();
alice.eat();
这两个方法都不需要传参数,可以直接调用。这样,我们就完成了创建对象并调用的全过程。
小结
本篇文章到此就告一段落了,本篇内容相对较多一点,而且也是相当重要的一篇,希望能仔细阅读,能通过本篇的学习了解类和对象是什么,以及如何使用。
也许到这里你还有很多疑惑,但没有关系,在之后的学习和练习的过程中,相信你会慢慢理解的。