黑马程序员——JAVA基础---类与对象

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

一 定义类

1.类的声明

在类声明中,需要定义类的名称、对该类的访问权限,以及该类与其他类的关系等。类声明的格式如下:
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
}
参数说明:
修饰符:可选参数,用于指定类的访问权限,可选值为public、abstract和final。
类名:必选参数,用于指定类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends 父类名:可选参数,用于指定要定义的类继承于哪个父类。当使用extends关键字时,父类名为必选参数。
implements 接口列表:可选参数,用于指定该类实现的是哪些接口。当使用implements关键字时,接口列表为必选参数。关于接口的定义和实现参见6.8节。
说明:本节主要介绍如何使用public关键字修饰的公共类(一个类被声明为public,就表明该类可以被其他所有的类访问和引用,也就是说程序的其他部分可以创建这个类的对象、访问这个类内部可见的成员变量和调用它的可见方法),如何使用abstract关键字修饰的抽象类和使用final关键字修饰的final类将在后面的章节中介绍。

   public class Fruit {

}

注意:Java的类文件的扩展名为.java,类文件的名称必须与类名相同,即类文件的名称为类名+“.java”,例如,有一个Java类文件Fruit.java,则其类名为Fruit。

2.类体
在类声明部分的大括号中的内容为类体。类体主要由两部分构成,一部分是成员变量的定义,另一部分是成员方法的定义。类体的定义格式如下:
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
定义成员变量
定义成员方法
}
本例主要实现定义一个水果类Fruit,在该类中定义一个表示颜色的属性color、一个表示种植的方法plant()、一个表示生长的方法grow()和一个表示收获的方法harvest()。
1)选择Eclipse主菜单中的“文件”→“新建”→“项目”命令,在打开的“新建项目”对话框中,选中“Java项目”选项,单击“下一步”按钮,在打开的“新建Java项目”对话框中,输入项目名称“01”,单击“完成”按钮完成项目的创建。
2)在包资源管理器中的刚刚创建的项目上,单击鼠标右键,在弹出的快捷菜单中选择“新建”→“类”命令,在打开的“新建Java类”对话框的“名称”文本框中输入类名“Fruit”,单击“完成”按钮。

3)在包资源管理器中,打开刚刚创建的类Fruit.java,在该类中定义相应的变量和方法。

public class Fruit {
    public String color="";      //定义颜色成员变量
    //定义种植成员方法
    public void plant(){
        System.out.println("果树正在种植……");
    }
    //定义生长的成员方法
    public void grow(){
        System.out.println("果树正在生长……");
    }
    //定义收获的成员方法
    public void harvest(){
        System.out.println("水果已经收获……");
    }
}

二 成员变量和局部变量

在类体中的变量定义部分所声明的变量为类的成员变量,而在方法体中声明的变量及方法的参数则称为局部变量。

1.声明成员变量
Java用成员变量来表示类的状态和属性,声明成员变量的基本语法格式如下:
[修饰符] [static] [final] [transient] [ volatile] <变量类型> <变量名>;
参数说明:
修饰符:可选参数,用于指定变量的被访问权限,可选值为public、protected和private。
static:可选,用于指定该成员变量为静态变量,可以直接通过类名访问。如果省略该关键字,则表示该成员变量为实例变量。
说明:静态变量与实例变量的区别:静态变量在内存中只有一个拷贝,运行时Java虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配,可以直接通过类名访问静态变量,而实例变量则可以在内存中存在多个拷贝,互不影响,每创建一个实例,就会为实例变量分配一次内存。
final:可选,用于指定该成员变量为取值不会改变的常量。
transient:可选,用于指定该成员变量为暂时性变量,用于对象存盘。
volatile:可选,用于指定该成员变量为共享变量,用于并发线程的共享。
变量类型:必选参数,用于指定变量的数据类型,其值为Java中的任意一种数据类型。
变量名:必选参数,用于指定成员变量的名称,变量名必须是合法的Java标识符。
在前面声明的Fruit类中声明3个成员变量。

public class Fruit {
    public String color="";      //定义颜色成员变量
    //定义种植成员方法
    public void plant(){
        System.out.println("果树正在种植……");
    }
    //定义生长的成员方法
    public void grow(){
        System.out.println("果树正在生长……");
    }
    //定义收获的成员方法
    public void harvest(){
        System.out.println("水果已经收获……");
    }
}

public class Fruit {
    public String color;               `        //声明公共变量color
    public static String flavor;            //声明静态变量flavor
    public final boolean STATE=true;        //声明常量STATE并赋值
}

2.声明局部变量
定义局部变量的基本语法格式同定义成员变量类似,所不同的是不能使用public、protected、private和static关键字对局部变量进行修饰,但可以使用final关键字,语法格式如下:
[final] <变量类型> <变量名>;
参数说明:
final:可选,用于指定该局部变量为常量。
变量类型:必选参数,用于指定变量的数据类型,其值为Java中的任意一种数据类型。
变量名:必选参数,用于指定局部变量的名称,变量名必须是合法的Java标识符。
在成员方法grow()中声明两个局部变量。


public void grow(){
    final boolean STATE;    //声明常量STATE
    int age;                    //声明局部变量age
    // …
  }

三 构造方法的概念及用途

在类中除了成员方法之外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,都会自动调用构造方法。

构造方法的特点如下:
构造方法没有返回值。
构造方法的名称要与本类的名称相同。
注意:
在定义构造方法时,构造方法没有返回值,但这与普通没有返回值的方法不同,普通没有返回值的方法使用public void methodEx()这种形式进行定义,但构造方法并不需要void关键字进行修饰。
构造方法的语法定义格式如下:


public book(){
    //...构造方法体
}

参数说明:
public:构造方法修饰符。
book:构造方法的名称。
在构造方法中可以为成员变量赋值,这样当实例化一个本类的对象时,相应的成员变量也将被初始化。
如果在类中没有明确定义构造方法,则编译器会自动创建一个不带参数的默认构造方法。
注意:
如果在类中定义的构造方法都不是无参的构造方法,则编译器不会为类设置一个默认的无参构造方法,当试图调用无参构造方法实例化一个对象时,编译器会报错。所以,只有在类中没有定义任何构造方法时,编译器才会在该类中自动创建一个不带参数的构造方法。

使用this关键字可以调用类的成员变量和成员方法,同时,使用this也可以调用类中的构造方法。
在项目中创建AnyThting类,在该类中分别定义一个没有参数的构造方法和一个包含有String类型参数的构造方法。

public class AnyThting {
    public AnyThting(){                 //定义无参构造方法
        this("this调用有参构造方法");               //使用this调用有参构造方法
        System.out.println("无参构造方法");
    }
    public AnyThting(String name){              //定义有参构造方法
        System.out.println("有参构造方法");
    }
}
从例6.4中可以看到定义的两个构造方法,在无参构造方法中可以使用this关键字调用有参的构造方法,但使用这种方式应当注意的是,只可以在无参构造方法中的第一句使用this调用有参构造方法。

在Java中,创建对象包括声明对象和为对象分配内存两部分,下面分别进行介绍。
1.声明对象
对象是类的实例,属于某个已经声明的类,因此,在对对象进行声明之前,一定要先定义该对象的类。声明对象的一般格式如下:
类名 对象名;
参数说明:
类名:必选,用于指定一个已经定义的类。
对象名:必选,用于指定对象名称,对象名必须是合法的Java标识符。
例如,声明Fruit类的一个对象fruit的代码如下:
Fruit fruit;
在声明对象时,只是在内存中为其建立了一个引用并置初值为null,表示不指向任何内存空间,因此,还需要为对象分配内存。

2.为对象分配内存
为对象分配内存也称为实例化对象。在Java中使用关键字new来实例化对象,具体语法格式如下:
对象名=new 构造方法名([参数列表]);
参数说明:
对象名:必选,用于指定已经声明的对象名。
类名:必选,用于指定构造方法名(即类名)因为构造方法与类名相同。
参数列表:可选参数,用于为指定构造方法提供入口参数,如果构造方法无参数,则可以省略。
例如,在声明Fruit类的一个对象fruit后,可以通过以下代码为对象fruit分配内存:
fruit=new Fruit();
在上面的代码中,由于Fruit类的构造方法无入口参数,所以省略了参数列表。
在声明对象时,也可以直接为其分配内存,例如,上面的声明对象和为对象分配内存的功能也可以通过以下代码实现:
Fruit fruit=new Fruit();

四 使用对象

创建对象后,就可以通过对象来引用其成员变量,并改变成员变量的值了,同时,也可以通过对象来调用其成员方法。通过使用运算符“.”实现对成员变量的访问和成员方法的调用。下面通过具体的实例来介绍如何访问成员变量和调用成员方法。
【例6.2】 本实例主要实现定义一个类并创建该类的对象的操作,同时通过创建的对象改变成员变量的值和调用该类中的成员方法。

1)创建一个名称为Circ的类,在该类中定义一个常量PI、一个成员变量r、一个不带参数的方法getArea()和一个带参数的方法getCircumference()。

public class Circ {
    final float PI=3.14159f;                //定义一个用于表示圆周率的常量PI
    public float r=0.0f;
    //定义计算圆面积的方法
    public float getArea() {
        float area=PI*r*r;                  //计算圆面积并赋值给变量area
        return area;                        //返回计算后的圆面积 
//定义计算圆周长的方法
    public float getCircumference(float r) {
        float circumference=2*PI*r;         //计算圆周长并赋值给变量circumference
//定义主方法测试程序
    public static void main(String[] args) {
        Circ circ=new Circ();
        circ.r=20;                          //改变成员变量的值
        float r=20;
        float area=circ.getArea();          //调用成员方法
        System.out.println("圆的面积为:"+area);        
        float circumference=circ.getCircumference(r);   //调用带参数的成员方法
        System.out.println("圆的周长为:"+circumference);
    }

2)运行本实例,其运行结果如图所示。
这里写图片描述

  图  实例的运行结果

五 销毁对象

在许多程序设计语言中,需要手动释放对象所占用的内存,但是,在Java中就不需要手动完成这项工作。Java提供的垃圾回收机制可以自动判断对象是否还在使用,并能够自动销毁不再使用的对象,收回对象所占用的资源。
Java提供了一个名为finalize()的方法,用于在对象被垃圾回收机制销毁之前,由垃圾回收系统调用。但是垃圾回收系统的运行是不可预测的,因此,在Java程序中,也可以使用析构方法finalize()随时来销毁一个对象。析构方法finalize()没有任何参数和返回值,每个类有且只有一个析构方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章