一、继承的概念
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称为子类,现有的类被称为父类或基类,子类会自动拥有父类所有可继承的属性和方法。
在程序中,如果想要声明一个类继承另一个类,需要使用关键字extends
关键字,其基本语法格式如下:
修饰符 class 子类名 extends 父类名
//程序核心代码
二、实例
//定义Animal类
class Animal {
String name; //声明name属性
//定义动物叫的方法
void shout() {
System.out.println("动物发出叫声!");
}
}
//定义Bird类继承Animal类
class Bird extends Animal {
//定义一个打印name的方法
public void printName() {
System.out.println("name=" + name);
}
}
//定义测试类
public class Demo01 {
public static void main(String[] args) {
Bird bird = new Bird(); //创建一个Bird类的实例对象
bird.name = "布谷鸟"; //为bird对象的name属性进行赋值
bird.printName(); //调用bird对象的printName()方法
bird.shout(); //调用bird类继承Animal父类的方法
}
}
Tips:在Java中,类只支持单继承,不允许多继承,也就是说一个类只能有一个父类。
三、重写父类的方法
在继承关系中,子类会自动继承父类中公共的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类方法的重写。在这里需要注意的是,子类中重写的方法需要和父类重写的方法具有相同的方法名
、参数列表
以及返回值类型
。
//定义Animal类
class Animal01 {
//定义动物叫的方法
void shout() {
System.out.println("动物发出叫声!");
}
}
//定义Bird继承Animal类
class Birda extends Animal01 {
//定义鸟叫的方法
void shout() {
System.out.println("鸟叫,叽叽喳喳");
}
}
//定义测试类
public class Demo02 {
public static void main(String[] args) {
Birda b = new Birda();
b.shout();
}
}
在上面的代码中,Birda类继承了Animal01类。在子类Birda中定义了一个shout()方法对父类的方法进行重写。在调用Birda类对象的shout()方法时,只会调用子类重写的方法,并不会调用父类的shout()方法。
四、super关键字
4.1 super关键字调用父类的成员变量和成员方法
在以上的代码中,可以看出,继承后的类调用子类重写父类的方法中,不会调用父类的shout()方法。因此,Java提供了一个super
的关键字,来访问父类的成员,例如访问父类的成员变量、成员方法和构造方法。
使用super
关键字调用父类的成员变量和成员方法,具体格式如下:
super.成员变量
super.成员方法(参数a,参数b,...)
实际案例:
//定义Animal类
class Animal {
String name = "动物"; //声明name属性
//定义动物叫的方法
void shout() {
System.out.println("动物发出叫声!");
}
}
//定义Bird类继承Animal类
class Bird extends Animal {
String name = "鸟类";
//重写父类的shout()方法
void shout() {
super.shout(); //访问父类的成员方法
}
//定义一个打印name的方法
public void printName() {
System.out.println("name=" + super.name); //访问父类的成员变量
}
}
//定义测试类
public class Demo01 {
public static void main(String[] args) {
Bird bird = new Bird(); //创建一个Bird类的实例对象
bird.name = "布谷鸟"; //为bird对象的name属性进行赋值
bird.shout(); //调用bird对象重写的Animal父类的shout()方法
bird.printName(); //调用bird对象的printName()方法
}
}
Bird类继承了Animal类,重写了Animal类的shout()方法,并重新定义了子类的name属性。在子类的Bird的shout()方法中使用了super.shout()
,调用了父类被重写的方法,在printName()
方法中使用了super.name
访问父类的成员变量。
4.2 super关键字调用父类的构造方法
使用super
关键字调用父类的构造方法,格式如下:
super (参数a,参数b,...)
super
关键字的实例代码:
//定义Animal类
class Animal {
//定义Animal有参的构造方法
public Animal(String name) {
System.out.println("我是一只" + name);
}
}
//定义Bird类继承Animal类
class Bird extends Animal {
public Bird() {
super("小小鸟");
}
}
//定义测试类
public class Demo01 {
public static void main(String[] args) {
Bird bird = new Bird(); //创建一个Bird类的实例对象
}
}
4.3 super关键字的番外篇
在以上的代码中,通过super
关键字调用构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次,否则就会出现报错。
//定义Animal类
class Animal {
//定义Animal无参的构造方法
public Animal() {
System.out.println("我是一只飞不高的小小鸟");
}
//定义Animal有参的构造方法
public Animal(String name) {
System.out.println("我是一只" + name);
}
}
//定义Bird类继承Animal类
class Bird extends Animal {
//定义无参的构造方法
public Bird() {
}
}
//定义测试类
public class Demo01 {
public static void main(String[] args) {
Bird bird = new Bird(); //创建一个Bird类的实例对象
}
}