程序主要就是数据以及对数据的操作。
为方便理解和操作,高级语言使用数据类型这个概念,不同的数据类型有不同的特征和操作。
Java定义了八种基本数据类型:
- 四种整形 byte/short/int/long,
- 两种浮点类型 float/double,
- 一种真假类型 boolean,
- 一种字符类型 char,
其他类型的数据都用类这个概念表达。
从语言实现的角度看,类可看做是函数的容器。
从概念的角度看,可以看做是自定义数据类型(例:Math,Arrays分别表示数学和数组类型),其中的public static函数可以看做是类型能进行的操作。
在某些情况下,类基本上只是函数的容器,但类更多表示的是自定义数据类型。
自定义数据类型
一个数据类型由其包含的属性,以及该类型可以进行的操作组成。
一个数据类型主要由四部分组成:
类型本身具有的属性,通过类变量(可直接通过类名访问,如Math.PI)体现
类型本身可以进行的操作,通过类方法(可直接通过类名进行调用的,不需创建实例)体现
类型实例(具体数据)具有的属性,通过实例变量体现
类型实例(具体数据)可以进行的操作,通过实例方法(没有static修饰符,必须通过实例(对象)调用)体现
※对于一个具体类型,每一个部分不一定都有,Arrays类就只有类方法。
类变量(静态变量,静态成员变量)和实例变量都叫成员变量,也就是类的成员。
类方法(静态方法)和实例方法都叫成员方法,也都是类的成员。
实例字面意思就是一个实际的例子,实例变量表示具体的实例所具有的属性,实例方法表示具体的实例可以进行的操作。
实例方法和类方法的区别:
- 类方法只能访问类变量,但不能访问实例变量,可以调用其他的类方法,但不能调用实例方法。
- 实例方法既能访问实例变量,也可以访问类变量,既可以调用实例方法,也可以调用类方法。
实例方法直接访问实例变量的意思:
在实例方法中,有一个隐含的参数,这个参数就是当前操作的实例自己,直接操作实例变量实际也需要通过参数进行。
使用一个类
定义了类本身和定义了一个函数类似,本身不会做什么事情,不会分配内存,也不会执行代码。
方法要执行需要被调用,而实例方法被调用,首先需要一个实例(也称为对象)。
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类型的变量声明和赋值语句,它可以分为两部分:
1 Point p;
2 p = new Point();
Point p声明了一个变量,这个变量叫p,是Point类型的。
这个变量和数组变量类似,都有两块内存,一块存放实际内容,一块存放实际内容的位置。
声明变量本身只会分配存放位置的内存空间,这块空间还没有指向任何实际内容。
因为这种变量和数组变量本身不存储数据,而只是存储实际内容的位置,称为引用类型的变量。
p = new Point();
创建了一个实例(对象)后赋值给Point类型的变量p,它至少做了两件事:
- 分配内存,以存储新对象的数据,对象数据包括这个对象的属性,具体包括其实例变量x和y。
- 给实例变量设置默认值,int类型默认值为0。
与方法内定义的局部变量不同,在创建对象的时候,所有的实例变量都会分配一个默认值,这与在创建数组的时候类似,
- 数值类型变量的默认值是 0,
- boolean是false,
- char是'\u0000',
- 引用类型变量都是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,而只应该通过对象的方法对实例变量进行操作,原因也是为了减少误操作,直接访问变量没有办法进行参数检查和控制,而通过方法修改,可以在方法中进行检查。