Java面向对象知识

79 阅读1分钟

1. 接口和抽象类设计时的区别

概括:抽象类属于模板设计,子类的可以根据需要修改模板。而接口属于辐射式的设计,改动接口需要改动所有实现的类。而模板的改动可以不强制子类去实现。

经典设计例子

目前需要设计一个门,具有开关功能,可以是接口规范开关功能,也可以是抽象类。 但是如果目前新增一个报警功能呢?

abstract class Door {
    public abstract void open();
    public abstract void close();
}
interface Door {
    public void open();
    public void close();
}

如果新增在Door接口,需要强制其他子类都实现alarm()功能,但是不是所有的门都具备报警。同样,放在抽象类也不太合适,这时候就需要新增一个接口, 可以看出一个接口规范出了一组行为。

interface Alram {
    void alarm();
}
abstract class Door {
    void open();
    void close();
}
class AlarmDoor extends Door implements Alarm {
    void oepn() {
      //....
    }
    void close() {
      //....
    }
    void alarm() {
      //....
    }
}

参考

www.cnblogs.com/dolphin0520…

2. 子类和父类之间的转化

  • 子类转父类,满足多态但是只能调用父类定义的功能。
  • 父类转子类,对象本身需要是子类new出来的,否则会编译不过。
package oop;

import org.junit.jupiter.api.Test;

import java.util.logging.Logger;

public class TestOOP {
    private static final String TAG = "TestOOP";
    static Logger log = Logger.getLogger("TestOOP");

    @Test
    public void testOOP() {
        // case 1
        Animal animal = new Cat();
        // case 2 upward transformation
        Animal cat = (Animal) new Cat();
        cat.print();
        // case 3 doward transformation, error
        // Cat cat1 = (Cat) new Animal();
        // cat1.print();
        // case 4
        Cat cat2 = (Cat) cat;
        cat2.run();
    }

    class Animal {
        public void print() {
            log.info("i am animal");
        }
    }

    class Cat extends Animal {
        public void print() {
            log.info("i am cat");
        }

        public void run() {
            log.info("running ");
        }
    }
}