概念
在Java中,类的继承是指在一个现有类的基础上产生一个新的类,产生的新类被称为子类,现有类被称为父类,子类会自动拥有父类的属性和方法。
定义一个类继承另一个类需要使用extends关键字。如果一个类没有使用extends关键字明确标识继承另一个类,则默认继承Object类。
Object类是所有类的父类,该类的方法适用于所有子类,其类中的常用方法有toString()、hashCode()等。
package Extends.Example;
//定义Son类继承Father类
public class Son extends Father{
}
}
注意:
- 在Java中,类只支持单继承,不允许多重继承,即一个类只有一个直接父类。 类比一下,就是Son类直接继承了Father类,就不可以再直接继承一个Mother类。
- 多个类可以继承同一个父类。 例如,Son类和Daughter类都可以继承同一个Father类。
- 在Java中,多重继承是允许的,即一个类的父类可以再继承其他类的父类。 例如Son类继承了Father类,Father类再继承了Grandfather类,即子孙三代。
父类方法重写
在继承关系中,子类会继承父类定义中的方法,但子类也可以在父类的基础上拥有自己的特征,即对父类的方法进行重写。
注意,子类重写的方法必须与父类被重写的方法具有相同的方法名、参数列表和返回值类型。
创建父类Father
package Extends.Example;
//父类
public class Father {
public void appearance(){
System.out.println("圆脸");
}
public void high(){
System.out.println("1.8m");
}
}
创建子类Son
package Extends.Example;
//定义Son类继承Father类
public class Son extends Father{
public void appearance(){
System.out.println("瓜子脸");
}
}
测试类Main
package Extends.Example;
public class Main {
public static void main(){
Son mike=new Son();//创建Son类实例对象
mike.appearance();//调用Son类重写的appearance()方法
mike.high();//调用父类Father的high()方法
}
}
运行后输出:
瓜子脸
1.8m
可见当子类重写了父类方法之后,创建的子类对象会自动调用重写的方法。
super关键字
当子类重写父类的方法后,可以通过super关键字访问被重写的方法。
super关键字的用法有三种:
- 在子类的成员方法中,访问父类的成员变量。
super.成员变量
- 在子类的成员方法中,访问父类的成员方法。
super.成员方法([参数1,参数2,···])
- 在子类的构造方法中,访问父类的构造方法。
super([参数1,参数2,···])
还是刚才的例子:
package Extends.Example;
//父类
public class Father {
public call(String name){
System.out.println("我是"+name);
}
}
package Extends.Example;
//定义Son类继承Father类
public class Son extends Father{
public call(){
super("儿子");
}
}
package Extends.Example;
//定义测试类
public class Main {
public static void main(){
Son mike=new Son();//创建Son类实例对象
}
}
运行结果:
我是儿子
可以看出Son类的构造方法被调用时Father类的构造方法也被调用了。
注意,通过super关键字调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。
final关键字
如果父类中的某些方法不希望再被子类重写,则必须用final关键字把他们修饰为最终方法。
final关键字可用于修饰类、变量和方法,表示不能改变或最终,因此被final修饰的类具有以下特性:
- final修饰的类不能被继承。
- final修饰的类不能被子类重写。
- final修饰的变量(包括成员变量和局部变量)是常量,并且只能赋值一次。