《Head First Java》读书笔记day02

设计真正有用的程序--数啤酒瓶童谣的程序

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程序都定义在类中
  • 对象本身已知到的事物称为实例变量,它代表对象的状态
  • 对象可执行的动作称为方法,它代表对象的行为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值