文章导读
【在定义类时,经常需要抽象出它的属性和方法,并定义在类的主体中。本文探讨Java类属性及方法的定义和使用。通过本文的学习,你将了解如何在Java类中定义属性及方法、属性值的设置和获取。】
本文分成三个小节讲述类属性及方法的声明与使用。第一小节主要介绍常量属性和成员属性,以及属性的声明和初始化;第二小节主要介绍Java类方法定义规则及方法分类;第三小节主要介绍Java类的构造方法,Java类在使用前必须调用其构造方法进行实例化。
第一小节 Java类的属性
在定义类时,经常需要抽象出它的属性,并定义在类的主体中。下面就来介绍与属性相关的内容。
不可变属性
在类中定义的属性有不可变属性和可变属性之分。不可变属性用final或static关键字修饰,不可变属性只能赋值一次,在程序中不能修改它的值。一般来说,在类中定义的不可变属性用大写字母命名。
例如:public class Circle {
//定义圆周率
final double PI = 3.14;
}
可变属性
可变属性是指在程序运行过程中,属性的值可以被外部直接修改,或者通过类的set方法来修改。在一般情况下,建议变量属性设置为private权限,禁止直接被外部访问或修改,外部如果需要访问或修改变量属性,需要通过类的get和set方法来访问或修改属性值。
类属性的作用范围为整个类文件,作用范围就是类属性的有效工作范围,在整个类文件中,类属性都可以被访问和使用。
例如:package com.milihua.fruits;
public class Fruits {
//汁液含量
private String water;
//糖分含量
private String sugar;
//芳香度
private String fragrance;
Fruits(String inwater,String sugar,String fragrance)
{
this.water = inwater;
this.sugar = sugar;
this.fragrance = fragrance;
}
public String getWater() {
return water;
}
public void setWater(String water) {
this.water = water;
}
public String getSugar() {
return sugar;
}
public void setSugar(String sugar) {
this.sugar = sugar;
}
public String getFragrance() {
return fragrance;
}
public void setFragrance(String fragrance) {
this.fragrance = fragrance;
}
}
Fruits类有三个类属性,分别是water(汁液含量)、sugar(糖分含量)、fragrance(芳香度),这三个属性被修饰为private,禁止外部访问和修改。外部如果要访问和修改类属性,需要调用类提供的get和set方法,如getWater()方法可以获取water属性的值,setWater(String water)方法可以设置water属性的值,另外两个属性,依次类推。
对于类属性,Java提供了三种初始化方式。
(1)使用默认值初始化
Java为声明的类属性提供了默认初始化机制,当声明的类属性即使没有被显式赋值,Java也会为以下类型的类属性提供默认值:
(2)使用显式值初始化
声明类属性的同时,进行赋值。
例如:public class Circle {
//定义半径属性
private double r = 1.5;
}
(3)使用类构造方法初始化
通过类构造方法来初始化属性(类构造方法后面介绍),可参考本节的Fruits类构造方法。
类成员变量
变量前面已经介绍过了,变量的主要作用是存储程序运行过程中的临时数据,程序退出后,变量存储的内容不再存在。在一些情况下,有时需要在类体中声明一些变量用于存储类对象运行过程中的中间数据,这些变量并不是类的属性,它们被称为类成员变量。类成员变量的作用范围也是整个类文件,在整个类文件中,类成员变量都可以被访问和使用。
例如:
public class Circle {
//圆的面积
double area;
}
与类属性不同的是,类成员变量无需提供get和set方法,它们一般用于类内部存储临时数据使用。
局部变量
在类方法体中声明的变量为局部变量。
局部变量的作用范围为方法体,在方法体中,局部变量可以被访问和使用,局部变量在方法体外无效,不能被访问和使用。
例如:public class Circle {
//定义圆周率
final double PI = 3.14;
//圆的面积
double area;
public void showArea()
{
double r = 1.5;
area = PI * r * r;
}
}
其中,在showArea()方法中声明的r为局部变量,局部变量必须要声明并赋值后才能使用。
第二小节 Java类方法的定义
在封装一个类时,不仅要给出类的属性,还要给出类的方法。本节主要介绍如何封装类的方法。
1、方法的定义
类方法是类行为的抽象,如同类属性是类特征的抽象。类方法是由多条语句组成的语句块,并完成类的某一项功能,语句块用{}括起来。
例1:下面编写一个输出姓名和年龄的方法示例。
代码如下:public class Person {
//声明名称属性,并被初始化为"张三"
private String name = "张三";
//声明年龄属性,并被初始化为22
private int age = 22;
//定义一个方法,public是修饰符,void表示没有返回值
public void tell() {
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
代码中的tell()方法输出人的名称和年龄属性。
从上面的代码可以看出,方法的定义需要修饰符、方法返回值类型、方法名称、参数、方法体组成。
方法的修饰符可以省略,默认的是default修饰符,该修饰符的作用是只要其他类和该类在一个包里,就可以用它的实例调用该方法。
方法返回值类型是方法返回值的数据类型,例如例子中的getAge()方法返回数据类型为int的年龄属性。tell()方法没有返回值,因此用void表示无返回值。
方法名称是方法的名字,类实例对象调用该方法时,需要使用该名称。
例如:
Person p = new Person();
p.tell();
方法名称要遵守命名规范,方法名称首单词全部小写,如果一个方法由多个单词构成,那么从第二个单词开始首字母大写,不要使用连接符。
参数就像是占位符,声明函数语句的参数称为形参。当方法被调用时,调用方向参数传递一个值,这个值被称为实参。参数列表包括方法参数的类型、顺序、数量。参数是可选的,也就是说,方法可能不包含参数
这里需要注意的是,函数声明时的形参数量和调用函数时传入的实参数量要一致,声明的形参顺序和传入的实参顺序也要一致。
根据方法是否包含参数,方法可以分为有参方法和无参方法。
无参方法定义的语法为:
public 返回值类型 方法名() {}
例如例子中的tell()方法。
有参方法定义的语法为:
public 返回值类型 方法名(参数列表) {}
例如例子中的setName(String name)方法和setAge(int age)方法。
2、方法的分类
在实际编程中,不但自己定义类方法,也大量使用Java类库或第三方类库提供的类方法。
自定义的类方法是在类中为了解决某个问题而编写的一段功能代码片段,例如上面例子的tell()以及类属性的get和set方法都属于自定义方法。
Java类库或第三方类库提供的类方法,可以帮助我们完成很多程序功能,提高开发速度和质量,例如上面例子的System.out.println(“”)方法就为我们提供了输出字符串到控制台的功能。
如何使用Java类库提供的方法呢?若要使用类库提供的类及方法,可以查阅类库提供的JDK API文件,当程序需要使用类库时。可以使用import语句将类引入到程序中,声明此类的变量,再通过new关键字初始化,最后通过对象名.方法名.(参数)的形式来使用。
第三小节 Java类的构造方法
前面讨论了Java类的方法,了解了Java方法的声明、调用和传入参数的用法。下面讨论Java类的构造方法。
一个类对象初始化的最终步骤是通过new关键字去调用对象的构造方法,构造方法需满足如下要求:
(1)方法名必须与类名称完全相匹配;
(2)构造方法不需要返回类型;
(3)构造方法不能被static、final等关键字修饰,且不能有return返回语句。
下面的例子创建一个apple对象:
Fruits apple = new Fruits("80%”, “60%”, ”30%”);
使用new关键字创建创建Java对象时,系统首先为要创建的对象分配内存空间,然后调用类的构造方法初始化类成员属性或类成员变量,最后返回对象实例的引用给apple。
构造方法也分为有参和无参,Fruits类的构造方法属于有参构造方法,调用有参构造方法时,需要传入相对应的参数。无参构造方法则无需传入参数。下面分别讨论无参和有参构造方法。
1、无参构造方法
无参构造方法又分为隐式无参构造方法和显式无参构造方法。
隐式无参构造方法
在定义类的时候,如果没有给类定义一个构造方法,Java编译器在编译时会默认提供一个隐式的构造方法,它没有任何参数,并且有一个空的方法体。例如,Person类中隐含一个无参构造方法,在main方法中可以通过new关键字来调用此默认的构造方法,代码如下:package com.milihua.fruits;
public class Person {
//声明名称属性,并被初始化为"张三"
private String name = "张三";
//声明年龄属性,并被初始化为22
private int age = 22;
//定义一个方法,public是修饰符,void表示没有返回值
public void tell() {
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建person对象,调用系统提供的一个隐式无参构造方法
Person person = new Person();
person.tell();
}
}
显式无参构造方法
隐式无参构造方法是由系统提供的,无法修改其内容。但有时需要在调用这个构造方法时初始化类成员属性或执行一些操作,要实现这个需求,就需要为它定义一个显式无参构造方法,修改上述代码如下:package com.milihua.fruits;
public class Person {
//声明名称属性,并被初始化为"张三"
private String name;
//声明年龄属性,并被初始化为22
private int age;
//定义一个显示构造方法
public Person()
{
this.name = "张三";
this.age = 22;
}
//定义一个方法,public是修饰符,void表示没有返回值
public void tell() {
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建person对象,调用系统提供的一个隐式无参构造方法
Person person = new Person();
person.tell();
}
}
2、显示有参构造方法
构造并初始化对象是构造方法的作用,所以有时需要给这个方法传入一些参数,定义一个显示的有参构造方法。例如://定义一个显示有参构造方法
public Person(String instrName,int innAge)
{
this.name = instrName;
this.age = innAge;
}
下面为Person类增加有两个参数的显式构造方法,修改后的代码如下:package com.milihua.fruits;
public class Person {
//声明名称属性,并被初始化为"张三"
private String name;
//声明年龄属性,并被初始化为22
private int age;
//定义一个显示有参构造方法
public Person(String instrName,int innAge)
{
this.name = instrName;
this.age = innAge;
}
//定义一个方法,public是修饰符,void表示没有返回值
public void tell() {
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建person对象,调用系统提供的一个隐式无参构造方法
Person person = new Person("张三",22);
person.tell();
}
}
文章小结
1、Java类的类属性和类成员变量有所区别,类属性是类所表述事物的共同特征,类属性一般不能被外部直接访问和修改,需要通过类提供的get和set方法访问和修类属性。类成员变量一般用于类内部存储临时数据使用,不需要提供get和set方法。
2、定义方法时,方法名后面括号内的参数,称为形式参数(简称行参),参数之间用逗号隔开。方法的参数是方法执行时用来接收数据的,调用方法的语句负责传入数据。
3、构造方法和方法的类似之处在于它们都包含可执行代码,区别在于,只有当Java类实例化时才执行构造方法。构造方法通常包含类属性初始化代码,从严格意义上说,构造方法并不是方法,因为它不会返回任何值。
思考与练习
1、请说明类属性、类成员变量、局部变量的区别。
2、参照文中例子内容,编写一个水果类,输出水果的名称、味道、形状。
3、用eclipse新建一个Person项目,实现文中内容的例子代码。