在图形接口画出正方形、圆形与三角形。当用户选点图形时,图形需要顺时针转360°并依据形状的不同播放播放不同的AIF文件。胜者可以坐上名贵宝椅。

面向过程:
- rotate(shapeNum) {
-
- //旋转360°
- }
- playSound(shapeNum) {
-
- //查询播放哪个AIF文件
- //播放
- }
面向对象:
- //Square类
- rotate() {
- //code to rotate a square
- }
-
- playSound() {
- //code to play the AIF file
- //for a square
- }
-
- //Circle类
- rotate() {
- //code to rotate a circle
- }
-
- playSound() {
- //code to play the AIF file
- //for a circle
- }
-
- //Triangle类
- rotate() {
- //code to rotate a triangle
- }
-
- playSound() {
- //code to play the AIF file
- //for a triangle
- }
面向对象适应性与扩展性好,有时不需要动已经测试好的程序就可以达成新目标
添加amoeba,播放hif文件,绕着一端旋转。
面向过程:
- rotate(shapeNum, xPt, yPt) {
- //如果不是阿米巴
- //计算中心点
- //然后旋转
- //否则
- //以xPt和yPt作为旋转中心
- //然后旋转
- }
面向对象:加上旋转轴心点的属性(attribute)
- //Amoeba类
- int xPt
- int yPt
- rotate() {
- //使用阿米巴的x和y
- //执行旋转
- }
- playSound() {
- //播放
- }


这可称为“Square继承自Shape”,“Circle继承自Shape”等。rotate()与playSound()已经从次级的类中移开。
Shape是底下4个子类的父亲。次级类会继承上级类的方法。也就是说,子类会自动获得父类的功能。
Amoeba类可以覆盖Shape的方法,Java虚拟机知道在遇到Amoeba时使用不同的rotate()
覆盖:由子类重新定义继承下来的方法,以改变或延伸此方法的行为

设计类时,记得对象是靠类的模型塑造出来的:

对象本身已知的事物被称为:
对象可以执行的动作称为:

对象本身已知的事物称为实例变量,代表对象的状态(数据),且该类型的每一个对象都会独立的拥有一份该类型的值。
可以把对象当作实例。
对象可以执行的动作称为方法。设计类时,也会设计出操作对象数据的方法。对象带有读取或操作实例变量的方法是很常见的。如闹钟对象会有一个变量来保存响铃时间,且会有getTime()与setTime()两个方法来存取该时间。
对象带有实例变量和方法,它们都是类设计中的一部分。

类不是对象(却是用来创建它们的模型)。类是对象的蓝图,它会告诉虚拟机如何创建某种类型的对象,根据某类创建出的对象都会有自己的实例变量。如使用按钮类创建出许多大小、颜色、文字等不同的按钮。

对象就好像通讯录中的一笔数据。通讯簿的每张卡片都有相同的空白字段(实例变量)。填入新的联络人就如同创建新的实例(对象),填入卡片的数据代表联络人的状态。
这个卡片类上的方法就是你会对卡片作的事情:getTel()、changeAddress()、deleteCard()等。
所以每张卡能够执行相同的动作,但取出的结果应该是依每张卡片各自独立的。
运用对象需要两个类:一个是要被操作于对象的类(如Dog、AlarmClock和Television等),另一个是用来测试该类的类。测试用的类带有main()并且你会在其中建立与存取被测的对象。
本书后续章节的内容会有许多双类的范例。测试用的类会被命名为“受测类名称“+TestDrive。例如说要测试Bungee这个类,我们会作出一个带有main)的BungeeTestDrive。它会创建出Bungee的对象,并使用圆点(.)符号所代表的操作数来存取该对象的变量与方法。
圆点运算符(.)
此运算符能让你存取对象的状态与行为。
// 建立对象
Dog d =new Dog();
//通过操作和调用method
d.bark();
//通过操作数存取属性
d.size =40;

- class Dog {
-
- int size;
- String breed;
- String name;
-
- void bark() {
- System.out.println("Ruff! Ruff!");
- }
- }
- class DogTestDrive {
- public static void main (String[] args) {
- //Dog测试码
- }
- }
- class DogTestDrive {
- public static void main (String[] args) {
- Dog d = new Dog();
- d.size = 40;
- d.bark();
- }
- }
创建与测试Movie对象:
- public class Movie {
- String title;
- String genre;
- int rating;
-
- void playIt() {
- System.out.println("Playing the movie");
- }
- }
-
- public class MovieTestDrive {
- public static void main(String[] args) {
- Movie one = new Movie();
- one.title = "Gone with the Stock";
- one.genre = "Tragic";
- one.rating = -2;
- Movie two = new Movie();
- two.title = "Lost in Cubicle Space";
- two.genre = "Comedy";
- two.rating = 5;
- two.playIt();
- Movie three = new Movie();
- three.title = "Byte Club";
- three.genre = "Tragic but ultimately uplifting";
- three.rating = 127;
- }
- }
main()的两种用途:
真正的Java程序只会让对象与对象交互,即互相调用方法。
猜数字游戏
摘要:
这个游戏涉及到game与player两个对象。game会产生介于0~9之间的随机数字,而3个player对象会猜测该数字。
类:
GuessGame.class Player.class GameLauncher.class
程序逻辑:
(1) GameLauncher这个类带有main()方法,是应用程序的入口点。
(2)main()中会创建出GuessGame对象,并调用它的startGame()方法。
(3)startGame()方法是游戏的起点。它会创建3个player,然后挑出要猜测的随机数字。它会要求player猜测并检查结果,过程会被列出来。

- public class GuessGame {
- Player p1;
- Player p2;
- Player p3;
-
- public void startGame() {
- p1 = new Player();
- p2 = new Player();
- p3 = new Player();
-
- int guessp1 = 0;
- int guessp2 = 0;
- int guessp3 = 0;
-
- boolean p1isRight = false;
- boolean p2isRight = false;
- boolean p3isRight = false;
-
- int targetNumber = (int) (Math.random() * 10);
- System.out.println("I'm thinking of a number between 0 and 9...");
-
- while (true) {
- System.out.println("Number to guess is " + targetNumber);
-
- p1.guess();
- p2.guess();
- p3.guess();
-
- guessp1 = p1.number;
- System.out.println("Player one guessed " + guessp1);
-
- guessp2 = p2.number;
- System.out.println("Player two guessed " + guessp2);
-
- guessp3 = p3.number;
- System.out.println("Player three guessed " + guessp3);
-
- if (guessp1 == targetNumber) {
- p1isRight = true;
- }
- if (guessp2 == targetNumber) {
- p2isRight = true;
- }
- if (guessp3 == targetNumber) {
- p3isRight = true;
- }
- if (p1isRight || p2isRight || p3isRight) {
- System.out.println("We have a winner!");
- System.out.println("Player one got it right? " + p1isRight);
- System.out.println("Player two got it right? " + p2isRight);
- System.out.println("Player three got it right? " + p3isRight);
- break; //游戏结束,中止循环
- } else {
- //都没猜到,所以要继续下去
- System.out.println("Players will have to try again.");
- } //if/else结束
- } //循环结束
- } //方法结束
- } //类结束
- public class Player {
- int number = 0; //要被猜的数字
-
- public void guess() {
- number = (int) (Math.random() * 10);
- System.out.println("I'm guessing " + number);
- }
- }
- public class GameLauncher {
- public static void main(String[] args) {
- GuessGame game = new GuessGame();
- game.startGame();
- }
- }