一、继承
继承:就是⼦类继承⽗类的属性和⾏为,使得⼦类对象具有与⽗类相同的属性、相同的⾏为。⼦类可以直接访问⽗类中的⾮私有的属性和⾏为。
通过 extends 关键字,可以声明⼀个⼦类继承另外⼀个⽗类
一、 继承后的特点
一、成员变量:
⼦⽗类中出现了同名的成员变量时,在⼦类中需要访问⽗类中⾮私有成员变量时,需要使⽤ super 关键字,修饰⽗类成员变量,类似于之前学过的 this 。
二、成员方法:
⽅法重写:⼦类中出现与⽗类⼀模⼀样的⽅法时(返回值类型,⽅法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
重载:
在方法参数不同时,返回值不影响重载
在方法名与参数都相同时,不构成重载
注意事项:
- ⼦类⽅法覆盖⽗类⽅法,必须要保证权限⼤于等于⽗类权限。
- 异常:子类方法的异常类型不能多于父类的异常类型。
- ⼦类⽅法覆盖⽗类⽅法,返回值类型、函数名和参数列表都要⼀模⼀样。
- 返回值为引用类型的,子类方法的返回值只能是父类方法返回值的子类。
- static和fianl 修饰的方法不能被重写,被final修饰的类不能被继承。
三、构造方法
1.构造⽅法的名字是与类名⼀致的。所以⼦类是⽆法继承⽗类构造⽅法的。
2. 构造⽅法的作⽤是初始化成员变量的。所以⼦类的初始化过程中,必须先执⾏⽗类的初始化动作。⼦类的构造⽅法中默认有⼀个 super() ,表示调⽤⽗类的构造⽅法,⽗类成员变量初始化后,才可以给⼦类使⽤。
3. 子类构造方法必须调用父类的构造方法,当父类有参构造方法覆盖无参构造方法后,子类构造器默认的super()将无法调用父类的构造器,需要手动调用。
二、继承的特点
- Java只⽀持单继承,不⽀持多继承。
- Java⽀持多层继承(继承体系)。
- 继承接口可以实现多继承。
三、继承的多态
对于上图的答案可以这样理解:多态,编译看左边,执行看右边
可以看作,foo创建后父类和子类对象同时存在,foo指向父类,但被操作的对象是子类。
它调用方法会对子类对象进行操作,调用属性则是父类的。可以发现强制将父类转换为子类后,它将指向子类已经存在的对象,从而属性值会发生改变,且子类对象的值已经被操作过了。
以下代码进行验证:
public class Person {
public int a;
public Person() {
a = 3;
}
public void sayHello(){
this.a += 5;
System.out.println("你好!");
}
}
class Student1 extends Person{
int a;
public Student1() {
a = 8;
}
public void sayHello(){
a += 5;
System.out.println("hello!我是一名酷酷的学生");
}
public static void main(String[] args) {
//声明父类的引用
Person person;
//使用person引用,调用子类对象中重写的方法
//关键点在于,在调用sayHello方法的时候,引用person指向的对象是谁
person =new Student1();
System.out.println(person.a);
//Student1 s = (Student1)person;
//System.out.println(s.a);
person.sayHello();
Student1 s = (Student1)person;
System.out.println(s.a);
System.out.println(person.a);
System.out.println(s.a );
}
}
输出:
3
hello!我是一名酷酷的学生
13
3
13