目录
- 6 综合编程题
- 7 成员内部类应用
- 8 枚举类 & switch
6 综合编程题
3. 交通工具工厂类:由于在任务中只需要调用其中获得交通工具的方法,可以将方法定义为静态方法,这样就不用先创建工厂类的对象,直接“类名.方法” 即可。为了不让其创建对象,可以将其构造器私有化。
5.一般情况下用Horse作为交通工具,遇到大河时用Boat作为交通工具:编程思路——可以把具体的要求,封装成方法
由于在创建“唐僧”的时候要给他一个交通工具,所以在后来赋值目标交通工具的时候,需要先判断当前对象有没有目标交通工具,可以使用instanceof
对当前交通工具进行判断,如果不是目标交通工具,再进行申请。
另外根据常识,马通常始终都是特定的一匹,但船每一次都不同,所以马可以在工厂类中使用**“饿汉式”创建静态对象**,并且需要马的时候每次返回该特定对象;而船每次需要重新创建对象。
*.拓展:过火焰山坐飞机。出于方便加上只过一次火焰山的考虑,我选择直接使用匿名类。
package com.hspedu.chapter10homework06;
public class Homework06 {
public static void main(String[] args) {
Person person = new Person("唐僧", Factory.getHorse());
person.common();
person.passRiver();
person.common();
person.passFire();
}
}
interface Vehicles {
public void work();
}
class Horse implements Vehicles {
@Override
public void work() {
System.out.println("horse");
}
}
class Boat implements Vehicles {
@Override
public void work() {
System.out.println("boat");
}
}
class Factory {
private static Horse HORSE = new Horse();
public static Horse getHorse() {
return HORSE;
}
public static Boat getBoat() {
return new Boat();
}
}
class Person {
private String name;
private Vehicles vehicles;
public Person(String name, Vehicles vehicles) {
this.name = name;
this.vehicles = vehicles;
}
public void passRiver() {
if (!(vehicles instanceof Boat))
vehicles = Factory.getBoat();
vehicles.work();
}
public void common() {
if (!(vehicles instanceof Horse))
vehicles = Factory.getHorse();
vehicles.work();
}
public void passFire() {
vehicles = new Vehicles() {
@Override
public void work() {
System.out.println("flight");
}
};
}
}
7 成员内部类应用
如果想要基于创建的类Car的对象car,调用Car的成员内部类Air,可以创建一个方法返回在car基础上的Air对象。
一开始自己傻了吧唧想在Car里创建一个静态Air对象,但回头想想,岂不是意味着Car类加载之后直接就确定了Air对象,并且所有Car对象的Air对象都会是同一个……
package com.hspedu.chapter10homework07;
public class Homework07 {
public static void main(String[] args) {
Car car1 = new Car(-0.1);
Car car2 = new Car(40.1);
Car car3 = new Car(12);
car1.getAir().flow();
car2.getAir().flow();
car3.getAir().flow();
}
}
class Car {
private double temperature;
private Air air = new Air();
public Car(double temperature) {
this.temperature = temperature;
}
public class Air {
public void flow() {
if (temperature > 40)
System.out.println("flow cold air...");
else if (temperature < 0)
System.out.println("flow warm air...");
else
System.out.println("shut down...");
}
}
public Air getAir() {
return air;
}
}
8 枚举类 & switch
switch的枚举类型之一是枚举类。不废话上代码:
package com.hspedu.chapter10homework08;
public class Homework08 {
public static void main(String[] args) {
Color[] colors = Color.values();
for (Color color: colors) {
System.out.println(color.ordinal()); // 可以输出序号
switch (color) {
case RED:
System.out.print("RED: ");
color.show();
break;
case BLUE:
System.out.print("BLUE: ");
color.show();
break;
case BLACK:
System.out.print("BLACK: ");
color.show();
break;
case YELLOW:
System.out.print("YELLOW: ");
color.show();
break;
case GREEN:
System.out.print("GREEN: ");
color.show();
break;
default:
System.out.println("No such color");
break;
}
}
}
}
interface IF {
public void show();
}
enum Color implements IF {
RED(255, 0, 0), BLUE(0, 0, 255), BLACK(0, 0, 0),
YELLOW(255, 255, 0), GREEN(0, 255, 0);
private double redValue, greenValue, blueValue;
Color(double redValue, double greenValue, double blueValue) {
this.redValue = redValue;
this.greenValue = greenValue;
this.blueValue = blueValue;
}
@Override
public void show() {
System.out.println(redValue + " " + greenValue + " " + blueValue);
}
}