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() {
//....
}
}
参考
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 ");
}
}
}