13. 使用类

从零开始学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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,849评论 6 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,771评论 1 10
  • 和钻石一样闪亮 从浓黑的河流底部升起 你的饱含羞愧的心 在迷雾当中闪亮 像风一样清扬 远方的清晰渐渐传来 你的晦暗...
    蒋菱阅读 189评论 3 2
  • 申明:此文章内容来自于 Doctor AndrewNG的视频,经过编辑而成 本篇文章主要深入理解代价函数的概念。为...
    Alfie20阅读 2,845评论 0 3