2.类与对象 拜访对象村

2.1 椅子大战

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

面向过程:

java 复制代码
rotate(shapeNum) {

    //旋转360°
}
playSound(shapeNum) {

    //查询播放哪个AIF文件
    //播放
}

面向对象:

java 复制代码
//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文件,绕着一端旋转。

面向过程:

java 复制代码
rotate(shapeNum, xPt, yPt) {
//如果不是阿米巴
    //计算中心点
    //然后旋转
//否则
    //以xPt和yPt作为旋转中心
    //然后旋转
}

面向对象:加上旋转轴心点的属性(attribute)

java 复制代码
//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.编写类

java 复制代码
class Dog {

    int size;
    String breed;
    String name;

    void bark() {
        System.out.println("Ruff! Ruff!");
    }
}

2.编写测试用的类

java 复制代码
class DogTestDrive {
    public static void main (String[] args) {
        //Dog测试码
    }
}

3.在测试用的类中建立对象并存取对象的变量和方法

java 复制代码
class DogTestDrive {
    public static void main (String[] args) {
        Dog d = new Dog();
        d.size = 40;
        d.bark();
    }
}

创建与测试Movie对象:

java 复制代码
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猜测并检查结果,过程会被列出来。

java 复制代码
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结束
        } //循环结束
    } //方法结束
} //类结束
java 复制代码
public class Player {
    int number = 0; //要被猜的数字

    public void guess() {
        number = (int) (Math.random() *  10);
        System.out.println("I'm guessing " + number);
    }
}
java 复制代码
public class GameLauncher {
    public static void main(String[] args) {
        GuessGame game = new GuessGame();
        game.startGame();
    }
}
相关推荐
WaaTong2 分钟前
Java反射
java·开发语言·反射
Troc_wangpeng3 分钟前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的5 分钟前
解析json导出csv或者直接入库
开发语言·python·json
Envyᥫᩣ19 分钟前
C#语言:从入门到精通
开发语言·c#
九圣残炎36 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge38 分钟前
Netty篇(入门编程)
java·linux·服务器
童先生40 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu41 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会1 小时前
Qt第三课 ----------容器类控件
开发语言·qt