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

简介:

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

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所示(在删除的所有代码行上,都有一条删除线)。


e000be3b8edac5d2becde74d46ef871796974e67
程序清单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行。


ac4a20db67e819867080633cd29ddb13aad6a24c

程序清单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
相关文章
|
6月前
|
存储 传感器 定位技术
《移动互联网技术》 第四章 移动应用开发: Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序
《移动互联网技术》 第四章 移动应用开发: Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序
64 0
|
6月前
|
Java Android开发 开发者
1024程序节|Android框架之一 BRVAH【BaseRecyclerViewAdapterHelper】使用demo
BRVAH是一个强大的RecyclerAdapter框架(什么是RecyclerView?),它能节约开发者大量的开发时间,集成了大部分列表常用需求解决方案。为什么会有它?请查看「Android开源框架BRVAH由来篇」该框架于2016年4月10号发布的第1个版本到现在已经一年多了,经历了800多次代码提交,140多次版本打包,修复了1000多个问题,获得了9000多star,非常感谢大家的使用以及反馈。
138 0
|
4月前
|
网络协议 Android开发 虚拟化
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
59 0
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
|
6月前
|
测试技术 开发工具 数据库
《移动互联网技术》第十一章 Android应用工程案例: 掌握Android系统的需求分析和设计以及 Android项目的程序测试和版本管理方法
《移动互联网技术》第十一章 Android应用工程案例: 掌握Android系统的需求分析和设计以及 Android项目的程序测试和版本管理方法
71 0
|
8月前
|
XML Java Android开发
#4,Android Studio Android程序结构 工程目录介绍 文件作用 运行配置文件AndroidManifest.xml
#4,Android Studio Android程序结构 工程目录介绍 文件作用 运行配置文件AndroidManifest.xml
|
8月前
|
存储 Android开发 开发者
#2,Android新建第一个程序 Hello Android 模拟手机
#2,Android新建第一个程序 Hello Android 模拟手机
|
8月前
|
Android开发
Android JetPack组件之ViewModel状态的保存(程序在后台被系统杀死数据也存活)
Android JetPack组件之ViewModel状态的保存(程序在后台被系统杀死数据也存活)
98 0
|
Android开发
【Android 逆向】代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )
【Android 逆向】代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )
150 0
|
Android开发
【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
254 0
【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )
|
Java Android开发 关系型数据库
Android Studio运行Hello World程序
老的神舟本本装上了深度LINUX了。。。应该是基于ubuntu的,安装软件用的apt-get而不是yum 想重装学下android原生开发,官网下载了android studio, 发现不用FQ也能下载了,不错不错,支持支持 下载后解压了直接双击那个Android Studio.sh运行就行了,新建一个hello world项目,结果运行不起来,那个调试那个地方都没有绿色三角形, 想了下,好像没有装JAVA,又上ORACLE上下载了JAVA的安装,结果又总是下不了,晕。
1735 0