Java 定义和使用类

定义一个类

我们定义一个简单的类,表示在平面坐标轴中的一个点,代码如下:

class Point {
    public int x;
    public int y;
    public double distance(){
        return Math.sqrt(x*x+y*y);
    }
}

我们来解释一下:

public class Point

表示类型的名字是Point,是可以被外部公开访问的。这个public修饰似乎是多余的,不能被外部访问还能有什么用?在这里,确实不能用private修饰Point。但修饰符可以没有(即留空),表示一种包级别的可见性。另外,类可以定义在一个类的内部,这时可以使用private 修饰符。

public int x;
public int y;

定义了两个实例变量x和y,分别表示x坐标和y坐标,与类变量类似,修饰符也有public或private修饰符,表示含义类似,public表示可被外部访问,而private表示私有,不能直接被外部访问,实例变量不能有static修饰符。

public double distance(){
    return Math.sqrt(x*x+y*y);
}

定义了实例方法distance,表示该点到坐标原点的距离。该方法可以直接访问实例变量x和y,这是实例方法和类方法的最大区别。实例方法直接访问实例变量,到底是什么意思呢?其实,在实例方法中,有一个隐含的参数,这个参数就是当前操作的实例自己,直接操作实例变量,实际也需要通过参数进行。实例方法和类方法的更多区别如下所示。

  • 类方法只能访问类变量,不能访问实例变量,可以调用其他的类方法,不能调用实例方法。
  • 实例方法既能访问实例变量,也能访问类变量,既可以调用实例方法,也可以调用类方法。

使用类

定义了类本身和定义了一个函数类似,本身不会做什么事情,不会分配内存,也不会执行代码。方法要执行需要被调用,而实例方法被调用,首先需要一个实例。实例也称为对象,我们可能会交替使用。下面的代码演示了如何使用:

public static void main(String[] args) {
    Point p = new Point();
    p.x = 2;
    p.y = 3;
    System.out.println(p.distance());
}

我们解释一下:

Point p = new Point();

这个语句包含了Point类型的变量声明和赋值,它可以分为两部分:

Point p;
p = new Point();

Point p声明了一个变量,这个变量叫p,是Point类型的。这个变量和数组变量是类似的,都有两块内存:一块存放实际内容,一块存放实际内容的位置。声明变量本身只会分配存放位置的内存空间,这块空间还没有指向任何实际内容。因为这种变量和数组变量本身不存储数据,而只是存储实际内容的位置,它们也都称为引用类型的变量。

p = new Point();创建了一个实例或对象,然后赋值给了Point类型的变量p,它至少做了两件事:
1)分配内存,以存储新对象的数据,对象数据包括这个对象的属性,具体包括其实例变量x和y。

2)给实例变量设置默认值,int类型默认值为0。

与方法内定义的局部变量不同,在创建对象的时候,所有的实例变量都会分配一个默认值,这与创建数组的时候是类似的,数值类型变量的默认值是0, boolean是false, char是“\u0000”,引用类型变量都是null。null是一个特殊的值,表示不指向任何对象。

p.x = 2;
p.y = 3;

给对象的变量赋值,语法形式是:<对象变量名>.<成员名>

System.out.println(p.distance());

调用实例方法distance,并输出结果,语法形式是:<对象变量名>.<方法名>。实例方法内对实例变量的操作,实际操作的就是p这个对象的数据。

先定义数据,然后赋值,最后是操作,自定义类型与此类似:

  • Point p = new Point();是定义数据并设置默认值。
  • p.x = 2; p.y = 3;是赋值。
  • p.distance()是数据的操作。

可以看出,对实例变量和实例方法的访问都通过对象进行,通过对象来访问和操作其内部的数据是一种基本的面向对象思维。本例中,我们通过对象直接操作了其内部数据x和y,这是一个不好的习惯,一般而言,不应该将实例变量声明为public,而只应该通过对象的方法对实例变量进行操作。这也是为了减少误操作,直接访问变量没有办法进行参数检查和控制,而通过方法修改,可以在方法中进行检查。

赞(0)

评论 抢沙发

评论前必须登录!