面向对象三大特征:封装、继承、多态。
继承:
-
”基本作用“:代码复用。
-
”重要作用“:有了继承才有了以后的”方法覆盖“和”多态机制“
-
语法格式
[修饰符列表] class 类名 extends 父类名{
类体=属性+方法;
} -
Java语言只支持单继承,一个类不能同时继承很多类。C++支持多继承。
-
有关术语:
B类继承A类,其中:
A类被称为:父类、基类、超类、superclass
B类被称为:子类、派生类、subclass -
子类都可以继承父类的哪些数据?
-私有的不支持继承
-构造方法不支持继承
-其他数据都可以被继承 -
虽然Java只支持单继承,但是一个类可以间接的继承其他类。
C继承B,B继承A,那么C就间接继承了A。 -
重点:java语言中,如果一个类没有显示继承任何类,那么该类默认继承JavaSE库当中提供的java.lang.Object类。java语言中任何一个类都有object类的特征。
继承的优点:
- 继承过来的字段和方法,可以像任何其他字段和方法一样被直接使用;
- 在子类中可以声明一个与父类中同名的新字段或静态方法,从而“隐藏”父类中的字段或方法;
- 可以在子类中声明一个在父类中没有的新字段和方法;
- 可以在子类中编写一个父类当中具有相同名的新实例方法,这称为“方法重写”或“方法覆盖”;
- 可以在子类中编写一个调用父类构造方法的子类构造方法,既可以隐式地实现,也可以通过使用关键字super来实现。
方法覆盖:
- 方法覆盖又称为方法重写(override);
- 当父类中的方法已经无法满足当前子类的业务需求,需要使用方法重写;
- 方法重写发生在具有继承关系的父子类之间,条件是:返回值类型相同,方法名相同,形参列表相同;访问权限不能更低,可以更高(下面解释);抛出异常不能更多,可以更少(这一条还不能理解)。
- 注意:私有方法和构造方法不能继承,所以不能覆盖;静态方法不存在覆盖;覆盖只针对方法,不谈属性。
访问权限不能更低,可以更高?
在子类中被重写的方法,其访问权限允许大于但不允许小于被其重写的方法,例如:父类中一个受保护的实例方法(protected)在子类中可以是公共的(public)的,但不可以是私有的(private)。如果一个方法在父类中是static方法,那么在子类也必须是static方法;如果一个方法在父类中是实例方法,那么在子类中也必须是实例方法。
Super关键字:
使用super调用父类中重写的方法、访问父类中被隐藏的字段
子类重写了父类中的某一个方法,隐藏父类中的字段,假如想在子类中访问到父类中被重写的方法和隐藏父类的字段,可以在子类中通过使用关键字super来调用父类中被重写的方法和访问父类中被隐藏的字段。例如:
package first;
class A{
public String name="张飞"; //添加成员变量
public void say() { //添加成员方法say
System.out.println("我是父类A成员方法say");
}
}
class B extends A{
public String name="关羽"; //与父类中同名的字段,隐藏父类
public void say(){ //重写方法say
super.say(); //使用super关键字调用父类中的方法
System.out.println("我是子类B成员方法say");
System.out.println("父类的name名字:"+super.name); //使用super关键字访问父类中的变量
}
}
public class myfirst {
public static void main(String[] args) {
B b=new B(); //创建子类的一个实例对象
b.say(); //调用子类中重写的方法
System.out.println("子类的name名字:"+b.name); //调用子类中的name
}
}
运行结果为:
我是父类A成员方法say
我是子类B成员方法say
父类的name名字:张飞
子类的name名字:关羽
使用super调用父类的无参数构造方法/有参数构造方法
- 当使用无参数的super()时,父类的无参数构造方法就会被调用;
- 当使用带有参数的super()方法时,父类的有参数构造方法就会被调用。
注意:
- 如果要初始化父类中的字段,可以在子类的构造方法中通过关键字super调用父类的构造方法;
- 对父类的构造放的调用必须放在子类构造方法的第一行;
- 如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器;
- 如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表;
- 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。