Java的继承
继承产生的原因
我们观察如下的一段代码,分别有两个类People和Student,我们对比会发现这两个类存在大量重复的代码。
class People{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student{
String name;
int age;
String school;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
这是因为Student也属于People,具有People的全部特征和方法,而对这些内容的重复编写是完全不必要的。因此我们引入继承的概念,当一个类继承另一个类时,子类将获得父类的属性和方法而不用重新编写。继承的书写方式是:
class 类名 extends 父类{
//内容
}
于是,上面的代码就可以这样写:
class People{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Student extends People{
String school;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
这时候Student类的对象也获得了People的属性和方法:
public static void main(String[] args) {
// 子类使用父类的方法
Student s=new Student();
s.setName("张三");
}
通过继承这种方法,我们提高了代码的重用性,程序员写代码更有效率了!
继承的规范
如果子类需要继承多个父类,可以设计成多重继承的方式:
通过分析继承的内存操作机制,我们能更好地认识继承这种特性在底层是如何实现的。现假设有两个类Student和Person,Student是Person的子类。
创建对象的代码执行如下:
在沿着链表搜索需要的方法和属性时,遵守访问控制的限制:
修饰符 | 类 | 包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
由此我们可以看到,只有父类中标识为protected或者public的方法和属性能被搜索到,其他的方法和属性是隐藏的。