针对类的操作无非有两种,第一种是类的定义,第二种是类的使用。在之前的内容已经讨论过类的定义,这次内容来说一说类的使用。
这里继续使用【定义类】内容所用的实例:
Car:
public class Car {
String make;//制造商
double odometer;//里程
int maxSpeed;//最高时速
Engine engine;//引擎
//空构造,也是默认构造。
public Car() {
System.out.println("调用了空构造方法");
}
//一个参数的构造方法,可以传递make值,创建一个对象
public Car(String make) {
this.make = make;
}
//多个参数的构造
public Car(String make, double odometer, int maxSpeed, Engine engine) {
this.make = make;
this.odometer = odometer;
this.maxSpeed = maxSpeed;
this.engine = engine;
}
//汽车启动
public void starup() {
System.out.println(make + ", 启动了");
}
//汽车行驶
public void run() {
System.out.println("80, 行驶");
}
}
Engine :
public class Engine {
double power = 5.5;//动力
}
1. 创建对象
对于类的使用,我们通常要先去根据类来创建一个对象:
public static void main(String[] args) {
//创建一个对象
Car myCar = new Car();
}
-
Car myCar
: 定义了一个Car
类型的变量myCar
-
new
:是一个关键字,用来创建一个对象 -
Car()
:调用Car
类的构造方法Car()
这里有必要解释下内存分配情况,当执行 Car myCar = new Car();
这句代码时,内存是如何分配的?
作为编程语言,实际变量所存储的数据都是要放在内存中的。堆和栈是 Java 常用的内存存储结构,是内存中用来存储数据的地方。
- 栈:主要用来存放方法中定义的基本类型变量(例如
int
、double
等)和引用类型变量(比如👆的myCar
)。 - 堆:主要存放在代码被运行时
new
出来的对象数据(其实是对象真实的数据)。
执行 Car myCar = new Car();
的内存存储状态:
[图片上传失败...(image-d63364-1514335409108)]
myCar
作为一个引用类型的变量存储在栈中,会保存一个像oxAE34
这样的地址字符串。堆中则是保存了new
出来的对象本身。myCar
实际是引用了一个对象,这种变量都称之为引用类型变量
。
实际针对对象的一些操作,都是通过引用变量,找到对应的对象本身,之后才去真正操作对象里面的内容。
2. 访问属性
成员变量可以被类内部方法直接访问的
public class Car {
//....
String make = "mini";
//汽车启动
public void starup() {
System.out.println(make + ", 启动了");
}
//....
}
创建之后,我们可以通过对象引用变量访问非 private
修饰的成员属性:
Car myCar = new Car();
myCar.maxSpeed = 100.2;//赋值
System.out.println(myCar.maxSpeed);//访问
当然,对于类变量,也就是静态属性,我们不用通过对象,通过类就可以直接访问:
用static
修饰一个变量,使之成为类变量(静态变量),后面会有内容专门讨论static
。
当下,假如在 Car
类中定义了一个静态变量 wheelNum
:
public class Car {
//....
public static int wheelNum = 4;
//....
}
该类型变量则可以通过 类名.静态变量
方式直接访问:
Systtem.out.println(Car.wheelNUm);
3. 访问方法
方法代表一个对象的行为和功能。一个方法可以被类内部的其他方法直接调用,无论是否为私有方法。
public class Car {
//....
//汽车启动
public void starup() {
System.out.println(make + ", 启动了");
}
//汽车行驶
public void run() {
starup();
System.out.println("80, 行驶");
}
//...
}
对于类外部,通过一个对象可以调用非私有方法。
Car myCar = new Car();
myCar.run();//调用myCar对象的run方法
4. 方法参数
方法参数分为两类,基本类型参数和引用类型参数。这两类参数在访问调用中的行为是不一样的需要注意。
基本类型参数:
一个基本类型参数的方法,被调用后执行后,会拷贝一个一样基本类型参数作为方法内运行使用。当方法中的这个参数值被改变后,并不会影响到原来的传递到方法的实参变量。
double updateOdometer(double meter) {
return ++meter;
}
调用:
double meter = 100.5;
myCar.updateOdometer(meter);
System.out.println(meter);
输出:
100.5
引用类型参数:
引用类型参数的方法,被调用后,当方法执行时,方法内部改变传递参数值(实参)时。会改变原来引用类型参数所指向的对象的值。
public Car(String make, Engine engine) {
this.make = make;
this.engine = engine;
engine.power = 4.5;
}
调用:
Engine engine = new Egine();
engine.power = 5.5;
Car car = new ("mini", engine);
System.out.println(engine.power);
输出:
4.5
因为引用类型实参,被操作时,实际会操作引用类型实参指向的对象。对象的内容被改变。
关于类的使用,主要基本的东西,先说这么多。