设计真正有用的程序--数啤酒瓶童谣的程序
public class BeerSong {
public static void main (String[] args) {
int beerNum = 99;
String word = "bottles";
while(beerNum > 0){
if(beerNum == 1){
word = "bottle";
}
System.out.println(beerNum + "" + word + "of beer on the wall");
System.out.println(beerNum + "" + word + "of beer.");
System.out.println("Take one down.");
System.out.println("Pass it around.");
beerNum = beerNum - 1;
if (beerNum > 0){
System.out.println(beerNum + "" + word + "of beer on the wall");
}else {
System.out.println("No more bottles of beer on the wall");
}
}
}
}
写这段代码的时候,我的.java文件名为He'llWorld.java,运行时,报错说,Error:(22, 8) java: 类BeerSong是公共的, 应在名为 BeerSong.java 的文件中声明,IDEA给出的解决方法之一,就是Rename class "HelloWorld.java" to "BeerSong.java"。网上搜索原因有一个这样解释“你的JAVA文件名是 HelloWorld .java ,那么你这个java文件里,必须有一个 public 类型的名字是HelloWorld 的类”。先记下,学到后面再总结看到底是什么原因和注意事项。
random()这个方法会返回介于0与1之间的值。
有问题的两段程序:
A:没有类的声明,这个程序无法通过编译。
public static void mian(String [] args){
int x = 5;
while(){}
}
B:while循环必须要在方法里面
class Exerciselb {
int x = 5;
while(){}
}
第2章 类与对象
对象是靠类的模型塑造出来的:对象是已知的事物;对象会 执行的动作。
对象本身已知的事物被称为:实例变量(instance variable)
对象可以执行的动作称为:方法(methods)
类与对象的不同:
1.类不是对象(却是用来创建它们的模型);类是对象的蓝图。它会告诉虚拟机如何创建某种类型的对象。根据某类创造出的对象都会有自己的实例变量。举例来说,你可以使用按钮类来创建出许多大小、颜色、文字等不同的按钮。
创建你的第一个对象
你需要两个类。一个是要被操作于对象的类,另一个是用来测试该类的类。测试用的类带有main()并且你会在其中建立存取被测的对象。测试用的类会被命名为“受测类的名称”+TestDrive。例如说要测试Bungee这个类,我们会做出一个带有main()的BungeeTestDrive。它会创建出Bungee的对象,并使用圆点(.)符号所代表的操作数来存取该对象的变量与方法。
//建立对象
Dog d = new Dog();
//通过操作和调用method
d.bark();
//通过操作数存取属性
d.size = 40;
1.编写类
class Dog {
int size;
String bread;
String name;
void bark(){
System.out.println("wang wang wang!!!");
}
}
2.编写测试用的类
class DogTestDrive {
public static void main (String [] args){
//Dog测试码
}
}
3.在测试用的类中建立对象并存取对象的变量和方法
class DogTestDrive {
public static void main (String [] args){
Dog d = new Dog();//建立Dog对象
d.size = 40;//存取该对象的变量
d.bark();//调用它的方法
}
}
快离开main()
只要还待在main()中,你就是在对象村外。待在main()中对于一个测试用的程序来说还好的,但对于货真价实的面向对象的应用程序来说,你会需要用对象来与对象交互。
main()的两种用途:测试真正的类;启动你的Java应用程序。
真正的Java程序只会让对象与对象交互。此处所说的交互是指相互调用方法。
猜数字游戏
摘要:涉及到game和player两个对象。game产生介于0~9之间的随机数字,而3个player对象会猜测该数字。
类:GuessGame.class Player.class GameLuncher.class
程序逻辑:
1.GameLuncher这个类带有main()方法,是应用程序的入口。
2.main()中会创建出GuessGame对象,并调用它的startGame()方法。
3.startGame9)方法是游戏的起点。它会创建3个player,然后挑出要猜测的随机数字。它会要求player猜测并检查结果,过程会被列出来。
这段程序看了很久,以为没打错,也没看出什么不同,如下:
public class GuessGame(){
//...
//...
}
仔细看才发现,是类名之后加了小括号了。手敲猜数字游戏的代码如下:
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);
System.out.println("Game is over!");
break;
}else {
System.out.println("Player will have to try again.");
}
}
}
}
public class Player {
int number = 0;
public void guess(){
number = (int) (Math.random()*10);
System.out.println("I'm guessing "+ number);
}
}
public class GameLuncher {
public static void main (String[] args){
GuessGame game = new GuessGame();
game.startGame();
}
}
在IDEA中将此代码放入到GameLuncher.java中,报错,查得:“一个 *.java 文件中,只能有一个public 的类,而且这个public修饰的这类必需要和这个文件名相同”。所以,把GuessGame和Player类之前的修饰符public去掉,之后,再运行,就没有bug了。
问:若需要全局(global)变量或方法时该如何?
答:在Java的面向对象概念中没有全局变量这回事。然而实际上会有需要方法或常量(constant)可被任何的程序存取。比如说专家术语学习机中到处都在调用的random()方法或圆周率这种常数。在任何类中的任何程序都可以存取public static的方法。任何变量只要加上public、static和final,基本上都会变成全局变量取用的常数。
问:如果做出全局的函数与数据,那么怎么算得上是面向对象呢?
答:首先要注意到任何Java中的事物都必须待在类中。因此,pi常数或random()方法也必须定义在Math这个类中。而你必须记住这类近似全局的事物在Java中算是例外。它们是非常特殊的情况,不会有多个实例或对象。
要点:
- 面向对象设计扩展功能不需要改动之前已经测试好的程序代码
- 所有的Java程序都定义在类中
- 对象本身已知到的事物称为实例变量,它代表对象的状态
- 对象可执行的动作称为方法,它代表对象的行为