继承的概念
封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。从英文字面意思理解,extends的意思是“扩展”。子类是父类的扩展,现实世界中的继承无处不在,如下图所示:
指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类(也称作超类、基类等),子类(派生类)会自动拥有父类所有可继承的属性和方法。
继承的语法:
class 父类名 {}
class (子类名) extends (父类名) {}
使用继承的好处
1、继承的出现提高了代码的复用性,提高软件开发效率。
2、继承的出现让类与类之间产生了关系,提供了多态的前提。
继承的注意点
1、 java 只支持单继承,不允许多继承,也就是说一个类只能有一个直接父类。
2、 java 支持多层(重)继承,即一个类的父类可以再去继承另外的父类(继承体系)。
3、 如果定义一个类时,没有使用extends,则它的父类默认是:java.lang.Object。
方法的重写
当父类的方法不能满足子类的需求时,我们可以在子类中重写父类的方法,重写也称为复写或者覆盖。
方法重写需要符合以下三个要点:
==,要求重写方法的“方法名”和“形参列表(个数和类型)”必须一模一样!
>=,要求子类重写方法的修饰符权限必须大于等于父类被重写方法的修饰符权限。
public > protected > default > private
注意:
1)父类中被private修饰的方法不能被子类重写!“>=”强调的是权限关系。
2)父类被static修饰的方法不能被子类重写!
<=,返回值类型和异常类型,子类小于等于父类,“<=”强调的是辈分关系
如果返回值类型为“基本数据类型”、“字符串类型”和“void”,那么要求子类重写方法的返回值类型必须和父类被重写方法的返回值类型保持一致!
如果返回值类型为“引用数据类型”(不包含“字符串”),要么子类重写方法的返回值类型和父类被重写方法的返回值类型保持一致。要么子类重写方法的返回值类型为父类被重写方法的返回值类型的子类。
// 父类
class Parent {
public void show(){
System.out.println("父类中的 show方法执行");
}
}
// 子类
class Child extends Parent {
// 子类重写父类的show方法
public void show(){
System.out.println("子类中的 show方法执行");
}
}
// 主方法
public class ExtendsMethodDemo {
public static void main(String[] args) {
Child p = new Child();
p.show(); // 执行的是子类的show方法
}
}
注意:如果子类重写了父类的方法,通过子类对象调用该方法时,调用的方法就是被覆写过的方法!
如果子类方法需要使用父类方法的功能,可使用super关键字来调用父类方法,该关键字引用了当前对象的父类对象。这样,即沿袭了父类的功能,又定义了子类特有的功能 (super关键字的使用和this非常相似)。
方法重写和重载有什么区别?
区别点 | 方法重载 | 方法重写 |
英文名 | overload | override |
范围 | 发生在同一个类中 | 发生在继承关系中 |
定义 | 方法名相同、形参列表相同 | 方法名相同、形参列表相同 |
对访问权限没有要求 | 访问权限,子类大于等于父类 | |
对返回值类型和异常类型没有要求 | 返回值类型和异常类型,子类小于等于父类 |