第 7 单元:字符串和运算符;第 8 单元:条件运算符和控制语句; 第 9 单元:循环

测试您的理解情况

返回到 第 9 单元

  1. 第 7 单元 中,在 getName() 实现中使用 concat() 方法演示了方法链。使用字符串串联(通过 + 运算符)实现 getName() 方法。编写一个 JUnit 测试来确保结果符合预期。
    package com.makotojava.intro.unit7;
    
    import java.util.logging.Logger;
    
    public class Person {
       
       Logger l = Logger.getLogger(Person.class.getName());
       
       //private String name;
       private String lastName;
       private String firstName;
       private int age;
       private int height;
       private int weight;
       private String eyeColor;
       private String gender;
       
       public Person(String firstName, String lastName, int age, int height, int weight, String eyeColor, String gender) {
          this.firstName = firstName;
          this.lastName = lastName;
          this.age = age;
          this.height = height;
          this.weight = weight;
          this.eyeColor = eyeColor;
          this.gender = gender;
       }
       
       // This is a "derived" method. That is, there is no 1:1 mapping between it and
       /// an attribute.
       public String getFullName() {
          return getFirstName() + " " + getLastName();
       }
    
       public String getLastName() {
          return lastName;
       }
    
       public void setLastName(String lastName) {
          this.lastName = lastName;
       }
    
       public String getFirstName() {
          return firstName;
       }
    
       public void setFirstName(String firstName) {
          this.firstName = firstName;
       }   public int getAge() {
          return age;
       }
       public void setAge(int age) {
          this.age = age;
       }
       public int getHeight() {
          return height;
       }
       public void setHeight(int height) {
          this.height = height;
       }
       public int getWeight() {
          return weight;
       }
       public void setWeight(int weight) {
          this.weight = weight;
       }
       public String getEyeColor() {
          return eyeColor;
       }
       public void setEyeColor(String eyeColor) {
          this.eyeColor = eyeColor;
       }
       public String getGender() {
          return gender;
       }
       public void setGender(String gender) {
          this.gender = gender;
       }
       
       public String toString() {
          String ret = "Full Name: " + getFullName() + ", " +
                  "Height: " + getHeight() + ", " +
                  "Weight: " + getWeight() + ", " +
                  "Eye Color: " + getEyeColor() + ", " +
                  "Gender: " + getGender();
    
               return ret;
       }
    
    }
    JUnit test:
    package com.makotojava.intro.unit7;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.Test;
    
    public class PersonTest {
    
       @Test
       public void testGetFullName() {
          // Note: use of new constructor with first and last name parameters
          Person p = new Person("John", "Doe", 24, 180, 78, "Blue", "MALE");
          
          String fullName = p.getFullName();
          
          assertEquals("John Doe", fullName);
       }
    
    }
  2. 哪个(哪些)运算符是二元运算符?
    1. ++
    2. +
    3. %
    4. --
    5. +=
    6. a、b 和 d
    7. b、c 和 e
    8. 上述选项都不是
  3. 字符串串联 表示组合两个或更多字符串的内容形成一个更大的字符串。
  4. 以下哪个语句表示 “如果 a 小于或等于 b”?
    1. if (a lt b)
    2. if (b < a)
    3. if (b +< a)
    4. if (a <= b)
    5. 上述选项都不是
  5. 执行以下代码块后,变量 c 的值是多少?解释您的答案。

       public int method1() {
          int a = 10;
          int b = 7;
          int c = 0;
          
          if (b >= a)
             c++;
             b = -47;
          if (b > c)
             c = b;
          
          return c;
       }
    答案: c == 0。 如果第一个 if 语句的条件为 true,那么似乎加粗行是代码块执行的一部分,但事实并非如此。 它仅仅是缩进,并且因此每次都执行。因为 b 现在是 -47,在下一个 if 语句求值的结果为 false。 所以变量 c 的值不会改变仍是它的初始值 0。综上所述,该方法的返回值是 0。
  6. 以下代码是否会被编译?解释您的答案。

       public int method2() {
          int a = 0;
          
          if (a > 0) {
             int b = a;
          }
          
          int c = b;
          
          return c;
       }
    答案: 否。代码将不会被编译。在块内部申明的变量 b 是超出范围的,然后将 b 赋值给变量 c,它是超出 范围的,所以代码将生成一个错误信息。
  7. 执行以下代码块后,变量 c 的值是多少?解释您的答案。

       public boolean method3() {
          boolean a = true;
          boolean b = false;
          boolean c;
          
          if (a = b)
             c = false;
          else
             c = a;
          
          return c;
       }
    答案: 返回值是 false。在 if 代码块中,它看起来像是 a 与 b 比较,事实上,是将 b 赋值给 a。 关于 boolean 值的分配(比如这里的 a=b)总是返回 true,所以变量 c 发生了 false 的分配。 代码中加粗部分正确的格式应该是 if(a==b)
  8. for 循环始终 至少执行一次。
  9. 在循环的底部检查确定 do...while 循环是否继续执行的条件。
  10. 编写一个包含 for 循环的方法,该循环从 3 开始,循环 6 次,并使用 JDK Logger 输出迭代次数(从 1 开始)及当前循环变量。使用 清单 1 作为使用 Logger 的示例。使用您的 Logger 输出验证结果。

    public class Unit9 {
       private static final Logger log = Logger.getLogger(Unit9.class.getName());
       
       public void problem10() {
          for (int aa = 3, iterationNumber = 1; iterationNumber <= 6; aa++, iterationNumber++) {
             log.info("Iteration# " + iterationNumber + ", Loop variable: " + aa);
          }
       }
    }
  11. 使用不同的方法名重复问题 10 中的练习,但这次使用一个 while 循环。使用您的 Logger 输出验证结果。

    public class Unit9 {
       private static final Logger log = Logger.getLogger(Unit9.class.getName());
    
       public void problem11() {
          int aa = 3;
          int iterationNumber = 1;
          
          while (iterationNumber <= 6) {
             log.info("Iteration# " + iterationNumber + ", Loop variable: " + aa);
             aa++;
             iterationNumber++;
          }
       }
    }
  12. 使用 do...while 循环重复问题 10 中的练习。使用您的 Logger 输出验证结果。

    public class Unit9 {
       private static final Logger log = Logger.getLogger(Unit9.class.getName());
    
       public void problem12() {
          int aa = 3;
          int iterationNumber = 1;
          
          do {
             log.info("Iteration# " + iterationNumber + ", Loop variable: " + aa);
             aa++;
             iterationNumber++;
          } while (iterationNumber <=6);
       }
    }
  13. 编写一个包含 for 循环的方法,该循环从零 (0) 开始,循环十 (10) 次,并使用 JDK Logger 类输出迭代次数(从 1 开始)及当前循环变量。跳过第 4、5 和 9 次迭代。使用您的 Logger 输出验证结果。

    public class Unit9 {
       private static final Logger log = Logger.getLogger(Unit9.class.getName());
    
       public void problem13() {
          for (int aa = 0, iterationNumber = 1; aa < 10; aa++, iterationNumber++) {
             if (iterationNumber == 4 || iterationNumber == 5 || iterationNumber == 9) {
                log.info("Iteration# " + iterationNumber + " **SKIPPED**");
                continue;
             }
             log.info("Iteration# " + iterationNumber + ", Loop variable: " + aa);
          }
       }
    }

JUnit Test - Unit9Test.java:

package com.makotogo.learn;

import org.junit.Test;

public class Unit9Test {

   @Test
   public void testProblem10() {
      Unit9 testclass = new Unit9();
      
      testclass.problem10();
   }
   
   @Test
   public void testProblem11() {
      Unit9 testclass = new Unit9();
      
      testclass.problem11();
   }
   
   @Test
   public void testProblem12() {
      Unit9 testclass = new Unit9();
      
      testclass.problem12();
   }
   
   @Test
   public void testProblem13() {
      Unit9 testclass = new Unit9();
      
      testclass.problem13();
   }

}

返回到 第 9 单元