《Android游戏开发详解》——第2章,第2.15节改进程序

2.15 改进程序
Android游戏开发详解
让我们记住上面的原理,并且努力地改进程序。首先,添加一个内建的Java关键字private作为所有Phone对象的变量的修饰符,如程序清单2.14第4行到第7行所示。

程序清单2.14 隐藏Phone类中的变量

01 public class Phone {
02
03    // These variables describe the Phone object's state
04    private boolean poweredOn;
05    private boolean playingMusic;
06    private String phoneManufacturer;
07    private double androidVersionNumber;
08
09    // These methods are the Phone object's behaviors
10    void togglePower() {
11        if (poweredOn) {
12            System.out.println("Powering off!");
13            poweredOn = false;
14            playingMusic = false;
15        } else {
16            System.out.println("Powering on!");
17            poweredOn = true;
18        }
19    } // ends togglePower method
20
21    void playMusic() {
22        if (poweredOn) {
23            System.out.println("Playing music!");
24        }
25    } // ends playMusic method
26  
27    void upgrade(double newVersion) {
28        if (newVersion > androidVersionNumber) {
29            androidVersionNumber = newVersion;
30      } else {
31            System.out.println("Upgrade failed!");
32      }
33    } // ends upgrade method
34
35 } // ends class

让变量成为private的,意味着其他的类不再能够直接访问它们,也意味着这些变量不再是暴露的了。因此,你将会看到World类中出现错误,如图2-21所示(不能直接引用不同的类中的一个private的变量)。

程序目前有所谓的编译时错误(发生在代码编译过程中的错误,参见图2-18以及后续的介绍)。有编译时错误的程序无法运行。JVM甚至不会接受这种程序。让我们删除引发错误的所有代码行,如程序清单2.15所示(在删除的所有代码行上,都有一条删除线)。

程序清单2.15 World.java——删除错误代码

01 public class World {
02    
03    public static void main(String[] args) {
04        System.out.println("Hello, world!");
05        Phone myPhone = new Phone();
06        myPhone.poweredOn = true;
07        myPhone.playingMusic = false;
08        myPhone.phoneManufacturer = "Samsung";
09        myPhone.androidVersionNumber = 4.4;
10      
11        System.out.println("myPhone's state:");
12        System.out.println("Powered on: " + myPhone.poweredOn);
13        System.out.println("Playing music: " + myPhone.playingMusic);
14        System.out.println("Manufacturer: " + myPhone.phoneManufacturer);
15        System.out.println("Version: " + myPhone.androidVersionNumber);
16      
17        myPhone.togglePower();
18        myPhone.upgrade(4.5);
19    
20        // include “\n” to skip a line when printing.
21        System.out.println("\nmyPhone's NEW state:");
22        System.out.println("Powered on: " + myPhone.poweredOn);
23        System.out.println("Playing music: " + myPhone.playingMusic);
24        System.out.println("Manufacturer: " + myPhone.phoneManufacturer);
25        System.out.println("Version: " + myPhone.androidVersionNumber);
26    }
27 }

要执行这一清理工作,我们必须删除程序的两项功能。我们不再能够为Phone对象的变量赋初始值,并且不再能够访问这些变量以打印出它们。我们可以通过在Phone类中提供方法来执行这些任务,从而以更高效的方式来实现这些功能。

让我们给Phone类添加两个新的方法:initialize()和describe(),如程序清单2.16所示,并且为playingMusic和androidVersionNumber变量提供初始值(如程序清单2.16的第5行和第7行所示)。

程序清单2.16 Phone.java——更新版本(新的代码行突出显示)

01 public class Phone {
02
03    // These variables describe the Phone object's state
04    private boolean poweredOn;
05    private boolean playingMusic = false;
06    private String phoneManufacturer;
07    private double androidVersionNumber = 4.4;
08
09    // These methods are the Phone object's behaviors
10    void initialize(boolean poweredOn, String phoneManufacturer) {
11        this.poweredOn = poweredOn;
12        this.phoneManufacturer = phoneManufacturer;
13    }
14
15    void togglePower() {
16        if (poweredOn) {
17            System.out.println("Powering off!");
18            poweredOn = false;
19            playingMusic = false;
20        } else {
21            System.out.println("Powering on!");
22            poweredOn = true;
23        }
24    }
25
26    void playMusic() {
27        if (poweredOn) {
28            System.out.println("Playing music!");
29        }
30    }
31    
32    void upgrade(double newVersion) {
33        if (newVersion > androidVersionNumber) {
34            androidVersionNumber = newVersion;
35        } else {
36            System.out.println("Upgrade failed!");
37        }
38    }
39    
40    void describe() {
41        System.out.println("\nPhone's state:");
42        System.out.println("Powered on: " + poweredOn);
43        System.out.println("Playing music: " + playingMusic);
44        System.out.println("Manufacturer: " + phoneManufacturer);
45        System.out.println("Version: " + androidVersionNumber);
46    }
47
48 } // ends class

让我们讨论一下describe()方法(程序清单2.16的第40行到第46行)。你注意到,它执行了我们前面在World类中所执行的相同的打印行为。这一次,我们不必使用点运算符,因为可以从同一个类中访问这些变量。

然而,在某些情况下,你确实需要使用点运算符。来进一步看一下initialize()方法(程序清单2.16的第10行到第13行)。

void initialize(boolean poweredOn, String phoneManufacturer) {
      this.poweredOn = poweredOn;
      this.phoneManufacturer = phoneManufacturer;
}

initialize()方法直接接受两个输入:一个名为poweredOn的boolean值,以及一个名为phoneManufacturer的字符串。这个方法唯一的功能就是,将我们没有为其提供默认值的两个变量poweredOn和phoneManufacturer(还记得吧,我们已经为另外两个变量提供了初始值)初始化。如图2-22所示。

注意,我们在这里确实使用了点运算符。使用this关键字让程序知道,我们引用的是对象的这个实例,即我们在其上调用initialize()方法的当前Phone对象。这就是我们如何区分属于对象的poweredOn变量和属于方法(通过参数而接受)的poweredOn变量。

既然已经创建了两个方法,我们就能够访问Phone对象的私有变量,让我们来修改World类,以便它可以调用这些方法,参见程序清单2.17中高亮显示的第6行、第7行和第10行。

程序清单2.17 World.java——调用新的方法

01 public class World {
02
03    public static void main(String[] args) {
04        System.out.println("Hello, world!");
05        Phone myPhone = new Phone();
06        myPhone.initialize(false, "Samsung");
07        myPhone.describe();
08        myPhone.togglePower();
09      myPhone.upgrade(4.5);
10      myPhone.describe();
11    }
12 }

相应的输出如下所示。

Hello, world!
Phone's state:
Powered on: false
Playing music: false
Manufacturer: Samsung
Version: 4.4
Powering on!
Phone's state:
Powered on: true
Playing music: false
Manufacturer: Samsung
Version: 4.5
时间: 2024-08-22 14:45:57

《Android游戏开发详解》——第2章,第2.15节改进程序的相关文章

《Android游戏开发详解》一2.3 编写第一个程序

2.3 编写第一个程序 Android游戏开发详解在选择了工作区之后,Eclipse将会打开,并且你将会看到图2-7所示的欢迎界面. 现在,我们已经准备好了IDE,可以开始编写第一个Java程序了.由于还没有构建任何的Android应用程序,我们可以安全地退出这个标签页.如图2-8所示. 完成之后,我们将可以访问几个不同的视图.现在,只需要关心其中的2个视图:Package Explorer 和Editor Window.如图2-9所示. 2.3.1 创建一个新的Java项目 我们终于开始编写第

《Android游戏开发详解》一第2章 Java基础知识

第2章 Java基础知识 Android游戏开发详解第1章内容完全是成为Java程序员的准备工作.在本章中,你将编写自己的第一个Java程序(包括一款简单的游戏),并学习如何把游戏的角色.加血(power-up)以及其他实体表示为Java对象.

《Android游戏开发详解》——第2章,第2.22节小结

2.22 小结Android游戏开发详解在前面的示例中,我们的程序包含1个或2个较小的类.随着学习本书,我们将要编写拥有更多类的程序.实际上,有些游戏很容易拥有10个以上的类,而且每个类都满足游戏架构中的某些角色.仔细研究前面的例子,如果有任何的不解或问题,请访问本书的配套网站jamescho7.com.在那里贴出你关于本书的问题,我将尽力解答它们. 我们已经在本章中介绍了很多的内容,并且所有这些概念都会在本书中再次出现.要记住Java这门新的语言的语法很难,但是关键在于练习.现在,花一点时间研

《Android游戏开发详解》一2.22 小结

2.22 小结 Android游戏开发详解在前面的示例中,我们的程序包含1个或2个较小的类.随着学习本书,我们将要编写拥有更多类的程序.实际上,有些游戏很容易拥有10个以上的类,而且每个类都满足游戏架构中的某些角色.仔细研究前面的例子,如果有任何的不解或问题,请访问本书的配套网站jamescho7.com.在那里贴出你关于本书的问题,我将尽力解答它们. 我们已经在本章中介绍了很多的内容,并且所有这些概念都会在本书中再次出现.要记住Java这门新的语言的语法很难,但是关键在于练习.现在,花一点时间

《Android游戏开发详解》——第2章,第2.2节设置开发机器

2.2 设置开发机器 Android游戏开发详解 在开始编写简单点的Java程序和构建令人兴奋的游戏之前,我们必须在自己的机器上安装一些软件.然而,这个过程有点枯燥且颇费时间,但是,为了让第一个程序开始运行,这些代价都是值得的. 2.2.1 安装Eclipse 我们将利用一个集成开发环境(Integrated Development Environment,IDE)来编写Java/Android应用程序.IDE是一种工具的名称,它能够帮助我们轻松地编写.构建和运行程序. 我们将要使用的IDE叫作

《Android游戏开发详解》——第1章,第1.9节训练到此结束

1.9 训练到此结束Android游戏开发详解如果你已经学到了这里,恭喜你!你已经完成了进入美丽的.复杂的并且偶尔令人沮丧的编程世界的第一步.但是,在编写一些Java代码之前,你还不能自称为一名Java程序员.因此,快打开你的计算机并且开始学习第2章,在那里,我们要构建一些Java程序了.

《Android游戏开发详解》——第2章,第2.8节对象的基础知识

2.8 对象的基础知识Android游戏开发详解我们已经应用了第1章中介绍过的概念来编写和运行一些非常简单的Java程序.接下来,我们将把注意力转向对象,它使得我们能够编写更加复杂和强大的程序. 什么是对象?以你看待现实世界中的物体的方式来思考Java对象,这么做是有帮助的.对象所拥有的属性,我们称之为状态(state)和行为(behavior). 让我们以手机为例子.你的手机拥有状态,它可能是黑色的,并且可能打开了电源开关.这些属性可以帮助我们描述手机以形成其状态.手机还会有行为.它可能能够播

《Android游戏开发详解》——第3章,第3.7节里程碑

3.7 里程碑Android游戏开发详解介绍完这个示例,我们也就结束了本书的第3章和第1部分.如果你一直在学习,那么应该已经了解了编程的基础知识,掌握了Java基础并且学习了高级的面向对象设计概念.Java游戏开发就在前面,它肯定是一个巨大的挑战甚至会带来更多的兴奋. 在我们继续学习之前,我想要提醒你,Java是一种庞大的编程语言.尽管我已经试图尽可能地向你介绍在开发Java和Android游戏的时候可能会遇到的所有概念,但我还是没办法公正地对待这门语言.如果你有兴趣学习Java的更多知识以及更

《Android游戏开发详解》——第2章,第2.1节面向对象编程

2.1 面向对象编程Android游戏开发详解Java是一种面向对象编程语言.在面向对象的范型中,我们以对象的形式来表示数据,以帮助我们形成概念并沟通思路.例如,在构建视频共享Web应用程序的时候,我们可能要创建一个User对象来表示每个用户账户(及其所有的数据,例如,用户名.密码.上传的视频等).使用一个Video对象来表示每一个上传的视频,其中的很多视频都组织到一个Playlist对象中. 考虑到整洁.健壮的代码更容易阅读和理解,面向对象编程允许我们将相关的数据组织到一起.为了了解这一思路,

《Android游戏开发详解》——第2章,第2.14节隐藏变量

2.14 隐藏变量Android游戏开发详解注意,到目前位置,我们能够以两种不同的方式来修改Phone对象的状态.我们能够使用点运算符直接访问其变量,并且分配显式的值:还能够使用Phone对象提供的行为来间接地修改Phone对象的状态. 如果能够直接深入到myPhone对象,取出其信息并修改,我们说对象的变量是暴露的.从现在开始,我们将禁止暴露变量,基于很多原因,暴露变量可能会有问题. 例如,如果某人试图给一个变量分配一个非法的(或者不符合逻辑的)值,会怎么样呢?如下的代码对Java程序来说可能