一、概念浅析
说到类和对象,这都是两个比较抽象的词,如果用在程序中,那就更不知道是什么意思了。其实大家可以先不联系程序,我们在对一大堆东西分类的时候自然是有一个标准的,符合某些特征的分到一类,符合另外一些特征的分到另外一类。在每个类别中,每一样东西都有相同的特征,但是又有所差别,每一样东西就好比一个一个的对象,是一个切切实实的东西,而分类的类别就好似是一个标准或者描述,会更抽象一些。
1. 类的概念
在编程中,我们通常会借助程序去实现很多应用系统,来满足日常生活中的需要,如网络购物、人力资源管理等等。如果使用面向对象来开发,首先需要做的就是明确这个应用系统当中有哪些角色,这些角色都能够使用哪些功能,每种角色都有哪些自己的特征。
我们以一个教学管理系统为例,主要的功能就是进行排课,记录学生和教师的基本信息,记录和统计学生的学习成绩等。那这其中主要就涉及学生、教师、管理员三种角色,当有一批学生入学时,我们要将学生的信息录入系统,这就好像我们一直在填的各种表格,每个学生需要采集的信息都是固定的,不同的是信息的内容。
这就好比我们定义了一个学生类,我们想要收集的学生信息就是对这个类别的描述,学生有学号、有院系、有其他的基本信息,这也是学生的固有特征,于是我们可以用如下的代码描述:
// 用于描述学生的类 public class Student{ String sno;// 学号 String name;// 姓名 String college;// 学院 String major;// 专业 ... }
2. 什么是对象
理解了程序中类的概念和表示方式后,对象就比较好理解了。简单来说对象就是按照类的标准创建出来的一个具体可以操作的东西,也就是一个个具体的学生。每个学生都具备相同的特征,但是可以有不同的姓名、学院、专业等自己的信息。在程序运行时的体现就是内存中开辟了对应的空间,想要创建一个新的对象使用如下的代码:
public class Test{ public static void main(String[] args){ // 变量类型 变量名称 = new 类的构造器(); Student student = new Student(); // 大写的Student就是我们要使用的学生类型,名称必须完全一致 // 小写的student就是由学生类创建出来的对象的名称 // 也是我们操作对象时直接使用的名称 // new是用来创建对象的关键字,需要调用相应的构造器 // 有关于构造器的用法会在后续文章详细说明,初学可以记忆为:类名(); } }
3. 类和对象的关系
从上面的例子中我们已经可以看到,类相当于是一个模板或是像工厂的图纸,对象则相当于按照这个标准和模具创造出来的个体,每一个对象都具备相同的特征。
在程序中的体现就是,使用class关键字定义一个类结构,然后在这个结构中对整个类进行描述,都具备哪些属性,都可以产生行为,但是只有具体的对象可以具备具体的属性值和产生具体的行为(有关于静态的声明将在另外的文章中单独说明)。
二、类
我们应该如何描述和定义一个类呢?我们最开始写的HelloWorld不也是一个类嘛?为什么没这么多乱七八糟的概念?下面我们就来进一步解析。
从客观世界的角度出发,比如小明上了大学,这就是一个具体的学生,他有学号、姓名、对应的学院、专业等等,这都是他个人的基本信息,除此之外,他还可以进行多种活动,比如选课、考试、修改自己的部分信息等等。
那么我们从程序的角度出发,应该如何定义一个类呢?这取决于我们的需要,对于一个教学管理系统来说,我们关心的只是和学生学习相关的信息,学生能够选课、考试等等。对于一个后勤管理系统来说,我们关心的则是学生的饭卡消费情况,出入宿舍的时间,学生能够充值、消费、刷卡等等。所以如何定义和描述一个类,取决于我们的应用系统需要,或者是题目的要求。
1. 属性
属性指的就是所描述的类当前的状态,也就是他自己的一些信息,直接在类下进行定义,和正常声明一个变量的格式相同,可以不指定初始值。
2. 行为
行为指的就是当前这个类所创建出的对象都能进行什么样的行为,在程序上的表现就是方法,可以被具体的对象来进行调用,在方法体中用代码实现具体的功能。
// 用于描述学生的类 public class Student{ // 学生类的属性 String sno;// 学号 String name;// 姓名 String college;// 学院 String major;// 专业 ... // 学生类的行为 public void study(){ // 去学习 System.out.println("去上课"); } public void exam(){ // 去考试 System.out.println("去考试"); } }
3. 可执行类
在通常情况下,我们定义的一个类由四大部分构成:属性、行为、构造器以及其他继承Object的方法。也就是说都不存在可以直接执行的main方法,而只是为了定义一个我们想要使用的类,那么怎么样才能调用到,把我们的类用起来呢?就是通过那些具备main方法的类,如最初我们使用的HelloWorld,这就是一个最简形式的可执行类。
public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); } }
当然,我们也可以直接在类中添加main方法来测试运行,但是一般不会这样做,因为会有一些权限的问题不能够测试完整,通常的办法是新建一个单独的测试类,来进行调用测试。
// 调用时需要将两个类放在同一目录下(同一包中) public class Test{ public static void main(String[] args){ // 创建一个学生对象 Student student = new Student(); // 为对象的属性赋值 student.sno = "1130050152"; student.name = "小明"; student.college = "数学科学学院"; student.major = "信息与计算科学"; // 显示对象的属性值 System.out.println("该学生的名字是:" + student.name); // 通过对象调用方法,发生行为 student.study(); student.exam(); } }
三、对象
通过上面我们已经知道对象的概念,以及如何使用创建和使用一个对象。接下来我们再来明确一下类和对象,对象和对象之间的关系。
1. 对象是类的实例
创建对象的过程也可以被称之为实例化,对象也可以被叫做类的实例。这个概念也很好理解,在类中只是定义了一系列的描述信息,真正去执行需要靠具体的对象,以一个类为基准,可以创建出很多对象。
2. 对象和对象之间的关系
对象与对象之间存在共同点,除了使用静态声明的属性外,是不会互相影响的,这是一个很重要的特点。当我们使用不同的对象去调用方法和输出属性信息时,虽然类当中的结构完全一致,但是由于对象所处的状态(属性值)可能不同,那么方法执行的结果也会不同。
// 用于描述学生的类 public class Student{ // 学生类的属性 String sno;// 学号 String name;// 姓名 double balance;// 余额 ... // 学生类的行为 public void recharge(double money){ // 对学生卡充值 balance += money; System.out.println("当前余额为" + balance); } public void getBalance(){ // 显示卡内余额 System.out.println("当前余额为" + balance); } }
// 测试类:将两个类放在同一目录下(同一包中) public class Test{ public static void main(String[] args){ // 创建第一个学生对象 Student student1 = new Student(); // 为对象的属性赋值 student1.balance = 23.70; // 调用方法 student1.getBalance(); student1.recharge(100.0); // 创建第二个学生对象 Student student2 = new Student(); // 为对象的属性赋值 student2.balance = 15.60; // 调用方法 student2.getBalance(); student2.recharge(50.0); } }
程序执行完毕后可以再次输出查看两个对象的属性值,不会互相影响。