13. 使用类

作者: 密叔 | 来源:发表于2017-12-27 08:44 被阅读9次
从零开始学Java封面13.jpg

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

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

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(); 的内存存储状态:

[图片上传失败...(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

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

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

相关文章

  • 13. 使用类

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

  • 13. 同步工具类的使用

    [TOC] 同步工具类,通常利用他们的特性来构建并发安全的类. 常用的同步工具类有: 信号量 闭锁 栅栏 Futu...

  • Bootstrap学习笔记(三)

    13.缩略图 .thumbnail:圆角的外边框.caption标题字幕样式 13.导航 .nav:标签页基类(u...

  • 13.数字类

  • 13.密封类

    1.用sealed 修饰2.子类可数3.子类只能定义在同一个文件中或者密封类内部 枚举跟密封类区别密封类官方定义:...

  • 13.包装类

    1.什么是包装类? java 提供了两种类型,基础类型和引用类型。使用基础类型在于效率。然而当要使用针对于对象设计...

  • 《招聘一个靠谱的 iOS》—参考答案(二)

    13. 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关...

  • Python:13.定制类

  • 13.嵌套类(NestedClass)

    类中也可以嵌套其他类

  • CephFS源码分析

    13. 深入研究 13.1 MDS启动阶段分析 13.2 MDS核心组件 13.3 MDSDaemon类图 13....

网友评论

    本文标题:13. 使用类

    本文链接:https://www.haomeiwen.com/subject/afuygxtx.html