本节书摘来自异步社区《Android游戏开发详解》一书中的第3章,第3.1节构造方法,作者 【美】Jonathan S. Harbour,更多章节内容可以访问云栖社区“异步社区”公众号查看

3.1 构造方法
Android游戏开发详解
通过回顾第2章中的重要概念并且做一些小的修改,我们可以更容易地进入较为复杂的主题。首先创建一个名为Constructors的项目,并且创建一个World类,如程序清单3.1所示。

程序清单3.1 World.java

1 public class World {
2
3    public static void main(String[] args) {
4    
5    
6    }
7
8 }

我们还将创建一个名为Coder的类,如程序清单3.2所示。

程序清单3.2 Coder.java

1 public class Coder {
2    private String name;
3    private int age;
4
5     public void initialize(String name, int age) {
6         this.name = name;
7       this.age = age;
8     }
9
10    public void writeCode() {
11        System.out.println(name + " is coding!");
12    }
13
14    public void describe() {
15        System.out.println("I am a coder");
16        System.out.println("My name is " + name);
17        System.out.println("I am " + age + " years old");
18    }
19
20 }

现在,你的项目应该如图3-1所示。


在继续学习之前,要确保理解Coder类。Coder.java是创建Coder对象的蓝图。在这个蓝图中,我们已经声明了一个Coder对象,它应该有2个变量描述其状态:表示name的一个String,以及表示age的一个整数。

和其他对象一样,我们的Coder对象也有行为。initialize()方法允许我们使用所提供的值来初始化Coder对象的实例变量。writeCode()方法将打印出文本,表明Coder对象正在编码。describe()方法将直接以容易理解的形式列出所有实例变量的值。

3.1.1 变量接受默认值
回到World类,创建Coder对象的一个实例,并且让它描述自己。代码应该如程序清单3.3所示。

程序清单3.3 World.java (更新版)

1 public class World {
2
3    public static void main(String[] args) {
4        Coder c = new Coder();
5        c.describe();
6    }
7
8 }

当我们初次声明新的Coder对象的时候,其实例变量还没有初始化(意味着,它们为每个变量类型都保留了默认值)。运行该World类,将会得到如下所示的输出。

I am a coder
My name is null
I am 0 years old

正如上面的结果所示,int的默认值是0。一个空的对象引用变量(指向一个对象的一个变量)的默认值为null,这意味着“没有内容”。这直接意味着对象引用变量没有包含任何值。如图3-2所示。


3.1.2 避免Java异常
在继续学习之前,我们想要指出导致很多Java程序意外终止的一个常见错误,即NullPointerException。当你试图调用属于一个null对象变量的一个方法的时候,就会发生这种运行时错误(在程序执行的时候发生的错误)。看看下面的例子。

String a;   // Equivalent to String a = null;
a.length();

如果你要在main方法中运行这段代码,将会得到如下所示的错误(带有出错的地方的行号)。

Exception in thread "main" java.lang.NullPointerException

无论何时,当你遇到这条错误消息,解决方法是找到所有的对象变量,并且使用null值来初始化它们。

3.1.3 使用方法来初始化Code对象
要避免任何潜在的NullPointerExceptions,我们现在使用initialize()方法来初始化新的Coder类的实例变量(如程序清单3.4的第7行所示)。

程序清单3.4 初始化Coder及其实例变量

1 public class World {
2
3     public static void main(String[] args) {
4         Coder c = new Coder(); // Initializes the variable c
5         c.describe();
6         System.out.println("");   // insert empty line for readability
7         c.initialize("Bill", 59); // Initializes c’s instance variables
8         c.describe();
9     }
10
11 }

当我们运行程序清单3.4的时候,将会得到如下所示的输出。

I am a coder
My name is null
I am 0 years old
I am a coder
My name is Bill
I am 59 years old

3.1.4 使用定制的构造方法来初始化Coder对象
在前面的小节中,我们已经学习了使用如下所示的语法来创建对象。

Coder c = new Coder();

上面代码的new Coder()部分,展示了如何调用所谓的默认构造(default constructor)方法,该方法直接创建了Coder对象的一个实例,以供我们在变量c中使用它。

Java还允许使用定制的构造方法,它就像普通方法一样,可以接受供该对象使用的值。为了看看这是如何起作用的,我们先关注如下两行代码。

Coder c = new Coder(); // Uses the default constructor  
...
c.initialize(“Bill”, 59);
定制的构造方法允许我们将代码简化成如下所示的形式。Coder c = new Coder(“Bill”, 59);

为了做到这一点,我们必须先在Coder类中声明想要的定制构造方法,如下所示。

public Coder(String name, int age) {this.name = name; this.age = age;
}

构造方法看上去和方法类似,但是实际上有很大的不同。首先,构造方法没有返回类型(甚至不是void)。其次,构造方法的名称必须和包含它的类相同。

尽管有这些不同,注意我们的构造方法接受了参数,并且像initialize()方法那样将它们分配给Coder对象的实例变量。

现在,我们可以将这个构造方法添加到Coder类中,并且删除initialize()方法,如下所示。

public class Coder {private String name; private int age; public Coder(String name, int age) {this.name = name; this.age = age; }publicvoid initialize(String name, int age) {
this.name = name;
this.age = age;
}public void writeCode() {System.out.println(name + " is coding!");}public void describe() {System.out.println("I am a coder");System.out.println("My name is " + name);System.out.println("I am " + age + " years old");}}

可以认为构造方法是必需的,这是创建对象的一条规则。这好像是在说:“如果想要创建我的对象,你必须传递我所要求的输入。”

在创建自己的构造方法的时候,你只是明确了当没有提供Coder对象的name和age的时候,是不能够创建它的。因此,不能使用下面的语法创建一个Coder对象。

Coder c = new Coder(); // no longer works!

让我们对World类做一些修改,以反映这些变化,如程序清单3.5所示。

程序清单3.5 调用定制的构造方法

public class World {public static void main(String[] args) {
Coder c = new Coder();
c.describe();
System.out.println(""); // insert empty line for readability
c.initialize("Bill", 59);Coder c = new Coder("Bill", 59);c.describe();}
}

运行这段代码,将会得到如下所示的输出。

I am a coder
My name is Bill
I am 59 years old

关键知识点

对象构造方法

构造方法提供了一种方法,在创建对象的过程中初始化对象中的实例变量。
构造方法和关键字new一起使用。
如果你选择不创建构造方法的话,Java会提供一个默认的构造方法。
所有的构造方法必须以类的名称来命名。
可以有任意多个构造方法,但是,每个构造方法必须有不同的一组参数。``

《Android游戏开发详解》——第3章,第3.1节构造方法相关推荐

  1. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  2. 《Android游戏开发详解》——第2章,第2.10节使用对象

    本节书摘来自异步社区<Android游戏开发详解>一书中的第2章,第2.10节使用对象,作者 [美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异步社区 ...

  3. 《Android游戏开发详解》——第2章,第2.13节调用对象的行为

    本节书摘来自异步社区<Android游戏开发详解>一书中的第2章,第2.13节调用对象的行为,作者 [美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异 ...

  4. 《Android游戏开发详解》——第3章,第3.6节图形

    本节书摘来自异步社区<Android游戏开发详解>一书中的第3章,第3.6节图形,作者 [美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异步社区&qu ...

  5. 《Android游戏开发详解》一2.16 区分类和对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.16节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社 ...

  6. 《Android游戏开发详解》一3.1 构造方法

    本节书摘来异步社区<Android游戏开发详解>一书中的第3章,第3.1节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区 ...

  7. 《Android游戏开发详解》一导读

    前 言 Android游戏开发详解 作为对编程知之甚少或者毫无所知的初学者,开始学习Android游戏开发,可能会觉得就像是穿越陌生的星际的旅程.有太多的事情要尝试,太多的知识要学习,令人遗憾的是,还 ...

  8. 《Android游戏开发详解》一2.18 使用Java API中的对象

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.18节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.1 ...

  9. 《Android游戏开发详解》一2.2 设置开发机器

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.2节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区 ...

最新文章

  1. 各小组对于自己产品的预期“软件下载/用户人数”
  2. python使用函数的目的_在Python 3.x中经常看到定义函数有一个单独的 * 参数?定义这样参数的目的是?怎样对其取值呢?...
  3. 李飞飞高徒:斯坦福如何打造基于视觉的智能医院?
  4. delete什么头文件C语言,C++中new和delete的介绍
  5. 基于Exchange 2003的搭建高可用的邮件平台 之一:群集的配置
  6. html 占用空间 滚动轴_滚动轴承润滑及密封,轧机轴承技术(104)
  7. SpringMVC表单验证器的使用
  8. abctod_123456
  9. Vue Cli 3.x项目如何部署到IIS子站点下
  10. matlab中memory模块初始值,Matlab的memory模块消除代数环
  11. JS高级——面向对象方式解决歌曲管理问题
  12. php 简繁体转换类库,简体中文转换为繁体中文的PHP函数
  13. Win Form图形编程实践——打砖块
  14. 斗鱼实名认证 mysql_斗鱼怎么进行实名认证_斗鱼实名认证方法教程-游戏窝
  15. php解压有密码的压缩包,linux下解压有密码的rar压缩包
  16. jxcell开发简单实例
  17. 蚂蚁金服智能推荐引擎解决方案与实践
  18. vs2015 openssl-1.0.2j编译
  19. vue项目PC端屏幕分辨率与窗口大小自适应
  20. 如何更改VUE项目运行名称以及Logo图标

热门文章

  1. 考研 | 手把手教你打赢考研情报战,巧用有关考研的三大网站
  2. 吉林大学 计算机图形学,吉林大学计算机图形学资料汇总.doc
  3. websocket 连接本地端口_Web应用架构WebSocket 协议介绍
  4. 极致cms1:1精仿资源哟源码
  5. i3、i5、i7有什么区别?
  6. 2011年白银机会远超黄金 四妙招帮您赚大
  7. Think in AngularJS :对比 jQuery 和 AngularJS 的不同思维模式
  8. jQuery 去除表单空值 serialize how to eliminate empty fields
  9. 执行AJAX返回HTML片段中的JavaScript脚本
  10. 点击空链接,页面不跳到页头