• 2.类与对象 拜访对象村


    2.1 椅子大战

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

    面向过程

    1. rotate(shapeNum) {
    2. //旋转360°
    3. }
    4. playSound(shapeNum) {
    5. //查询播放哪个AIF文件
    6. //播放
    7. }

    面向对象:

    1. //Square类
    2. rotate() {
    3. //code to rotate a square
    4. }
    5. playSound() {
    6. //code to play the AIF file
    7. //for a square
    8. }
    9. //Circle类
    10. rotate() {
    11. //code to rotate a circle
    12. }
    13. playSound() {
    14. //code to play the AIF file
    15. //for a circle
    16. }
    17. //Triangle类
    18. rotate() {
    19. //code to rotate a triangle
    20. }
    21. playSound() {
    22. //code to play the AIF file
    23. //for a triangle
    24. }

    面向对象适应性与扩展性好,有时不需要动已经测试好的程序就可以达成新目标 

    添加amoeba,播放hif文件,绕着一端旋转。

    面向过程:

    1. rotate(shapeNum, xPt, yPt) {
    2. //如果不是阿米巴
    3. //计算中心点
    4. //然后旋转
    5. //否则
    6. //以xPt和yPt作为旋转中心
    7. //然后旋转
    8. }

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

    1. //Amoeba类
    2. int xPt
    3. int yPt
    4. rotate() {
    5. //使用阿米巴的x和y
    6. //执行旋转
    7. }
    8. playSound() {
    9. //播放
    10. }

     

    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.编写类

    1. class Dog {
    2. int size;
    3. String breed;
    4. String name;
    5. void bark() {
    6. System.out.println("Ruff! Ruff!");
    7. }
    8. }

     2.编写测试用的类

    1. class DogTestDrive {
    2. public static void main (String[] args) {
    3. //Dog测试码
    4. }
    5. }

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

    1. class DogTestDrive {
    2. public static void main (String[] args) {
    3. Dog d = new Dog();
    4. d.size = 40;
    5. d.bark();
    6. }
    7. }

     创建与测试Movie对象:

    1. public class Movie {
    2. String title;
    3. String genre;
    4. int rating;
    5. void playIt() {
    6. System.out.println("Playing the movie");
    7. }
    8. }
    9. public class MovieTestDrive {
    10. public static void main(String[] args) {
    11. Movie one = new Movie();
    12. one.title = "Gone with the Stock";
    13. one.genre = "Tragic";
    14. one.rating = -2;
    15. Movie two = new Movie();
    16. two.title = "Lost in Cubicle Space";
    17. two.genre = "Comedy";
    18. two.rating = 5;
    19. two.playIt();
    20. Movie three = new Movie();
    21. three.title = "Byte Club";
    22. three.genre = "Tragic but ultimately uplifting";
    23. three.rating = 127;
    24. }
    25. }

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

    1. public class GuessGame {
    2. Player p1;
    3. Player p2;
    4. Player p3;
    5. public void startGame() {
    6. p1 = new Player();
    7. p2 = new Player();
    8. p3 = new Player();
    9. int guessp1 = 0;
    10. int guessp2 = 0;
    11. int guessp3 = 0;
    12. boolean p1isRight = false;
    13. boolean p2isRight = false;
    14. boolean p3isRight = false;
    15. int targetNumber = (int) (Math.random() * 10);
    16. System.out.println("I'm thinking of a number between 0 and 9...");
    17. while (true) {
    18. System.out.println("Number to guess is " + targetNumber);
    19. p1.guess();
    20. p2.guess();
    21. p3.guess();
    22. guessp1 = p1.number;
    23. System.out.println("Player one guessed " + guessp1);
    24. guessp2 = p2.number;
    25. System.out.println("Player two guessed " + guessp2);
    26. guessp3 = p3.number;
    27. System.out.println("Player three guessed " + guessp3);
    28. if (guessp1 == targetNumber) {
    29. p1isRight = true;
    30. }
    31. if (guessp2 == targetNumber) {
    32. p2isRight = true;
    33. }
    34. if (guessp3 == targetNumber) {
    35. p3isRight = true;
    36. }
    37. if (p1isRight || p2isRight || p3isRight) {
    38. System.out.println("We have a winner!");
    39. System.out.println("Player one got it right? " + p1isRight);
    40. System.out.println("Player two got it right? " + p2isRight);
    41. System.out.println("Player three got it right? " + p3isRight);
    42. break; //游戏结束,中止循环
    43. } else {
    44. //都没猜到,所以要继续下去
    45. System.out.println("Players will have to try again.");
    46. } //if/else结束
    47. } //循环结束
    48. } //方法结束
    49. } //类结束
    1. public class Player {
    2. int number = 0; //要被猜的数字
    3. public void guess() {
    4. number = (int) (Math.random() * 10);
    5. System.out.println("I'm guessing " + number);
    6. }
    7. }
    1. public class GameLauncher {
    2. public static void main(String[] args) {
    3. GuessGame game = new GuessGame();
    4. game.startGame();
    5. }
    6. }
  • 相关阅读:
    Linux笔记--vi编辑器
    AI小百科 - 什么是词向量?
    (六)Selenium自动化测试实战—unittest框架
    【游戏技术】L4D 求生之路自主开发模式汇总
    学习了解nacos原理以及源码解析
    怎么下载 jar 包
    flutter 常用组件:文本、图片和按钮
    Redis的RDB与AOF持久化机制
    小学生Python编程 ——飞机大战
    【OpenGL】纹理(Texture)的使用
  • 原文地址:https://blog.csdn.net/weixin_64800741/article/details/133521367