继承入门和方法重写
一.继承入门
继承是面向对象的一个基本特征,通过继承可以实现父子关系,以及代码的复用。
(一).extends关键字
Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类,有的也称其为基类、超类。例如:人是父类,而学生、工人是子类。extends在英语中译为扩展,在java中继承的语法为:
修饰符 class 子类名 extends 父类名{
//类体
}
在类的声明中,通过extends关键字声明一个继承关系。Java只支持单继承,每个Java类中最多只能有一个父类。
例如,下面实例中,Person是父类,Student是继承自Person的子类:
public class Person {
// 父类
}
public class Student extends Person{
// 子类
}
Java类体系中的根类是java.lang.Object,所有类都是Object的直接子类或间接子类。如果定义类时没有extends子句,则该类的父类默认为Object。
(二).instanceof关键字
instanceof关键字用来判断一个对象是否是指定类所创建的实例,返回值是boolean。
语法:
boolean flag = 对象 instanceof 类
示例:
public class Test1 {
public static void main(String[] args) {
// Instanceof
Student student = new Student();
boolean result = student instanceof Student;
System.out.println(result);//true
}
}
二.方法重写
在继承中,子类可以定义和父类相同的名称且参数列表一致的函数,将这种函数称之为函数的重写。简而言之,重写方法就是在子类中重新定义父类中已有的方法。
子类方法的重写,语法:
@Override
修饰符 返回值 方法名(){
代码块;
}
注意:
1.使用private修饰的不可继承,属性和方法都是如此;
2.子类除了从父类继承公共的方法和属性以外,还可以有自己的方法和属性;
(一).重写要求
1.在子类中的重写方法和父类中的被重写方法,两个方法名称和参数列表必须相同。
2.子类中重写方法的访问权限必须大于或等于父类中被重写方法的访问权限,否则编译会报错。(public>protected>default>private)
3.子类中重写方法的返回值类型必须是父类中方法的返回值类型或该类型的子类,不能返回比父类更大范围的数据类型。
4.子类中重写方法不能比父类中被重写方法产生更多的异常类型。
5.父类的构造函数是不能子类继承的,因此不能在子类中重写。但是,在子类中可以使用 super 关键字访问父类中的构造函数。
(二).重写方法的调用顺序
1.子类中重写后的方法在方法体的第一行默认调用父类被重写的方法。
例子:
public class Father {
// 父类
public void age(int age) {
System.out.println("父类中的 age ="+age);
}
}
public class Son extends Father{
// 子类
@Override
public void age(int age) {
super.age(age);//默认调用父类中的age方法,可要可不要
System.out.println("子类中的age = "+age);
}
}
public class Test1 {
//测试类
public static void main(String[] args) {
Son son = new Son();
son.age(24);
}
}
结果:
父类中的 age =24
子类中的age = 24
(三).子类中调用父类中的方法
super.方法名();
(四).方法重写和重载的区别
重写用于继承关系的父子类中,不能用于同一个类中。重写用于更改父类中方法的行为,或者是实现接口中的方法。
重写特点:函数名必须相同、参数列表必须相同。子类的返回值类型要等于或小于父类的返回值等,子类的作用域不能小于父类中方法的作用域,子类抛出的异常类型不能大于父类中方法的异常类型。
重载通常用于同一个类中,重载用于为一个行为提供多种实现方式。
重载特点:函数名相同,参数列表不同,与访问控制符、返回值类型等无关。