本文是《Java学习指南》原书的网络版,作者邵发,拥有本书的全部权利。相关视频课程在此查看。
目录
第6章 类
6.1 新建类
先给出一个引例。以下是两组学生的信息,要求用代码表示。
学号 | 姓名 | 性别 | 手机号 |
20171001 | 王草 | 男 | 18610022345 |
20171002 | 李花 | 女 | 13820490902 |
可以用Java代码表示如下,
// 第一个学生的信息
String id = "20171001";
String name = "王草";
boolean sex = true;
String cellphone = "18610022345";
// 第二个学生的信息
String id_2 = "20171002";
String name_2 = "李花";
boolean sex_2 = false;
String cellphone_2 = "13820490902";
显然,这样定义的话变量的个数就非常多。如果有30个学生,那么就得定义120个变量了,name_1 , name_2, name_3 ... 按照这样的命名方式,似乎不太科学。如果能有一个新的数据类型,专门来表示“学生”这种类型就好了!
6.1.1 类
类, class,在Java表示自定义的数据类型。一个class可以是若干基本数据类型的组合,通过新建class,可以表示自定义的类型。
例如,在Eclipse新建一个类 Student.java (按视频演示),其内容如下,
package my;
public class Student
{
public String id; // 学号
public String name; // 姓名
public boolean sex; // true: 男 false 女
public String cellphone; // 手机号
}
其中,
Student称为类的名称,一般以大写字母开头。
id, name, sex, cellphone则称为类的属性。和变量的命名规则相同。
直观的理解就是,Student表示学生类型,具有id, name, sex, cellphone四个属性。可以发现,属性可以是int, double, String , boolean 等基本类型。
注:关键字public的意思以后再讲,先抄下来即可,不会影响理解。
6.1.2 创建对象
在定义了类型之后,就可以创建该类型的对象。例如,
Student s1 = new Student();
s1.id = "20171001";
s1.name = "王草";
s1.sex = true;
s1.cellphone = "18610022345";
其中,
new Student() 表示创建一个Student类型的对象;
s1.id 表示对象s1的id属性,中间是一个点号
以上代码,是创建一个s1对象,并设置其四个属性的值。
6.1.3 类与对象
什么是类,什么是对象,现在应有一个初步的认识。其实并不复杂,类就是类型的意思,描述了一类事物的特性。而对象则是实际,表示具体的一个事件。
具体类型,“人类”是类,描述了一类事物。“小王”是对象,是一个具体的人。
用代码表示为,
Human someone = new Human();
someone.name = "小王";
其中,Human就是我们添加的一个类型(类似于Student类),而someone则是具体的一个对象。
6.1.4 常见错误
以下代码是初学者常犯的一个错误,例如,
Student.name = "小王"; // 错误!
这在逻辑上是说不通的,因为Student只是一个类型描述,你不能说“学生”的名字是小王,只能说某个学生的名字是小王。
正确的写法是,
Student stu = new Student(); // 先创建对象stu
stu.name = "小王"; // 再访问对象的属性
先创建对象,然后再访问对象的属性,这是大家要熟练掌握的写法。多写几遍,熟悉一下吧!
6.2 类的属性
类的属性 (Property),描述这个类里有什么。比如,对于一个Student,它应该有学号id 、姓名name等属性。代码如下,
public class Student
{
public String id;
public String name;
public boolean sex;
public String cellphone;
}
这里面就定义了4个属性,比如,属性sex的类型为boolean;属性cellphone的类型为String。实际上,类的属性可以int, double, String, boolean等我们学过的基本类型。
6.2.1 类的书写步骤
定义一个类,描述图书的信息。
每一本书都有:
书名 title String
作者 author String
出版社 press String
ISBN ISBN String
定价 price double
初学者在定义class时可能会感觉无从下手,其实这个并不困难,按以下的步骤即可:
① 先给类起一个名字
v 一般应以大写字母开头
v 要起有意义的名字,"aaa", "abcd123" 这样的毫无意义的名字是不妥的。名字应该能顾名思义,比如Movie可以表示电影,而ActionMovie可以表示动作电影。这样的名字可读性好,让人一眼就能知道它是什么意思。
② 再给类添加属性
v 属性名字一般以小写开头,如fontSize, lineHeight
v 属性的类型可仔细选择,可以选择int, double, String, boolean等我们学过的基本类型。
下面,我们新建一个类叫Book,内容如下,
public class Book
{
public String title;
public String author;
public String press;
public String ISBN;
public double price;
}
然后看一下怎么使用这个类。一般还是要创建一个对象,然后再访问类的属性。示例代码如下,
Book b = new Book();
b.title = "C/C++学习指南";
b.price = 49.0;
// 其他属性也可以设置一下 ...
6.2.2 编程世界里的类
在初学阶段,通常用自然界实际存在的物体来做示例。但我们需要知道,编程世界里的类,大多数不对应自然界的物体。
比如说,定义一个类,它能够把输入的数据压缩。
public class ZipTool
{
}
显然,这个ZipTool并不对应自然界中的东西
6.2.3 类的嵌套书写
实际上,一个类的属性可以是基本类型(int, double, String, boolean...),也可以是自定义的类型。
比如,每个学生,除了有学号、姓名、手机号等基本信息之外。还绑定了一个校园卡、一个银行账号。
首先,定义一个类StudentCards表示卡号信息,
public class StudentCards
{
public String schoolCardNumber;
public String bankCardNumber;
}
然后,在Student类中加入cards属性,
public class Student
{
public String id;
public String name;
public boolean sex;
public String cellphone;
public StudentCards cards = new StudentCards();
}
最后,创建对象并设置属性的值,
Student s1 = new Student();
s1.cards.schoolCardNumber = "T92830430";
s1.cards.bankCardNumber = "34989989289988290";
其中,s1.cards.bankCardNumber就表示访问s1的cards的bankCardNumber属性。
6.3 再说对象与引用
在上一章里已经初步介绍了对象和引用的概念。这一节课再加深一下印象。
观察以下代码,
Student s1 = new Student();
这一行的右侧创建了一个对象,而s1指向了这个对象。这就比如,右边生了一个宝宝,左侧给它取了一个名字。
Student s2 = s1;
这一行相当于给这个宝宝再起一个名字,一个乳名一个学名,并不过分。这两个名字指向的同一个宝宝。
s2.name = "邵发";
由于s1和s2指向的是同一个对象,所以修改s2.name,其实就是修改了s1.name。
6.3.1 空对象与空指针异常
如果一个引用指向null,其实是说它不指向任何对象。例如,
Student s1 = null;
s1.name = "邵发" ; // 出错!! NullPointerException
在这里,s1指向了null,所以试图访问s1.name是错误的。它本身就是个空,当然就不能访问它的属性啦!
6.4 属性的默认值
在Java语言里,每一种类型的对象都有其默认值,
v 整数类型(long int short byte):默认值为 0
v 小数类型(double float):默认值为 0.0
v boolean类型:默认值为 false
v 引用类型 (String, Student..) : 默认值为 null
v 数组类型:默认为null
看起来没有规律可循,但实际上可以告诉大家,其本质上都是零的意思。比如说,false和null本质上就是个0。
如果实在不能理解,或者不确定其默认值,那么我们在定义一个变量或属性的时候,可以显式的指定初始值。例如,
public class Student
{
public String id = "00000000";
public String name = "未命名";
public boolean sex = true;
public String cellphone = "";
}
如果是自定义的类型,那么可以new一个对象,例如,
public class Student
{
public String id = "00000000";
public String name = "未命名";
public boolean sex = true;
public String cellphone = "";
public StudentCards cards = new StudentCards ();
}
也可以后创建对象,例如,
Student stu = new Student();
stu.cards = new StudentCards ();
stu.cards.bankCardNumber = "239230923901234";
不管怎么写,我们都需要保证在访问stu.cards.bankCardNumber的时候,stu.cards不能为null,否则就会出NullPointerException错误了!