Author JYBlog
Email jcAuthor@163.com
本博客GitHub开源(jcNaruto/JYBlog)
JYBlog每周五,周三公众号等多平台同步更新,欢迎讨论交流~
- 子父类中不允许实例化的类可以设计为抽象类,没有实际意义的方法是其中的抽象方法。
- 接口可以看做100%的纯抽象类,在Java中被用来解决多重继承中的致命方块问题。
1.抽象类
抽象类的含义就是不应该实例化的类,例如假设Dog和Cat继承了Animal类各自重写了eat方法,因为eat行为不一样,如下
public class Animal{
public void eat(){
xxx
}
}
Animal dog = new Dog();
Animal cat = new Cat();
此时注意观察,是否可以实例化Animal,从抽象角度看,实例化Animal不合适,因为动物是抽象概念,只有下面的Dog,Cat是具体的,从代码层面看Animal的eat方法的方法体中没有特别大的意义,因为子类实现的时候,不同的子类有不同的行为,注定要重写方法。
注:
有人会疑问,Object在Java中也是抽象概念为什么可以实例化,因为许多地方需要轻量化的实例,例如保证操作原子性的锁中。
尽量少使用Object的多态,因为不安全,Java泛型的起因。
当希望某些类不应该被初始化可以使用抽象类,编译器会检查保证抽象类没有被实例化,抽象类中某些注定被重写没有意义的方法可以用抽象方法。
abstract public class AbsTest {
private String s;
public static String str;
public abstract void absTest();
public void test(){
}
}
抽象类就是用来被继承的,其中可以有抽象的方法,也可以有非抽象的方法。
子类必须用相同的方法签名和返回值类型实现所有的抽象方法。
抽象类属性不受限制。
2.接口
当我们需要两个上层父类的时候,也就是多继承的时候,会引发一个致命方块问题
Dell和Apple类继承了Computer类,都覆盖了原先的计算价格方法,因为不同的品牌有不同的计算方法,
然后Mycomputer继承了Dell,Apple调用时不知道具体调用哪个getPirce,这就是多重继承的致命方块问题,有的语言允许多重继承会定义额外的规则来消除这种模糊性,但Java直接禁止了多重继承,使用接口来解决多重继承的致命方块问题。
接口可以看成是100%的纯抽象类。所有的接口方法都是抽象的也就是不允许接口实现方法,然后在实现多个接口的过程中就不会产生不知道调用哪个父类的具体方法的致命方块问题。
public interface ITest {
public static final String str = "tset";
abstract void test1();
void test2();
}
接口中所有方法都是抽象的,可以省略abstract。
接口属性中只允许全局常量的存在。