继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
一、继承的概念:
(1)继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。
或者说子类从父类继承方法,使得子类具有父类相同的行为。
下方的图片是用到的例子:(用到的绘制构图就是Windows自带的画图软件)
其中一个是学生类:Student
public class Student {
private String name;
private int age;
private char sex;
private String sid; //学号
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 char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void study(){
System.out.println("学习");
}
}
另一个是教师类:Teacher
public class Teacher {
private String name;
private int age;
private char sex;
private String tid; //教师工号
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 char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void teach(){
System.out.println("教书育人");
}
}
注意:然后这时我们在写的过程中发现他们之间有很多的共同的点,既然我们有这么多共同的能不能把他简单化呢?我们生活中有继承,可以从父母那里继承来一些东西,那么这个例子我们也一样可以从中间抽离出一个"父亲",也就是集全部共同点,如下:
此时相应的Student、Teacher类发生变化,并多出一个父类:Person
1、父类:Person:
public class Person {
private String name;
private int age;
private char sex;
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 char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
2、Student类:
public class Student extends Person {
private String sid; //学号
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public void study(){
System.out.println("学习");
}
}
3、Teacher类:
public class Teacher extends Person {
private String tid; //教师工号
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public void teach(){
System.out.println("教书育人");
}
}
4、测试类:
public class Test01 {
public static void main(String[] args) {
Student student =new Student();
student.setName("张三"); //父类继承过来的
student.setAge(20); //也是父类继承过来的
student.setSex('男'); //也是父类继承过来的
student.setSid("2200130225"); //子类原本自己有的方法
System.out.print("我叫:"+student.getName()+",");
System.out.print("我今年"+student.getAge()+"岁,");
System.out.print("我的性别是:"+student.getSex()+",");
System.out.println("我的学号是:"+student.getSid());
student.eat();; //父类继承过来的
student.sleep(); //父类继承过来的
student.study();; //子类原本自己有的方法
}
}
5、代码测试结果:
二、什么是继承?
(1)解决了程序中的复用性问题。
三、怎么实现继承?
public class 子类 extends 父类 {
//成员变量
//成员方法
}
四、继承中的细节
(1)继承具有传递性,B继承了A,C继承了B,相应的C继承了A。
例如:我现在再创建一个类叫做HeightStudent(简单说就是高中生类),让它继承Student类,然后在测试类创建它的对象,它一样也可以调用Student类的父类Person的方法。
public class HeightStudent extends Student{
public void playGame(){
System.out.println("打游戏");
}
}
测试类:
public class Test01 {
public static void main(String[] args) {
Student student =new Student();
HeightStudent heightStudent = new HeightStudent();
heightStudent.setName("李四");
System.out.println("我是高中生,我叫:"+heightStudent.getName());
heightStudent.playGame(); //自己的方法
heightStudent.sleep(); //来自父类的父类的方法
}
}
代码运行结果:
(2)继承具有单向性, B继承了A, 则B可以使用A的成员,但是A不能使用B的成员。
例如:子类可以调用父类的成员,上面已经证明。但是父类无法直接调用子类的成员,会报错!
讲一下原因:(首先给Student类添加一个构造方法,再给父类Person添加一个构造方法)
public class Student extends Person {
private String sid; //学号
public Student(){
System.out.println("Student的构造");
}
//其余代码省略
}
public class Person {
private String name;
private int age;
private char sex;
public Person(){
System.out.println("Person的构造");
}
//其余代码省略
}
新创建一个测试类:
public class Test02 {
public static void main(String[] args) {
Student student =new Student();
}
}
代码运行结果:
解释:(偷偷透露一下:这个图花了很久时间)
(3)继承具有单一性,一个父类可以有多个子类,一个子类只能有一个父类。(这个不需要解释吧,和现实中的情况一模一样)
(4)Object类是所有类的祖先类,即所有类或直接或间接继承Object类。
例如:Person类它其实默认继承了Object,我们有时叫它超类,Object类它里面也有方法,子类可以去用。注意:子类是继承父类所有成员,但是由于访问权限的问题,导致子类无法访问而去调用那些成员,但是它是继承了的。(举个简单例子:你大哥给你留了500万遗产,但是没告诉你密码,你不能强行打开会破坏,但从法律上讲这笔遗产是你继承来的,你只是用不了哈哈!)
(5)所以子类继承父类所有成员,私有或者默认成员由于访问权限限制导致无法访问。
(6)构造方法不能被继承。
原因:举个例子:假如父类有个构造方法,是用来创建父类这个对象的,现在子类如果继承了,那是不是也是可以用来创建子类对象,那他们到底是父子关系,还是兄弟关系呢?还有如果继承过去了,那在子类里有一个类名不是子类的构造方法,也不成立。(不是很严谨,但容易理解)
(7)super表示父类的引用。