继承
在Java中,类的继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类,现有的类被称作父类,子类会自动地拥有父类所有可继承的属性和方法。
子类继承自父类,父类派生子类。
class Person {
String name;
// 声明一个Person类,有成员方法speak()和walk()
public void speak() {
System.out.println("我会说话~");
}
public void walk() {
System.out.println("我可以行走~");
}
}
class LiHua extends Person {
// 声明一个LiHua类,继承自Person类
// @Override重写方法的声明,可以不带
// 重写的方法一定是父类拥有的方法
@Override
public void walk() {
// super.方法名 表示调用父类的方法,和构造函数不同,不写super不会掉用父类的方法
// super.walk();
System.out.println("我走的很快~");
}
}
public class PersonExtends {
public static void main(String[] args) {
LiHua liHua = new LiHua();
liHua.name = "李华";
liHua.speak();
liHua.walk();
}
}
LiHua类通过extends继承了Person类,这样LiHua类便是Person类的子类,将拥有Person类的全部可继承属性和方法。
运行结果:
重写
在继承关系中,子类会自动继承父类中的定义的方法,有时候子类需要对继承的方法做一些修改,即子类对父类的方法进行重写。
上面的代码LiHua类中的walk()方法重写了父类的walk()方法,main中运行的walk()方法就是LiHua类中的walk()方法而不是Person类的walk(),speak()方法在子类中没有进行重写操作,所以运行的就是Person类的walk()方法。
重写一般有@Override标识说明,不带并不会出错。
super:
从上面的运行结果来看,当子类重写父类的方法后,子类将无法访问父类被重写的方法。为了解决这个问题,Java提供了super关键字用于父类成员的访问。前面用的this关键字是用于当前类的访问。
使用super关键字调用父类的成员变量和成员方法,语法格式如下:
super.成员变量
super.成员方法([参数表列]);
class Person {
String name = "人类";
// 声明一个Person类,有成员方法speak()和walk()
public void speak() {
System.out.println("我是" + name + ",我会说话~");
}
public void walk() {
System.out.println("我可以行走~");
}
}
class LiHua extends Person {
// 声明一个LiHua类,继承自Person类
String name = "李华";
@Override
public void speak() {
super.speak();// 调用父类的speak()方法
System.out.println("我是" + name + ",我会说话~");
}
@Override
public void walk() {
// super.方法名 表示调用父类的方法,和构造函数不同,不写super不会掉用父类的方法
speak();// 等价于this.speak();
super.speak();// 在子类的任意方法中都可以访问父类的speak()方法
System.out.println("我走的很快~");
}
}
public class PersonExtends {
public static void main(String[] args) {
LiHua liHua = new LiHua();
liHua.speak();
System.out.println("=======================");
liHua.walk();
}
}
运行结果:
final:
一个类被子类继承后,子类将可以重写父类的方法和属性,如果父类有属性和方法不希望被重写,子类又该怎么知道呢?
Java提供了一个关键字final,表示最终的,这是无法改变的,因此被final修饰的类、属性、方法具有以下特性:
- final修饰的类不能被继承。
- final修饰的方法不能被子类重写。
- final修饰的变量(成员变量和局部变量)是常量,只能赋值一次。