前言
继承是OOP的三大特征之一,
它的作用是在现有类的基础上派生出一个新的类,这个类中继承了现有类的数据属性和行为,并且能进行扩展。
基于这一特性,我们将前者命名为“父类”或者“基类”,而后者则因此命名为“子类”或者“派生类”。但需要注意的是,所谓的子类只是相较于父类而言的,它同样可以成为另一个类的父类。
我们使用extends(意为扩展)关键字来实现所谓的继承关系,子类是对父类的一种扩展,子类在某种程度是一种特殊的父类,所以必须先定义一个父类才能够有继承关系的出现。
实现继承的基本格式如下:
[类修饰符] class <子类名> extends <父类名>
{
//成员变量
// 成员方法
}
以下为一个实例:
public class Demo{
public static void main(String[] args){
Student stu1 = new Student();
stu1.Println();
}
}
//定义一个父类——Class(班级)
class Class{
String No="C210309";
}
//定义一个新类——Student(学生),并利用extends继承Class类
class Student extends Class{
String Name="自律一哥";
void Println(){
System.out.println(No+"班的"+Name);
}
}
运行结果:
代码中的Student类是继承自Class类的子类,Class类中定义了一个String类型的变量,而Student类中也定义了一个String类型的变量以及一个Println方法,从结果中来看,尽管Student类中没有定义No变量,但却依旧可以对其进行访问并输出。
这就证明子类会继承父类的成员。
对于其他编程语言中的继承,java中的继承拥有自己的特点:
①:java的继承为单继承
所谓的单继承简单的来说,就是一个子类只能直接继承一个父类。
而直接继承则是指extends关键字之后只能有一个直接的父类。
class Grandfather{}
class Father {}
class Me extends Grandfather,Father{} //你不能同时继承父亲和爷爷
虽然子类只有一个直接父类,但多个类可以继承同一个父类,而这些子类也可以拥有自己的子类。
依旧以现实生活为例,一个父亲可以有多个孩子,而这些孩子也会有自己的孩子,就如同文件的树形结构一样。
class Grandfather{}
class Father extends Grandfather{}
class Me extends Grandfather{} //你和父亲都是爷爷的后代
②:java的继承具有传递性
class Grandfather{}
class Father extends Grandfather{}//父亲继承了爷爷,父亲是爷爷的孩子
class Me extends Father{} //你继承了父亲,是父亲的孩子,但同时也是爷爷的孩子
这一特点可用于描述事物的所属关系。
③:所有的类都直接或间接继承自Object类
如同所有生物都拥有共同的祖先一样,Object类是所有类的祖先,所有的类都是通过它派生出来的,而且它是唯一没有父类的类。
在前文中我们提到,子类继承父类的变量和方法并能以此为基础进行扩展,例如添加自己的变量以及方法。
但有时子类需要依照实际情况对继承来的方法进行修改,即对父类的方法进行重写。
注意,在此过程中,方法名称、参数列表和返回值类型是不能被修改的,即只能修改方法体。而且,重写方法不能使用比被重写方法更为严格的访问权限。
四种访问权限从「最大权限」到「最小权限」分别是:
public > protected > default> private
此外,子类和父类定义同名的变量,但在子类的实际使用中,父类的同名变量会被隐藏(注意,是隐藏而不是覆盖)。
以下为一个实例:
public class Demo{
public static void main(String[] args){
Student stu1 = new Student();
stu1.Println();
stu1.Habby();
}
}
//定义一个父类——Class(班级)
class Class{
String Name="自律一哥";
void Habby(){
System.out.println("内卷!");
}
}
//定义一个新类——Student(学生),并利用extends继承Class类
class Student extends Class{
String Name="魏挽枫";
void Println(){
System.out.println(Name+"今天要内卷");
}
void Habby(){
System.out.println("自律!");
}
}
运行结果: