JAVA作为面向对象语言,继承、多态是面向对象的重要特点
继承 共性抽取、代码复用 父类更通用,子类更具体
继承特性:
1、子类拥有父类非 private 的属性、方法。
2、子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3、子类可以用自己的方式实现父类的方法。
4、Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
5、提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
在子类方法中,或通过子类成员在访问成员时:
1、 如果访问时成员变量子类中有,优先访问自己的成员变量。
2、 如果访问时成员变量子类中没有,则访问父类继承下来的。
3、 如果访问的成员变量与父类中成员变量同名,则优先访问自己的,即:子类将父类同名成员隐藏了。
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。
有同名方法时也是优先访问自己的,
重载则调用适配的方法,
重写则调用自己的,父类的无法通过派生类对象直接访问到。
在子类中访问父类相同名称的成员需要用到super JAVA中类和对象的初认识(2)浅谈this和super_Cold code的博客-CSDN博客
多态,简单的来说,不同对象在完成同一行为时,产生不同效果。其体现在代码运行,传递不同类对象时会调用对应类中的方法
多态好处:1、消除代码耦合性2、可扩展能力强
多态产生的条件:
1、在继承体系下
2、必须对父类中方法重写
3、通过父类引用调用重写方法
通过向上转型,进行动态绑定,实现多态。
向上转型:把子类对象当成父类对象来使用
动态绑定:也称为晚绑定,在编译时,需要等到程序运行时,才可以确定具体调用那个类的方法
静态绑定:早绑定,在编译时,根据用户所传递实参类型就确定了具体调用什么方法,典型代表就是重载
向下转型:把指向子类对象的父类引用赋给子类引用叫做向下转型,所以向上转型时向下转型的基础。
instanceof 二元操作符(运算符) 左边为对象,右边为类 ,返回值为boolean 作用为测试左边的对象是否是右边的类或者该类的子类创建的实例对象 是则返回 true 否则返回 false
注意:
1、先有继承关系,再使用instanceof 2、处在继承关系同一级的类型不可判断,右边的类的范围只包括左边对象的类与其父类和连续继承的父类和与这些父类们同级的类,判断关系时两边的类的关系必须在同一个继承树中
用在强制类型转换(包含向下转型)上,判断是否可转。
重写与重载Override and Overload
重写是子类对父类,非静态,非private修饰,非final修饰,非构造方法等的实现过程进行重新编写,即 外壳不变,核心重写。
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法(Java 继承 | 菜鸟教程 (runoob.com))
重写的规则:
1、子类在重写父类的方法时,一般必须与父类方法原型一致:修饰符 返回值类型 方法名(参数列表) 要完全一致
2、JDK7以后,被重写的方法返回值类型可以不同,但是必须是具有父子关系的
3、访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法 就不能声明为 protected 父类被static、private修饰的方法、构造方法都不能被重写
4、子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法
5、子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法
6、重写的方法, 会使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如方法名字拼写错了,那么此时编译器就会发现父类中没有该方法, 就会编译报错, 提示无法构成 重写
7、重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,抛出 IOException 异常或者 IOException 的子类异常
8、父类的成员方法只能被它的子类重写
9、声明为 final 的方法不能被重写。声明为 static 的方法不能被重写,但是能够被再次声明
10、构造方法不能被重写
当需要在子类中调用父类的被重写方法时,要使用 super 关键字
重载
通过对比重写来认识重载:
重载 | 重写 | |
参数列表 | 必须修改 | 不能修改 |
返回类型 | 可以修改 | JDK7以后,被重写的方法返回值类型可以不同,但是必须是父类返回值的派生类 |
访问限定符 | 可以修改 | 可以降低限制 |
异常 | 可以修改 | 可以减少或删除一定不能抛出新的或更广的异常 |
重载的规则:
1、被重载的方法必须改变参数列表(参数的个数或类型不一样)
2、被重载的方法的返回值和访问修饰限制符都可以修改
3、被重载的方法可以声明新的或更广的异常
4、方法可以在同一个类或在子类中被重载
5、返回值无法成为判断方法是否重载的标准
方法的重写只是实现多态的方式的其中一种,其还有通过抽象类和接口的实现,在后面的学习生活中再学习。