2.2 Java类
在现实世界中,属于同一类的对象很多,例如一辆普通的自行车仅仅只是世界上许许多多各式各样自行车类中的一辆。在面向对象程序设计中,同样会遇到很多共享相同特征的不同的对象,利用这些对象的相同特征可以为它们建立一个蓝图,类似于建造房屋前所需绘制的图纸。对象的软件蓝图则被称为类,类是面向对象编程的灵魂。
2.2.1 Java类的定义
类(class)是面向对象编程模型的象征,是定义同一类对象的变量和方法的蓝图或原型。而对象是一个具体的事物,一个类定义了对象的一个种类,一个对象则是一个类中的实例。多个对象常常具有一些共同性,于是可以抽象出一类对象的共性,这就是类。
类中定义一类对象共有的变量和方法,把一个类实例化就生成了该类的一个对象,通过类的定义可以实现代码的复用,而不用去描述每一个对象。通过创建类的一个实例创建该类的一个对象,这样就简化了软件的设计。例如,建立一个包含实例变量(在类内声明的变量)的人-机交互对话框窗口类,这个类同时也定义和提供了实例方法的实现,实例变量的值由窗口类的每个实例提供,因此,当创建窗口类以后,需要在使用之前对它进行实例化(初始化)。当计算机系统创建类的实例(一个特定的对象),即为这个类建立它的所有类变量的复制或者建立类型的对象时,系统也就为类定义的实例变量分配了内存,同时实现了调用对象实例方法的一些功能。
类声明语句使用的语法格式为:
声明一个类是由Java关键字class实现的,className是类的名称,class关键字前可以选择使用类修饰符,用于修饰类的属性,类名后可以选择使用extends(类继承)和implements(实现接口)Java关键字,实现类继承等。
类名为className的类用大括号{}标识它的作用域,在大括号{}的内容都属于className类,类的内容有两部分:数据和操作,即
数据是在类中定义的常量和变量,操作是在类中定义的方法method,类是由量和方法组成的,对应于面向对象编程,数据为对象的属性,操作为对象的行为。
Java类的编写规则体现了Java语言体系的封装性,除package和import两条Java语句外,Java语言程序的所有关键字、变量定义、表达式、程序流控制语句等任何程序代码都不允许编写在Java类“{}”规定的区域外,即所有程序代码应编写在类的作用域中。
类中定义的变量类型可以是Java的任意数据类型,包括基本数据类型、数组、类等,在一个类中,一个变量的名字是唯一的,类中的变量被称为类的成员变量,其作用域为整个类。
类中定义的方法内部也可以定义变量,方法内部的变量被称为局部变量,其作用域在方法的大括号{}内部,方法体的输入变量其作用域也是在方法体内。
在同一个范围内(同属一个“{}”内)不能定义两个相同名字的变量,但是类成员变量的名字可以和类中某个方法的名字相同,也可以和局部变量的名字相同。
类中定义的方法是描述对象的行为的,即对象的所有操作都是由方法实现的,因此,在类中除变量、常量的定义外,表达式、程序流控制等语句都应该编写在方法体内。
【示例2-1】 定义一个描述动物的类,只描述动物的名称和种类,其中包括定义的变量以及操作设置和获取动物名称和种类的方法。
2.2.2 方法的定义
在Java语言程序中的操作对象行为的模块被称为方法,方法等同于其他语言中的函数,是作用于对象上的操作。它是在类或接口中声明的,但是,方法只能在类中实现,在Java程序中,所有使用者定义的操作都是用方法实现的。
方法允许程序设计者模块化一个程序,用方法模块化一个程序可使得程序开发更好管理以及开发出的软件可以重复利用,同时也会避免程序中的重复代码。
一个方法是通过在其他方法内的调用而被激活的,即方法中的代码被执行,当调用方法执行定义好的任务时,需要指定方法名和为被调用的方法提供信息,即通过方法的形式参数为方法输入所需参数,一个应用程序被执行是从main()方法开始的。
所有在方法中声明的变量都为该方法的局部变量,它们仅在定义的方法域中是有效的,方法可以有一个形式参数列表,它提供了方法间交换信息的手段,一个方法的参数同样也是局部变量,其作用域也在方法体内。
1. 类中普通方法的定义
在类中声明普通方法的语法格式为:
其中,modifer是修饰方法的属性,其值可缺省,缺省时的默认值为protected,该方法只能被同一个包内类中的其他方法调用,当方法被修饰为public时,该方法可以被任何类中方法调用,当方法被修饰为private时,该方法只能被同一类中的其他方法调用。
ReturnType为定义(声明)方法的返回类型,普通方法都需要确定一种返回类型,返回类型可以是基本数据类型、数组数据类型,或者是复合数据类型,例如,int或String(复合数据类型)等类型。如果一个方法不返回任何值,它应该有一个void的返回类型声明,Java关键字void指明该方法是没有返回值的返回类型。
具有明确返回类型的方法一定要有带参数的return语句,return语句后跟的参数(表达式所得结果)类型要与声明方法返回类型ReturnType相同,当方法返回类型是void时,可以省略return语句。
methodName是为方法确定的名字,它是一个标识符,需要符合标识符的自定义规则。
parameterList为方法的形式参数列表,它为方法指定输入参数,参数列表由类型声明和参数名组成,参数名之间由逗号分开,方法无输入参数时,则参数列表为空。基本数据类型的参数借助堆栈传输数据带入方法体,但数组和类的参数则是已存在于内存,借助引用地址传输到方法体中。
【示例2-2】 在一个类中定义两个整数类型数据相加的方法,以及修饰为public和private的方法,并在同一类中一个方法内激活(执行)另一个方法。
关键字static(静态的)是用于声明Java类中方法和变量的,当一个方法或变量被声明为static,表示该方法或变量在整个应用程序被执行期间一直保存在计算机存储器中,不会从存储器中被取消,对于方法和变量而言,static修饰符是可选项,当方法和变量不被static修饰时,则它们被称为动态(非静态)的方法和变量。
在同一个类中,当在一个被static修饰的方法中需要操作该方法外的变量或调用其他方法时,被操作的变量或调用的方法同样也需要被修饰为static,因为Java体系不允许在同属一个类的静态方法中操作非静态变量和调用非静态方法。例如,下面的程序变量a和方法A()在程序被执行前就存在于存储器中了。
2. 类构造方法的定义
在Java语言定义的类中,有一种特殊的方法,它是类中一个特殊的成员,被称为构造方法或构造器(Constructor),它是为创建类对象和提供为对象初始化等功能的专用方法,构造方法的名字同类名相同,只是构造方法没有返回类型,但是可以有形式参数列表为构造方法提供输入参数,用于创建对象时为对象提供初始化参数,另外,构造方法的属性应是public。
定义类构造方法的语法格式为:
【示例2-3】 通过构造方法为变量x提供初始值的程序。
一个类可以定义多个合法的构造方法,多个构造方法的区分只通过形式参数列表来实现,不同的形式参数列表parameterList表示不同的构造方法,但是,一个类不可以定义完全一模一样的两个或两个以上的构造方法。
3. main()方法的定义
Java虚拟机执行Java应用程序是从main()方法处开始的,main()方法是一个程序入口方法,如果将main()方法用作应用程序开始执行的地方,该方法的语法格式是固定的。
作为应用程序入口的main()方法的语法格式为:
关键字public声明main()方法是公有的,可以被其他类中的方法调用,作为应用程序开始执行的地方,main()方法首先被Java虚拟机调用。
main()方法为应用程序开始执行的方法,Java程序运行机制规定了main()方法要始终保存在计算机存储器中,因此,main()方法需要被修饰为static静态的。
关键字void说明main()方法没有返回值,另外,作为程序入口main()方法也不该有返回值。
main()方法的形式参数是String(字符串)类型的数组,args为String类型的数组变量,它可以从外部为一个应用程序输入参数,在Java语言中,该输入参数被称为“行命令参数”。
【示例2-4】 通过行命令参数为Java应用程序提供所需要的参数。
当Sample程序被编译产生Sample.class类代码后,在Windows操作系统的DOS命令提示符窗口中执行上述程序,并为该程序输入一个参数时,其java行命令格式为
执行后在DOS命令提示符窗口中可以看到HelloWorld输出显示,当程序需要输入多个行命令参数时,每个参数之间需要用空格分开,第一个参数被放在args[0]中,第二个参数被放在args[1]中,以此类推。
2.2.3 Java修饰符及其权限
Java类和类中变量、方法的主要属性修饰符有protected、public、private等Java关键字,其修饰符的权限(限定范围)如表2-1所示。
表2-1 修饰符限定范围
protected(保护的)是Java语言中默认的Java类和类中变量、方法的属性修饰符,当类和类中变量、方法前没有属性修饰符时,其修饰符为默认值protected,被protected修饰的类可以被同一个包中的其他类继承和访问,其限定范围是同一个包,其修饰的变量或方法也是可以被同一个包中的其他类对象访问。下面一段程序的类和类中定义的变量、方法的属性被修饰为protected。
public(公共的)也是Java语言中的Java类和类中变量、方法的属性修饰符,被public修饰的类和类中变量、方法没有限定域,即对外“全开放”。当一个类被修饰public时,它可以被任何其他的类继承,当类中的变量或方法被修饰public时,该变量或方法可以被其他类对象访问。
在Java语言中没有全局变量和全局方法,所以在类中不能指定整个程序的全局变量或全局方法,如果需要全局变量或全局方法时,可以使用public修饰类中的变量或方法。
private(私有的)修饰符限定的访问区域是类内部,private可以修饰类中的变量和方法,当变量或方法被修饰为private时,该变量或方法只能被同一类中的其他方法访问。
private不能修饰类和类的构造方法,如果一个类被修饰为private,它将不能被任何类继承或被创建为对象,即该类是一个没有用的类,如果一个类的构造方法被修饰为private,则该类也不能被创建为对象,则该类同样是一个没有用的类。
如果在定义的类中需要对信息(变量)或操作(方法)进行隐藏时,应将变量和方法修饰为private,可以防止“木马”等病毒程序的侵入。