在 Java 面向对象-内部私有属性 中,我们定义了Person
类:
package my.ioc;
public class PrivateField {
public static void main(String[] args) {
Person ming = new Person();
ming.setName("Xiao Ming"); // 设置name
ming.setAge(12); // 设置age
System.out.println(ming.getName() + ", " + ming.getAge());
}
}
class Person {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
现在,假设需要定义一个Student
类,字段如下:
class Student {
private String name;
private int age;
private int score;
public String getName() {...}
public void setName(String name) {...}
public int getAge() {...}
public void setAge(int age) {...}
public int getScore() { … }
public void setScore(int score) { … }
}
仔细观察,发现Student
类包含了Person
类已有的字段和方法,只是多出了一个score
字段和相应的getScore()
、setScore()
方法。
能不能在Student
中不要写重复的代码?
这个时候,继承就派上用场了。
继承是面向对象编程中非常强大的一种机制,它首先可以复用代码。当我们让Student
从Person
继承时,Student
就获得了Person
的所有功能,我们只需要为Student
编写新增的功能。
Java使用extends
关键字来实现继承:、
class Person {
private String name;
private int age;
public String getName() {...}
public void setName(String name) {...}
public int getAge() {...}
public void setAge(int age) {...}
}
class Student extends Person {
// 不要重复name和age字段/方法,
// 只需要定义新增score字段/方法:
private int score;
public int getScore() { … }
public void setScore(int score) { … }
}
可见,通过继承,Student
只需要编写额外的功能,不再需要重复代码。
Java只允许一个class继承自一个类,因此,一个类有且仅有一个父类。只有
Object
特殊,它没有父类继承有个特点,就是子类无法访问父类的
private
字段或者private
方法。例如,Student
类就无法访问Person
类的name
和age
字段