继承
继承同样是是Java的三大特性之一,其本质是对某一批类的抽象,是从已有的类中派生出来的类,具有原类的属性和方法,且能扩展新的数据属性及方法。
继承关系的两个类,一个是子类(或派生类),一个为父类(基类)。子类继承父类,使用关键字extends
来表示,extends
,“扩展” 的意思。子类继承父类,子类就拥有父类的属性和方法。
Java中,类只有单继承,没有多继承。单继承是指每个子类只有一个父类,然一个父类却有多个子类。
继承是类和类之间的关系。除了继承关系,类与类的系统还有依赖、组合、聚合等系统。
示例:
父类: Person.java
package com.zctou.oop.demo04;
public class Person {
//封装区
private String name; //年龄
protected int age; //年龄
int height; //身高
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 int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
//方法区
public void personalInfo() {
System.out.println("姓名: " + name + " 年龄:" + age + " 身高(CM): " + height );
}
public void breathe() {
System.out.println("Person类吸了口气!");
}
public void breathe(String s) {
System.out.println(s + "吸了口气!");
}
}
子类:Teacher.java
package com.zctou.oop.demo04;
public class Teacher extends Person{
//封装区
private String school; //所在学校
private int seniority ; // 教学年龄
private String subject; // 学科
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public int getSeniority() {
return seniority;
}
public void setSeniority(int seniority) {
this.seniority = seniority;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
//方法区
//覆盖父类方法
public void breathe() {
System.out.println("Teacher类吸了口气!");
}
public void teacherInfo() {
System.out.println("姓名: " + getName() + " 年龄:" + age + " 身高(CM): " + height ); //只有private不能继承
System.out.println("所在学校: " + school + " 教学年龄:" + seniority + " 学科: " + subject );
}
}
测试文件:Application.java
package com.zctou.oop;
import com.zctou.oop.demo04.Teacher;
public class Application {
public static void main(String[] args) {
Teacher teacher = new Teacher(); //Teacher extends Person
//调用父类提供的公共方法
teacher.setName("老王");
teacher.setSchool("华师大");
teacher.setSubject("语文");
teacher.setHeight(170);
System.out.println(teacher.getHeight());
teacher.breathe(); //子类覆盖父类方法
teacher.breathe("Teacher类调用Person类"); //调用父类方法'
teacher.teacherInfo();
}
}
输出:
所在学校: null 教学年龄:0 学科: null //调用子类自身方法
姓名: null 年龄:0 身高: 0 //调用父类方法
老王 //父类属性
所在学校: 华师大 教学年龄:0 学科: 语文 //调用子类自身方法
姓名: 老王 年龄:0 身高: 0 //调用父类方法
可以看到:name, age, height都是父类属性,personalInfo()是父类方法。
Teacher作为Person的子类,能继承父类的属性和方法。除了private, 其他属性都能被子类继承。
子类能覆盖父类的方法。
总结
- 继承关键字
extends
- Java中继承只有单继承,没有多继承,但有多重继承。
- Java中虽然有多重继承,但只类只能有一个父类,而父类却能有多个子类。
- 私有(private)的属性方法不能被子类继承。
- 避免混乱,调用父类用super,调用本类用this。