第四章.类、对象和包

一、对象写一个主过程来启动程序流程,随后根据程序流程走向,调用想要的其它过程。这种类型的程序设计被称为结构化编程。现在有很多结构化编程语言被广泛使用,最突出的就是C语言。
在结构化编程中,程序围绕着要解决的任务来设计。编写程序就是编写执行特定任务的过程,过程中需要用到的数据通过过程参数传递到过程中。过程可以查看以及改变传递进来的数据,并可以将值返回给调用它的过程。
20世纪70年代以后,面向对象编程(Object Oriented Programming,简称OOP)开始流行。OOP采用了一种完全不同的方法来开发计算机应用程序。在这种方法中,程序不是围绕着要解决的任务来设计,而是围绕着要解决的问题中的对象来设计。对于每个对象,我们会编写一个类来描述对象的属性和行为。类是对象的描述。同样,对象是类的实例。对象由属性和行为组成。属性是对象所具有的特征,而行为是对象可以做的动作。对象的每个属性被表示为类中的一个成员变量。对象的每个行为成为类中的一个方法。
二.类
Java中的类用关键字class声明。Java源代码文件中只能包含一公用(public)类,文件名必须与公用类的类名相同,文件扩展名为“.java”。
在一个.java文件中我们可以声明多个类,但是只有一个类可以为声明为public。源代码文件的文件名必须与公用类的类名匹配。如果在源代码文件中没有公用类,文件名可以是任意的。
一个类的成员变量和方法出现在类声明的大括号中。下面的代码展示了一个还没有声明成员变量以及方法的简单类,其文件名为Employee.java:
public class Employee {

}
4.2.1 向类中添加成员变量
对象的属性成为相关类中的成员变量。类中的一个成员变量由如下部分组成:
 访问修饰符。可以是public、private或protected;如果省略了访问修饰符,将使用默认访问修饰符。
 数据类型。
 成员变量名称。成员变量名称必须是一个有效的标识符,后面用分号结束。
关于访问修饰符,我们将在后面章节中详细讨论。在这里,我们都用public访问修饰符。必须记住的是,如果我们在类中对某个成员变量或方法指定public修饰符,那么该成员变量或方法将可以被任何其它对象访问。
如下的类Employee有五个成员变量:name、address、number、SSN和salary。当一个Employee对象在内存中初始化时,系统会为这五个成员变量分配内存:
public class Employee {
public String name; //姓名
public String address; //邮寄地址
public int number; //员工号
public int SSN; //社保号
public double salary; //员工的工资
}
必须记住:类描述对象看起来是什么。Employee类用于描述公司中的员工。Employee类中出现的成员变量代表需要计算报酬的员工的信息。
例如,一个员工有姓名和地址,所以Employee类就有一个name成员变量和一个address成员变量。
每个员工还有其它的属性,例如,身高、体重等等。但是,这些程序与计算工资的示例程序无关,所以我们不会将这些属性包含进来。如果我们要将员工类用于其它用途,那么它可能就与现在的类有很大区别。
类的方法;
向类中添加方法
一个对象的行为成为相关类中的方法。类中的一个方法典型地由如下部分组成:
 访问修饰符
 返回值
 方法名称,必须是一个有效的标识符
 参数列表,在括号中出现
 方法的定义
实例化对象:在Java中,new关键字用于实例化一个对象。new运算符在内存中创建一个对象,并返回对新创建的对象的一个引用。只要我们的程序保留对该对象的一个引用,那么这个对象将一直保留在内存中。
下面的语句声明了一个Employee引用,并使用new关键字将该引用赋值给一个新的Employee对象:
Employee e;
e = new Employee();
引用e指向内存中的Employee对象。运算符new为该对象分配内存,然后将该对象的所有成员变量赋以初始值,这样,这些成员变量就不会包含垃圾数据。
表4-1列出了各种数据类型的成员变量的初始值。
表4-1一个对象的成员变量的初始值
成员变量的数据类型 初始值
byte 0
short 0
int 0
long 0
float 0.0
double 0.0
char 空字符
boolean false
任何类型的引用 null
实例化对象的两条语句可以合并为一条语句来实现。例如:
Employee e = new Employee();
这里我们之所以要分开为两条语句,是为了重点强调在实例化时实际上在内存中创建了两个实体:一个引用和一个对象。在两条语句的第一条语句中,e被声明为对一个Employee对象的引用,意思是e可以引用任何Employee对象。而第二条语句中,e被赋值了一个新的Employee对象。
引用:一个引用通常是一个包含它引用的对象的内存地址的32位整型值。这里说“通常”,是因为Java语言规范中没有严格定义一个引用的大小。在将来,引用可能会是64位或更大。同样,如果用在更小的电子设备中的操作系统中,引用可能比32位小。
引用本质上是整型。那么,为什么要将引用声明为一个特定的数据类型呢?这是因为Java中数据类型是严格强制的,一个引用必须是某种特殊的类数据类型。
方法必须与某个对象关联: e1.mailCheck();
访问对象的属性和方法:当我们使用new关键字实例化一个对象时,系统为会该类中的每个成员变量和方法分配内存。如果要访问该对象的成员变量和方法,就需要使用点运算符来。
this引用:每个对象可以使用this关键字引用它本身。如果一个类的方法需要访问该类本身的成员变量或其它方法,就应该使用this引用。
注意,我们在salary成员变量加上了一个this引用和点运算符作为前缀。如果我们没有显式地添加this引用,那么编译器就会自动为我们添加上。
我们可以将this应用作为参数给一个方法,通过这种方式,一个对象可以将它本身的引用传给其它对象。
包:
在项目开发中,我们通常会编写数目众多的类。如果不对这些类进行分门别类的使用和存放,就像我们不使用文件夹去管理众多的文件一样,在使用时会很困难和不方便,也很容易出现类的命名冲突问题。Java通过引入包(package)的机制,以解决这两个问题。
在Java中,每个类属于一个包。包有两个基本的用途:
 提供了一个组织类的机制;
 为包中的类提供了一个命名空间。
在开发Java程序时,我们经常会把一些类集中放在一个包中。例如,在Java SE中,用于执行输入和输出的类放在java.io和java.nio包中,Java语言的基础类放在java.lang包中,用于网络和套接字的类放在java.net包中,用于创建图形用户界面应用程序的类放在java.awt、javax.swing以及其它包中。我们可以继续举出很多这样的例子出来,因为Java SE中包含有多达100多个包。
既然每一个类都在一个包中,那么本书前面所写的所有类都放在哪个包中呢?在Java中,通过使用关键字package,可以将一个类声明在一个包中,但是我们至今还没有这样做。如果我们不显式地将一个类声明在一个包中,那么这个类就属于默认包。默认包包含了所有不用package关键字声明的Java类。
将类放在默认包中并不会出现任何问题。但是,如果要为一个真实的应用程序编写一个Java类,我们就应该将类声明在一个包中。包是Java语言中很基础但是很重要的一个部分。
将类放在包中到底有什么好处呢?在Java中,包不仅仅是组织类的一种机制,更重要的一个特色是包所创建的命名空间。例如,假如我们编写的小程序已经包含了一个名为Employee的类,如果我们又要编写一个名为Employee的类该怎么办?我们如何将二者区分呢?一种做法是将类名改变为诸如Employee1和Employee2。但是,如果改写类名,我们就不得不重写和重新编译很多代码。有了包后,我们就不需要担心这个了。如果两个Employee类在不同的包中,那么我们的Java程序就可以区分两个Employee类。下面,我们首先演示如何创建包并将类放在包中,然后再讨论包的命名空间的功能。
4.6.1 将类添加到包中
在创建类时,使用关键字package就可以将类添加到包中。包声明必须是源代码文件中除注释以外的第一条语句。
在这里插入图片描述
包创建的命名空间
包为所有类创建了一个命名空间。如果类在一个包含中,那么包名就成为类名的一部分,包名作为类名的前缀,用点运算符分隔。
包目录结构
将类放在一个包中时,出现两个主要的结果:
 包名成为类名的一部分。
 包名必须与相关字节码存放的目录一致。
换句话说,包名会影响字节码存放的位置。
所需的文件结构可以用两种方式创建:
 我们可以手动创建目录,并将*.java文件保存在与*.class文件相同的目录中。然后,就可以按照常用的方式编译*.java文件,而编译产生的*.class文件都会放在*.java文件相同目录中。
 在编译时,使用javac编译器的-d标志,来指定字节码的输出目录。如果所需的包目录不存在,-d标记会创建目录,并将*.class文件放在恰当的文件夹。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值