我们都知道,Java是一种面向对象的编程语言,在Java世界中,几乎一切都是对象,我们通常用类来描述对象,对此,我引出三个问题。类和对象之间的关系是什么样的?在Java中我们是怎么操作对象?怎么创建类?本篇博客将对这三个问题进行解。
一 、类和对象的关系
在面向对象编程中,对象是具体化的实例,类是对同类事物的抽象,即为抽象化的模型。现实世界中的每一个事物,都是一个对象。同类对象的抽象——我们称之为“类”。比如汽车就是一个类,它的属性包括车轮、发动机、方向盘等等,行为包括启动、刹车等等,是所有汽车的模版,而奔驰就是这个类的一个实例,它具有汽车类的一切属性和方法,是在这个模版上创建的。以下是类所具有的特点:
- 类是具有共同属性和行为的对象的抽象。
- 类可以定义为数据和方法的集合。
- 类也称为模板,因为它们提供了对象的基本框架。
下面是我画的一幅图来描述类和对象之间的关系
二 、怎么操作对象
在Java中,我们处理数据包括基本数据类型和引用类型(即对象),但是在实际的操作过程中,我们是直接操纵元素吗?答案是否定的。其实我们操作的是对象的引用。对象的引用怎么理解,我在《Thinking In Java》看到一段很精彩的解释:对象好比电视机,引用相当于遥控器,我们可以通过遥控器对电视机进行操作,比如开关电视,调低音量,实际上我们操控的是遥控器,再由遥控器来控制电视。也就是说在Java中,我们是通过引用来操作对象的,而不是直接操作对象。但是,对于遥控器(引用)来说,没有电视机(对象)也可以独立存在,也就是说,你可以只有一个引用,并不一定有对象与之关联。比如 String name ; 这里只是创建了一个引用,而没有创建该引用指向的对象。到这里大家应该明白程序员是怎么操作对象的了吧。
但是,我们常用的基本数据类型要特殊对待。一方面基本数据类型所占的存储空间是固定的,而且相对较小,并没有像其他的对象占用大量的存储空间。另一方面,我们在编程中对基本数据类型的操作随处可见,如果通过new关键字来创建基本数据类型,该对象将存储在堆内存中,不方便操作,往往不是很有效。因此JVM将这些基本数据类型直接存储在栈中。但是Java提供了基本数据类型的包装类,也可以进行对象的创建,如下图所示。
基本数据类型 | 存储大小 | 包装类名称 |
---|---|---|
boolean | 1 bit | Boolean |
char | 16-bit | Character |
byte | 8 bit | Byte |
short | 16 bit | Short |
int | 32 bit | Integer |
long | 64 bit | Long |
folat | 32 bit | Float |
double | 64 bit | Double |
我们举个例子来看看怎么创建基本数据类型的对象:
Integer a = new Integer(10); //a为对象类型
三 、怎么创建类
在Java中,我们通过关键字class来创建类,格式如下:
class Name {
//定义成员变量,如果不初始化,系统会默认初始化。
type variable1;
.............
type variableN;
//定义成员方法
type methodname1(parameter-list){
//定义局部变量,必须初始化,否则会报错。
type local1 = 1;
type local2 = 2;
//方法体
}
.................
type methodnameN(parameter-list){
//方法体
}
}
方法体中如果指定了非void的返回值类型,方法中就必须包含一条return语句保证任何情况下都有返回数值,return语句后面不能跟任何表达式;
下面说说成员变量和局部变量的区别:
(1)成员变量是在类中直接定义的,从属于类,如果不初始化,系统会默认初始化,每种数据类型都有默认值。局部变量是定义在方法中的,从属于该方法,并且不可被其他方法访问。
(2)如果在某方法中对成员变量重新赋值,则以局部变量的值为该方法的最终值。
数据类型默认初始化的值:
Tables | Are |
---|---|
boolean | false |
char | ‘\u0000’ |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
Object | null |
以下代码用来验证成员变量和局部变量:
public class Test {
public static void main(String[] args) {
class Human{
//成员变量
String gender;
int age = 22;
public void run(){
//局部变量
int age = 18;
System.out.println(age);
System.out.println(gender);
}
}
Human test = new Human();
test.run();
}
}
运行结果为:
age:18
gender:null