《Android游戏开发详解》一2.15 改进程序
本节书摘来异步社区《Android游戏开发详解》一书中的第2章,第2.15节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.15 改进程序Android游戏开发详解
让我们记住上面的原理,并且努力地改进程序。首先,添加一个内建的Java关键字private作为所有Phone对象的变量的修饰符,如程序清单2.14第4行到第7行所示。
程序清单2.14 隐藏Phone类中的变量
01 public class Phone { 03 // These variables describe the Phone objects state 04 private boolean poweredOn; 05 private boolean playingMusic; 06 private String phoneManufacturer; 07 private double androidVersionNumber; 09 // These methods are the Phone objects 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; 19 } // ends togglePower method 21 void playMusic() { 22 if (poweredOn) { 23 System.out.println("Playing music!"); 25 } // ends playMusic method 27 void upgrade(double newVersion) { 28 if (newVersion androidVersionNumber) { 29 androidVersionNumber = newVersion; 30 } else { 31 System.out.println("Upgrade failed!"); 33 } // ends upgrade method 35 } // ends class
让变量成为private的,意味着其他的类不再能够直接访问它们,也意味着这些变量不再是暴露的了。因此,你将会看到World类中出现错误,如图2-21所示(不能直接引用不同的类中的一个private的变量)。
程序目前有所谓的编译时错误(发生在代码编译过程中的错误,参见图2-18以及后续的介绍)。有编译时错误的程序无法运行。JVM甚至不会接受这种程序。让我们删除引发错误的所有代码行,如程序清单2.15所示(在删除的所有代码行上,都有一条删除线)。
Picture 8
图2-21 一个严重错误
程序清单2.15 World.java——删除错误代码
01 public class World { 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; 11 System.out.println("myPhones 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); 17 myPhone.togglePower(); 18 myPhone.upgrade(4.5); 20 // include “\n” to skip a line when printing. 21 System.out.println("\nmyPhones 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);
要执行这一清理工作,我们必须删除程序的两项功能。我们不再能够为Phone对象的变量赋初始值,并且不再能够访问这些变量以打印出它们。我们可以通过在Phone类中提供方法来执行这些任务,从而以更高效的方式来实现这些功能。
让我们给Phone类添加两个新的方法:initialize()和describe(),如程序清单2.16所示,并且为playingMusic和androidVersionNumber变量提供初始值(如程序清单2.16的第5行和第7行所示)。
程序清单2.16 Phone.java——更新版本(新的代码行突出显示)
01 public class Phone { 03 // These variables describe the Phone objects state 04 private boolean poweredOn; 05 private boolean playingMusic = false; 06 private String phoneManufacturer; 07 private double androidVersionNumber = 4.4; 09 // These methods are the Phone objects behaviors 10 void initialize(boolean poweredOn, String phoneManufacturer) { 11 this.poweredOn = poweredOn; 12 this.phoneManufacturer = phoneManufacturer; 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; 24 } 26 void playMusic() { 27 if (poweredOn) { 28 System.out.println("Playing music!"); 30 } 32 void upgrade(double newVersion) { 33 if (newVersion androidVersionNumber) { 34 androidVersionNumber = newVersion; 35 } else { 36 System.out.println("Upgrade failed!"); 38 } 40 void describe() { 41 System.out.println("\nPhones 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); 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行。
Picture 28
图2-22 相同名称,不同所有者
程序清单2.17 World.java——调用新的方法
01 public class World { 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();
相应的输出如下所示。
Hello, world! Phones state: Powered on: false Playing music: false Manufacturer: Samsung Version: 4.4 Powering on! Phones state: Powered on: true Playing music: false Manufacturer: Samsung Version: 4.5
Android程序签名打包 Android APP都需要我们用一个证书对应用进行数字签名,不然的话是无法安装到Android手机上的,平时我们调试运行时到手机上时,是AS会自动用默认的密钥和证书来进行签名;但是我们实际发布编译时,则不会自动签名,这个时候我们就需要进行手动签名了!
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- Android开发之触摸事件处理机制详解
- [Android Pro] android Flag介绍
- Android_(游戏)打飞机03:控制玩家飞机
- Android游戏开发基本知识
- 《android开发艺术探索》读书笔记(十一)--Android的线程和线程池
- 【ANDROID游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SURFACEVIEW中添加组件方案!
- 【IOS-COCOS2D-X 游戏开发之十三】详细讲解在XCODE中利用预编译并通过JNI调用ANDROID的JAVA层代码(COCOS2DX里访问调用ANDROID函数)!
- android studio快捷键
- 【Android】android studio ndk使用例子
- android 动画基础绘——view 动画(二)[补]
- 《Android进阶指北》强势来袭,堪称2022保姆级学习路线
- Android 编译之android.bp详解
- android服务概要介绍
- Android TextureView+SurfaceTexture实现相机预览
- Android 获取TARGET_OUT的值
- Android 9.0 10.0 去掉开机提示 android is starting 的对话框
- android 9.0系统重启的代码详解
- 【Android 异步操作】AsyncTask 异步任务 ( AsyncTask 异步任务执行方法 execute 方法相关源码解析 )
- OS和android游戏纹理优化和内存优化(cocos2d-x)
- 【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
- Android 使用 DownloadManager 管理系统下载任务的方法,android管理系统
- Android修改kernel logo和开机动画(android)
- android捕获程序异常退出
- 【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
- Android培训班(3)
- Android培训班(5)
- 如何解决Android Studio的import android.support.v7.widget.RecyclerView的RecyclerView标红问题
- Android App版本更新知识总结
- Android ffmpeg支持x264的编译脚本
- Android Audio BSP工程师 需要清楚的基本知识点
- 迁移到Android后android.support.v4.content.FileProvider运行崩溃