本章目标
掌握继承的基本概念及实现
掌握继承实现的各种限制
为什么要有继承?
类的继承格式
在Java中使用extends关键字完成类的继承关系,操作格式:
——class 父类{} // 定义父类
——class 子类 extends 父类{} // 使用extends关键字实现继承
继承的实现
class Person{//定义 Person 类
private String name;//定义 name 属性
private int age;//定义 age 属性
public String getName() {//取得 name 属性
return name;
}
public void setName(String name) {//设置 name 属性
this.name = name;
}
public int getAge() {//取得 age 属性
return age;
}
public void setAge(int age) {//设置 age 属性
this.age = age;
}
}
class Student extends Person{//Student 是 Person 的子类
//此处任何代码都不编写
}
public class ExtDemo02 {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("张三");//此时访问的方法是父类中的,子类中并没有定义
stu.setAge(30);//此时访问的方法是父类中的,子类中并没有定义
System.out.println("姓名:"+stu.getName()+"; 年龄:"+stu.getAge());
}
/* 结果:
* 姓名:张三; 年龄:30
* */
}
通过子类扩展父类的功能
class Person{//定义 Person 类
private String name;//定义 name 属性
private int age;//定义 age 属性
public String getName() {//取得 name 属性
return name;
}
public void setName(String name) {//设置 name 属性
this.name = name;
}
public int getAge() {//取得 age 属性
return age;
}
public void setAge(int age) {//设置 age 属性
this.age = age;
}
}
class Student extends Person{//Student 是 Person 的子类
private String school;//新定义的属性 school
public String getSchool() {//取得 school 属性
return school;
}
public void setSchool(String school) {//设置 school 属性
this.school = school;
}
}
public class ExtDemo03 {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("张三");//此时访问的方法是父类中的,子类中并没有定义
stu.setAge(30);//此时访问的方法是父类中的,子类中并没有定义
stu.setSchool("My school");//此时的方法是在子类中定义的
System.out.println("姓名:"+stu.getName()+"; 年龄:"+stu.getAge()+"; 学校:"+stu.getSchool());
}
/* 结果:
* 姓名:张三; 年龄:30; 学校:My school
* */
}
Person与Student的继承关系图
继承的限制
在Java中只允许单继承,不能使用多重继承,即:一个子类只能继承一个父类。但是允许进行多层继承,即:一个子类可以有一个父类,一个父类还可以有一个父类。
继承的类图表示
访问限制
在使用继承的时候也应注意的是:子类是不能直接访问父类中的私有成员的,但是子类可以调用父类中的非私有方法,但是不能直接调用父类中的私有成员。
子类访问限制
public class Person {//定义 Person 类
private String name;//定义 name 属性
private int age;// 定义 age 属性
public String getName() {//取得 name 属性
return name;
}
public void setName(String name) {//设置 name 属性
this.name = name;
}
public int getAge() {//取得 age 属性
return age;
}
public void setAge(int age) {//设置 age 属性
this.age = age;
}
}
public class Student extends Person {//Student 是 Person 的子类
public void fun(){
//System.out.println("父类中的 name 属性:"+name);//错误,无法访问
//System.out.println("父类中的 age 属性:"+age);//错误,无法访问
System.out.println("父类中的 name 属性:"+getName());//正确,间接访问
System.out.println("父类中的 age 属性:"+getAge());//正确,间接访问
}
}