类的定义
类是 Java 中的一种重要的引用数据类型,也是组成 Java 程序的基本要素,因为所有的 Java 程序都是基于类的。
在 Java 中定义一个类,需要使用 class 关键字、一个自定义的类名和一对表示程序体的大括号。完整语法如下:
[public][abstract|final]class<class_name>[extends<class_name>][implements<interface_name>] {
// 定义属性部分
<property_type><property1>;
<property_type><property2>;
<property_type><property3>;
…
// 定义方法部分
function1();
function2();
function3();
…
}
上述语法中各关键字的描述如下。 public:表示“共有”的意思。如果使用 public 修饰,则可以被其他类和程序访问。每个 Java 程序的主类都必须是 public 类,作为公共工具供其他类和程序使用的类应定义为 public 类。 abstract:如果类被 abstract 修饰,则该类为抽象类,抽象类不能被实例化,但抽象类中可以有抽象方法(使用 abstract 修饰的方法)和具体方法(没有使用 abstract 修饰的方法)。继承该抽象类的所有子类都必须实现该抽象类中的所有抽象方法(除非子类也是抽象类)。 final:如果类被 final 修饰,则不允许被继承。 class:声明类的关键字。 class_name:类的名称。 extends:表示继承其他类。 implements:表示实现某些接口。 property_type:表示成员变量的类型。 property:表示成员变量名称。 function():表示成员方法名称。
Java 类名的命名规则: 1、类名应该以下划线或字母开头,最好以字母开头。 2、第一个字母最好大写,如果类名由多个单词组成,则每个单词的首字母最好都大写。 3、类名不能为 Java 中的关键字,例如 boolean、this、int 等。 4、类名不能包含任何嵌入的空格或点号以及除了下划线和美元符号($)字符之外的特殊字符。
例 1 创建一个新的类,就是创建一个新的数据类型。实例化一个类,就是得到类的一个对象。因此,对象就是一组变量和相关方法的集合,其中变量表明对象的状态和属性,方法表明对象所具有的行为。定义一个类的步骤如下所述。
(1) 声明类。编写类的最外层框架,声明一个名称为 Person 的类。
public class Person {
// 类的主体
}
(2) 编写类的属性。类中的数据和方法统称为类成员。其中,类的属性就是类的数据成员。通过在类的主体中定义变量来描述类所具有的特征(属性),这里声明的变量称为类的成员变量。
(3) 编写类的方法。类的方法描述了类所具有的行为,是类的方法成员。可以简单地把方法理解为独立完成某个功能的单元模块。
下面来定义一个简单的 Person 类。
public class Person {
private String name; // 姓名
private int age; // 年龄
public void tell() {
// 定义说话的方法
System.out.println(name+"今年"+age+"岁!");
}
}
如上述代码,在 Person 类中首先定义了两个属性,分别为 name 和 age,然后定义了一个名称为 tell() 的方法。
完整示例代码:
package shenco.wang.java;
public class PersonTest {
public static void main(String[] args) {
//创建Person类对象
Person p1 = new Person();
//调用对象结构:属性、方法
p1.name = "Tom";
p1.age = 23;
System.out.println(p1.name);
p1.speak("汉语");
p1.tell();
}
}
class Person {
public String name; // 姓名
public int age; // 年龄
public void tell() {
// 定义说话的方法
System.out.println(name+"今年"+age+"岁!");
}
// 定义说话的语言
public void speak(String language) {
System.out.println(name+"说话的语言是"+ language);
}
}
程序运行结查如下:
Tom
Tom说话的语言是汉语
Tom今年23岁!
类的属性
在 Java 中类的成员变量定义了类的属性。例如,一个学生类中一般需要有姓名、性别和年龄等属性,这时就需要定义姓名、性别和年龄 3 个属性。声明成员变量的语法如下:
[public|protected|private][static][final]<type><variable_name>
各参数的含义如下: public、protected、private:用于表示成员变量的访问权限。 static:表示该成员变量为类变量,也称为静态变量。 final:表示将该成员变量声明为常量,其值无法更改。 type:表示变量的类型。 variable_name:表示变量名称。
可以在声明成员变量的同时对其进行初始化,如果声明成员变量时没有对其初始化,则系统会使用默认值初始化成员变量。
初始化的默认值如下: 整数型(byte、short、int 和 long)的基本类型变量的默认值为 0。 单精度浮点型(float)的基本类型变量的默认值为 0.0f。 双精度浮点型(double)的基本类型变量的默认值为 0.0d。 字符型(char)的基本类型变量的默认值为 “\u0000”。 布尔型的基本类型变量的默认值为 false。 数组引用类型的变量的默认值为 null。如果创建了数组变量的实例,但没有显式地为每个元素赋值,则数组中的元素初始化值采用数组数据类型对应的默认值。
定义类的成员变量的示例如下:
public class Student {
public String name; // 姓名
final int sex = 0; // 性别:0表示女孩,1表示男孩
private int age; // 年龄
}
上述示例的 Student 类中定义了 3 个成员变量:String 类型的 name、int 类型的 sex 和 int 类型的 age。其中,name 的访问修饰符为 public,初始化值为 null;sex 的访问修饰符为 friendly(默认),初始化值为 0,表示性别为女,且其值无法更改;age 的访问修饰符为 private,初始化值为 0。
成员方法
声明成员方法可以定义类的行为,行为表示一个对象能够做的事情或者能够从一个对象取得的信息。类的各种功能操作都是用方法来实现的,属性只不过提供了相应的数据。一个完整的方法通常包括方法名称、方法主体、方法参数和方法返回值类型,其结构如下图所示:
成员方法一旦被定义,便可以在程序中多次调用,提高了编程效率。声明成员方法的语法格式如下:
public class Test {
[public|private|protected][static]<void|return_type><method_name>([paramList]) {
// 方法体
}
}
注意:上述语法中,中括号“[]”中的部分表示可以省略,竖线“|”表示“或”,例如 public|private,说明可以使用 public 或 private 关键字,但是两个关键字不能同时出现。
上述代码中一个方法包含 4 部分:方法的返回值、方法名称、方法的参数和方法体。其中 retum_type 是方法返回值的数据类型,数据类型可以是原始的数据类型,即常用的 8 种数据类型,也可以是一个引用数据类型,如一个类、接口和数组等。
除了这些,一个方法还可以没有返回值,即返回类型为 void,像 main() 方法。method_name 表示自定义的方法名称,方法的名称首先要遵循标识符的命名约定,除此之外,方法的名称第一个单词的第一个字母是小写,第二单词的第一个字母是大写,依此类推。
paramList 表示参数列表,这些变量都要有自己的数据类型,可以是原始数据类型,也可以是复杂数据类型,一个方法主要依靠参数来传递消息。方法主体是方法中执行功能操作的语句。其他各修饰符的含义如下:
public、private、protected:表示成员方法的访问权限。 static:表示限定该成员方法为静态方法。 final:表示限定该成员方法不能被重写或重载。 abstract:表示限定该成员方法为抽象方法。抽象方法不提供具体的实现,并且所属类型必须为抽象类。
1.成员方法的返回值 若方法有返回值,则在方法体中用 return 语句指明要返回的值,其格式如下所示。
return 表达式
或者
return (表达式)
其中,表达式可以是常量、变量、对象等。表达式的数据类型必须与声明成员方法时给出的返回值类型一致。
2. 形参、实参及成员方法的调用 一般来说,可以通过以下方式来调用成员方法:
methodName({paramList})
关于方法的参数,经常会提到形参与实参,形参是定义方法时参数列表中出现的参数,实参是调用方法时为方法传递的参数。
方法的形参和实参具有以下特点: 1、形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在方法内部有效,方法调用结束返回主调方法后则不能再使用该形参变量。 2、实参可以是常量、变量、表达式、方法等,无论实参是何种类型的量,在进行方法调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值、输入等办法使实参获得确定值。 3、实参和形参在数量、类型和顺序上应严格一致,否则会发生“类型不匹配” 的错误。 4、方法调用中发生的数据传送是单向的,即只能把实参的值传送绐形参,而不能把形参的值反向地传送给实参。因此在方法调用过程中,形参的值发生改变,而实参中的值不会变化。
在调用成员方法时应注意以下 4 点: 1、对无参成员方法来说,是没有实际参数列表的(即没有 paramList),但方法名后的括号不能省略。 2、对带参数的成员方法来说,实参的个数、顺序以及它们的数据类型必须与形式参数的个数、顺序以及它们的数据类型保持一致,各个实参间用逗号分隔。实参名与形参名可以相同,也可以不同。 3、实参也可以是表达式,此时一定要注意使表达式的数据类型与形参的数据类型相同,或者使表达式的类型按 Java 类型转换规则达到形参指明的数据类型。 4、实参变量对形参变量的数据传递是“值传递”,即只能由实参传递给形参,而不能由形参传递给实参。程序中执行到调用成员方法时,Java 把实参值复制到一个临时的存储区(栈)中,形参的任何修改都在栈中进行,当退出该成员方法时,Java 自动清除栈中的内容。
3. 方法体中的局部变量 在方法体内可以定义本方法所使用的变量,这种变量是局部变量。它的生存期与作用域是在本方法内,也就是说,局部变量只能在本方法内有效或可见,离开本方法则这些变量将被自动释放。
在方法体内定义变量时,变量前不能加修饰符。局部变量在使用前必须明确赋值,否则编译时会出错。另外,在一个方法内部,可以在复合语句(把多个语句用括号{}括起来组成的一个语句称复合语句)中定义变量,这些变量只在复合语句中有效。
例 2 利用面向对象的编程方法,设计类Circle计算圆的面积。
package shenco.wang.java;
public class CircleTest {
public static void main(String[] args) {
Circle c1 = new Circle();
c1.radius = 2.1;
double area = c1.findArea();
System.out.println("面积为:"+area);
}
}
class Circle{
double radius;
public double findArea() {
double area = 3.14 * radius * radius;
return area;
}
}