2.1 椅子大战
在图形接口画出正方形、圆形与三角形。当用户选点图形时,图形需要顺时针转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() {
//播放
}
2.2 继承(inheritance)
1.找出4个类中共同的部分:
2.它们都是Shape,而且都有rotate与playSound,因此可以提取出新的类:
3.将4个形状体以称为继承的关系连接到Shape这个类:
这可称为“Square继承自Shape”,“Circle继承自Shape”等。rotate()与playSound()已经从次级的类中移开。
Shape是底下4个子类的父亲。次级类会继承上级类的方法。也就是说,子类会自动获得父类的功能。
2.3 覆盖(override)
Amoeba类可以覆盖Shape的方法,Java虚拟机知道在遇到Amoeba时使用不同的rotate()
覆盖:由子类重新定义继承下来的方法,以改变或延伸此方法的行为
4.让Amoeba类去覆盖rotate()与playSound()这两个父类的方法
2.4 什么是类?
设计类时,记得对象是靠类的模型塑造出来的:
- 对象是已知的事物
- 对象会执行的动作
对象本身已知的事物被称为:
- 实例变量(instance variable)
对象可以执行的动作称为:
- 方法(methods)
对象本身已知的事物称为实例变量,代表对象的状态(数据),且该类型的每一个对象都会独立的拥有一份该类型的值。
可以把对象当作实例。
对象可以执行的动作称为方法。设计类时,也会设计出操作对象数据的方法。对象带有读取或操作实例变量的方法是很常见的。如闹钟对象会有一个变量来保存响铃时间,且会有getTime()与setTime()两个方法来存取该时间。
对象带有实例变量和方法,它们都是类设计中的一部分。
类不是对象(却是用来创建它们的模型)。类是对象的蓝图,它会告诉虚拟机如何创建某种类型的对象,根据某类创建出的对象都会有自己的实例变量。如使用按钮类创建出许多大小、颜色、文字等不同的按钮。
对象就好像通讯录中的一笔数据。通讯簿的每张卡片都有相同的空白字段(实例变量)。填入新的联络人就如同创建新的实例(对象),填入卡片的数据代表联络人的状态。
这个卡片类上的方法就是你会对卡片作的事情:getTel()、changeAddress()、deleteCard()等。
所以每张卡能够执行相同的动作,但取出的结果应该是依每张卡片各自独立的。
2.5 创建你的第一个对象
运用对象需要两个类:一个是要被操作于对象的类(如Dog、AlarmClock和Television等),另一个是用来测试该类的类。测试用的类带有main()并且你会在其中建立与存取被测的对象。
本书后续章节的内容会有许多双类的范例。测试用的类会被命名为“受测类名称“+TestDrive。例如说要测试Bungee这个类,我们会作出一个带有main)的BungeeTestDrive。它会创建出Bungee的对象,并使用圆点(.)符号所代表的操作数来存取该对象的变量与方法。
圆点运算符(.)
此运算符能让你存取对象的状态与行为。
// 建立对象
Dog d =new Dog();
//通过操作和调用method
d.bark();
//通过操作数存取属性
d.size =40;
1.编写类
class Dog {
int size;
String breed;
String name;
void bark() {
System.out.println("Ruff! Ruff!");
}
}
2.编写测试用的类
class DogTestDrive {
public static void main (String[] args) {
//Dog测试码
}
}
3.在测试用的类中建立对象并存取对象的变量和方法
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;
}
}
2.6 使用main()
main()的两种用途:
- 测试真正的类
- 启动你的Java程序
真正的Java程序只会让对象与对象交互,即互相调用方法。
2.7 猜数字
猜数字游戏
摘要:
这个游戏涉及到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();
}
}