三大特性:继承 封装 多态
继承
Java中的继承只能单继承,但是可以通过内部类继承其他类来实现多继承。
封装
封装主要是因为Java有访问权限的控制。public > protected > package = default > private。封装可以保护类中的信息,只提供想要被外界访问的信息。
多态
多态一般可以分为两种,一个是重写overwrite,一个是重载override。
- 重写:从jvm实现的角度来看,重写又叫运行时多态,编译时看不出子类调用的是哪个方法,但是运行时操作数栈会先根据子类的引用去子类的类信息中查找方法,找不到的话再到父类的类信息中查找方法是由于继承关系中的子类有一个和父类同名同参数的方法,会覆盖掉父类的方法。
-
重载:重载是编译时多态,在编译器就可以确定传入的参数组合,决定调用哪一个具体方法。是在同一个类中方法名相同,传入多个参数组合。
注意:同名方法如果参数相同,即使返回值不同也是不能同时存在的,编译会出错。
向上转型:子类对象转为父类,父类可以是接口。公式:Father f = new Son();Father是父类或接口,son是子类。向上转型后父类的引用所指向的属性是父类的属性,如果子类重写了父类的方法,那么父类的引用指向的是子类的方法,这个叫动态绑定。
- 注1:向上转型后父类引用不能调用子类独有的方法,就是父类没有但是子类的方法。
- 注2:父类引用非要调用子类的属性,不过不向下转型就就需要给需要的属性写getter()方法。
向下转型:父类对象转为子类。公式:Son s = (Son)f。 向下转型需要考虑安全性,如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误即能否向下转型,只有先经过向上转型的对象才能继续向下转型。
Human h = new Male();// 向上转型
Human h1 = new Human();
//h.speak();此时需要向下转型,否则不能调用speak方法。
Male m = (Male) h;
m.speak();
/**Male m1 = (Male)h1;
m1.speak();
向上转型的作用:减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。