古法编程java之oop练习题

古法编程java之oop练习题
古法编程java之oop练习题

其他内容参见 JAVA学习记录总贴

本期是oop的简单练习,确实都很简单,主要负责熟手

第一题

public static void main(String[] args) {
    Car c = new Car();
    Car car = new Car(100);
    System.out.println(c);
    System.out.println(car);
}
​
class Car {
    double price = 10;
    static String color = "white";
​
    public String toString() {
        return price + "\t" + color;
    }
​
    public Car(){
        this.price = 9;
        this.color = "black";
    }
​
    public Car(double price){
        this.price = price;
    }
}

答案:

9.0 black
100.0   black

分析:

这道题应该挺好理解的。
​
注意 color 是一个静态变量,在第一次 new Car 的时候,static变量 就已经被修改了。
​
所以,最后两个实例的静态变量都是 black。

第二题

不难,纯粹练手

  1. 在Frock类中声明私有的静态属性currentNum[int类型],初始值为100000,作为衣服出厂的序列号起始值。

  2. 声明公有的静态方法getNextNum,作为生成上衣唯一序列号的方法。每调用一次,将currentNum增加100,并作为返回值。

  3. 在Homework02类的main方法中,分两次调用getNextNum方法,获取序列号并打印输出。

  4. 在Frock类中声明serialNumber(序列号)属性,并提供对应的get方法。

  5. 在Frock类的构造器中,通过调用getNextNum方法为Frock对象获取唯一序列号,赋给serialNumber属性。

  6. 在Homework02类的main方法中,分别创建三个Frock 对象,并打印三个对象的序列号,验证是否为按100递增。

答案:

package hspedu.homework;
​
public class Homework02 {
    public static void main(String[] args) {
        System.out.println(Frock.getNextNum());
        System.out.println(Frock.getNextNum());
​
        Frock f1 = new Frock();
        System.out.println(f1.getSerialNumber());
​
        Frock f2 = new Frock();
        System.out.println(f2.getSerialNumber());
​
        Frock f3 = new Frock();
        System.out.println(f3.getSerialNumber());
    }
}
​
class Frock {
    private static int currentNum = 100000;
    private int serialNumber;
​
    public static int getNextNum() {
        currentNum += 100;
        return currentNum;
    }
​
    public Frock() {
        serialNumber = getNextNum();
    }
​
    public int getSerialNumber() {
        return serialNumber;
    }
}

第三题

一个简单的多态练习,题干如下

  1. 动物类Animal包含了抽象方法 shout();

  2. Cat类继承了Animal,并实现方法shout,打印“猫会喵喵叫”

  3. Dog类继承了Animal,并实现方法shout,打印“狗会汪汪叫”

  4. 在测试类中实例化对象Animal cat = new Cat(),并调用cat的shout方法

  5. 在测试类中实例化对象Animal dog = new Dog(),并调用dog的shout方法

答案:

public class Homework03 {
    public static void main(String[] args) {
        Animal cat = new Cat();
        cat.shout();
        Animal dog = new Dog();
        dog.shout();
    }
}
​
abstract class Animal{
    abstract void shout();
}
​
class Cat extends Animal{
    @Override
    void shout() {
        System.out.println("猫会喵喵叫");
    }
}
​
class Dog extends Animal{
    @Override
    void shout() {
        System.out.println("狗会汪汪叫");
    }
}

第四题

  1. 计算器接口具有 work 方法,功能是运算,有一个手机类 Cellphone,定义方法 testWork 测试计算功能,调用计算接口的 work 方法

  2. 要求调用 CellPhone 对象 的 testWork 方法,使用上匿名内部类

答案:

ps:设计匿名内部类,建议还是认真写一下

public class Homework04 {
    public static void main(String[] args) {
        Cellphone cellphone = new Cellphone();
        Calculator cal = new Calculator() {
            @Override
            public void work(int a, int b) {
                System.out.println(a + b);
            }
        };
        cellphone.testWork(cal, 7, 8);
    }
}
​
interface Calculator {
    void work(int a, int b);
}
​
class Cellphone {
    public void testWork(Calculator calculator, int a, int b) {
        System.out.println("测试计算功能");
        calculator.work(a, b);
    }
}

第五题

  1. 编一个类 A,在类中定义局部内部类 B,B 中有一个私有常量 name,有一个方法 show () 打印常量 name。进行测试

  2. 进阶:A 中也定义一个私有的变量 name,在 show 方法中打印测试

答案:a piece of cake

public class Homework05 {
    public static void main(String[] args) {
        new A().new B().show();
    }
}
​
class A{
    private final String name = "AAA";
    class B{
        private final String name = "BBB";
        public void show(){
            System.out.println(name);
            System.out.println(A.this.name);
        }
    }
}

第六题

  1. 有一个交通工具接口类Vehicles,有work接口

  2. 有Horse类和Boat类分别实现Vehicles

  3. 创建交通工具工厂类,有两个方法分别获得交通工具Horse和Boat

  4. 有Person类,有name和Vehicles属性,在构造器中为两个属性赋值

  5. 实例化Person对象“唐僧”,要求一般情况下用Horse作为交通工具,遇到大河时用Boat作为交通工具

  6. 额外:使用匿名内部类,增加一个用飞机过火焰山的方法,因为只用一次,因此不要写一个新的类

答案:

public class Homework06 {
    public static void main(String[] args) {
        Person tang = new Person("唐僧", null);
        tang.passRiver();
        tang.common();
        tang.passRiver();
        tang.passMountain();
    }
}
​
interface Vehicles {
    void work();
}
​
class Horse implements Vehicles {
    @Override
    public void work() {
        System.out.println("horse is working");
    }
}
​
class Boat implements Vehicles {
    @Override
    public void work() {
        System.out.println("boat is working");
    }
}
​
class Plane implements Vehicles {
    @Override
    public void work() {
        System.out.println("plane is working");
    }
}
​
class Factory {
    private static final Horse HORSE = new Horse();
    private static final Boat BOAT = new Boat();
    private static final Plane PLANE = new Plane();
​
    public static Horse getHorse() {
        return HORSE;
    }
​
    public static Boat getBoat() {
        return BOAT;
    }
​
    public static Plane getPlane() {
        return PLANE;
    }
}
​
class Person {
    private String name;
    private Vehicles vehicle;
​
    public Person(String name, Vehicles vehicle) {
        this.name = name;
        this.vehicle = vehicle;
    }
​
    public void setVehicle(Vehicles vehicle) {
        this.vehicle = vehicle;
    }
​
​
    public void passRiver() {
        if (!(vehicle instanceof Boat)) {
            vehicle = Factory.getBoat();
        }
        vehicle.work();
    }
​
    public void common() {
        if (!(vehicle instanceof Horse)) {
            vehicle = Factory.getHorse();
        }
        vehicle.work();
    }
​
    public void passMountain() {
        vehicle = new Vehicles(){
            @Override
            public void work() {
                System.out.println("plane is working");
            }
        };
        vehicle.work();
    }
}

简要分析:

  • 用懒汉式单例,保证只创建一个船和马对象,节省资源

  • vehicle instanceof Horse 来判断具体情况

第七题

有一个 Car 类,有属性 temperature(温度),车内有 Air(空调)类,有吹风的功能 flow,Air 会监视车内的温度,如果温度超过 40 度则吹冷气。如果温度低于 0 度则吹暖气,如果在这之间则关掉空调。实例化具有不同温度的 Car 对象,调用空调的 flow 方法,测试空调吹的风是否正确。

public class Homework07 {
    public static void main(String[] args) {
        Car car = new Car(42);
        Car.Air air = car.getAir();
        air.flow();
        Car car1 = new Car(2);
        Car.Air air1 = car1.getAir();
        air1.flow();
        Car car2 = new Car(-1);
        Car.Air air2 = car2.getAir();
        air2.flow();
    }
}
​
class Car{
    private double temperature;
​
    public Car(double temperature) {
        this.temperature = temperature;
    }
​
    class Air{
        public void flow(){
            if(temperature > 40){
                System.out.println("吹冷风");
            } else if(temperature < 0){
                System.out.println("吹暖风");
            } else {
                System.out.println("关闭空调");
            }
        }
    }
​
    public Air getAir(){
        return new Air();
    }
}

第八题

  1. 创建一个Color枚举类

  2. 有 RED,BLUE,BLACK,YELLOW,GREEN这五个枚举值/对象;

  3. Color有三个属性redValue, greenValue, blueValue,

  4. 创建构造方法,参数包括这三个属性,

  5. 每个枚举值都要给这三个属性赋值,三个属性对应的值分别是

  6. red: 255,0,0 blue:0,0,255 black:0,0,0 yellow:255,255,0 green:0,255,0

  7. 定义接口,里面有方法show,要求Color实现该接口

  8. show方法中显示三属性的值

  9. 将枚举对象在switch语句中匹配使用

1 个帖子 - 1 位参与者

阅读完整话题

来源: LinuxDo 最新话题查看原文