13. 使用类 【连载 13】

针对类的操作无非有两种,第一种是类的定义,第二种是类的使用。在之前的内容已经讨论过类的定义,这次内容来说一说类的使用。

这里继续使用【定义类】内容所用的实例:

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 常用的内存存储结构,是内存中用来存储数据的地方。

  • 栈:主要用来存放方法中定义的基本类型变量(例如intdouble等)和引用类型变量(比如?的 myCar)。
  • 堆:主要存放在代码被运行时 new 出来的对象数据(其实是对象真实的数据)。

执行 Car myCar = new Car(); 的内存存储状态:

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

引用类型参数

引用类型参数的方法,被调用后,当方法执行时,方法内部改变传递参数值(实参)时。会改变原来引用类型参数所指向的对象的值。扣扣交流群:468439140

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

因为引用类型实参,被操作时,实际会操作引用类型实参指向的对象。对象的内容被改变。

关于类的使用,主要基本的东西,先说这么多。

转载于:https://my.oschina.net/micoding/blog/1595415

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值