JDK种三大特殊类:Object string 包装类
其中Object是java中所有类的父类,不需要使用extends明确写出继承。只要是class声明的类,就都有一个父类Object。
1 因此Object是参数的最高统一化,所有类的对象都可以通过Object引用进行接收
2 Object中的所有方法都可以在子类中进行覆写。
我们的子类可以选择覆写或者不覆写父类中的方法,在编译运行是不会出错的,但是要是想要强制子类覆写父类中的方法,则需要使用到抽象类和抽象方法。
抽象类:使用abstract定义,抽象类只是普通类的超集,只是比普通类躲了一些抽象方法而已。普通类具有的,抽象类也有。
同样的使用abstract定义抽象方法,抽象方法没有方法体,只有方法声明。(没有方法体就看有没有 { } )。除了abstract方法以外还有本地方法native也没有方法体。 没有加访问修饰符时,抽象方法默认为包权限。
抽象类和抽象方法的使用原则:
1 抽象类不能实例化对象,即使抽象类中没有任何抽象方法,也无法直接实例化对象。
只能通过向上转型进行赋值(Cycle为子类)
2 抽象类的子类如果是普通类则必须覆写其父类抽象类的方法————强制覆写,保证多态的运行
如果是抽象类则不覆写也行。
3 abstract的使用 不能与private / final /static 一起使用
4 抽象类中仍然可以定义普通类中的构造方法和普通方法,也仍然满足对象的实例化流程。
接口:java中三大引用数据类型之一,可以看作是多个类的共同规范。
使用关键字 interface定义接口,JDK8之前,接口中只有全局常量和抽象方法,他是更加纯粹的抽象类。
子类使用implements实现接口,子类若是普通类,则必须覆写父类接口中所有的抽象方法。
一般来说,子类名称中用Impl结尾,表示是接口的实现子类。接口的子类没有 is a原则。
注意点:
1 接口是更纯粹的抽象类,因此接口中只有全局常量和抽象方法,没有构造方法和普通方法,因此其无法直接实例化对象,只能通过具体子类向上转型来被父类引用接收。
2 接口的子类是可以允许多实现的,一个类可以使用多个implements实现多个父接口。(避免了单继承局限)。
个人的理解:
抽象类的父类提取的共性是其子类都共有的,可以理解为父类蔬菜 ,子类为胡萝卜,菠菜等等。但是接口只是给出一个规范,并不是包含子类,可以理解为绿色蔬菜/有机蔬菜,当你满足绿色蔬菜/有机蔬菜的标准你就是绿色蔬菜或者有机蔬菜,但是这两个只是一种规范定义出来的东西,并非现实中真正存在的。如果说最大的区别就是抽象类是先存在子类然后把这些子类的共性提取为父类,而接口是先创建规则,依据规则来放子类,这种规则是人为规定的,可修改的,但是抽象类中的父类只是提取的共性,是不可修改的,你总不能说我把胡萝卜踢出蔬菜类,原因是它不满足什么什么条件吧。同样的,上文中的注意点2也证实了这一点,在抽象类中你只能继承一个父类,因为你不可能同时又是蔬菜又是肉类,但是你可以同时是有机蔬菜和绿色蔬菜,因为你只要满足它的规则,那么你就可以继承,所以可以实现多继承。相反的,如果你是蔬菜那么你就是蔬菜,不存在什么你满足什么什么条件你才是蔬菜。