Java面向对象(下)关于继承

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

 一、继承的概念:

(1)继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法。
 或者说子类从父类继承方法,使得子类具有父类相同的行为。

下方的图片是用到的例子:(用到的绘制构图就是Windows自带的画图软件)

Java面向对象(下)关于继承_第1张图片

 其中一个是学生类: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("教书育人");
    }
}

 注意:然后这时我们在写的过程中发现他们之间有很多的共同的点,既然我们有这么多共同的能不能把他简单化呢?我们生活中有继承,可以从父母那里继承来一些东西,那么这个例子我们也一样可以从中间抽离出一个"父亲",也就是集全部共同点,如下:

Java面向对象(下)关于继承_第2张图片

 此时相应的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、代码测试结果:

Java面向对象(下)关于继承_第3张图片

二、什么是继承?

(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();  //来自父类的父类的方法
    }
}

代码运行结果:

Java面向对象(下)关于继承_第4张图片

(2)继承具有单向性, B继承了A, 则B可以使用A的成员,但是A不能使用B的成员。

例如:子类可以调用父类的成员,上面已经证明。但是父类无法直接调用子类的成员,会报错!

Java面向对象(下)关于继承_第5张图片

讲一下原因:(首先给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();
    }
}

代码运行结果:

Java面向对象(下)关于继承_第6张图片

解释:(偷偷透露一下:这个图花了很久时间)

Java面向对象(下)关于继承_第7张图片

(3)继承具有单一性,一个父类可以有多个子类,一个子类只能有一个父类。(这个不需要解释吧,和现实中的情况一模一样)

(4)Object类是所有类的祖先类,即所有类或直接或间接继承Object类。

例如:Person类它其实默认继承了Object,我们有时叫它超类,Object类它里面也有方法,子类可以去用。注意:子类是继承父类所有成员,但是由于访问权限的问题,导致子类无法访问而去调用那些成员,但是它是继承了的。(举个简单例子:你大哥给你留了500万遗产,但是没告诉你密码,你不能强行打开会破坏,但从法律上讲这笔遗产是你继承来的,你只是用不了哈哈!)

(5)所以子类继承父类所有成员,私有或者默认成员由于访问权限限制导致无法访问。

(6)构造方法不能被继承。

原因:举个例子:假如父类有个构造方法,是用来创建父类这个对象的,现在子类如果继承了,那是不是也是可以用来创建子类对象,那他们到底是父子关系,还是兄弟关系呢?还有如果继承过去了,那在子类里有一个类名不是子类的构造方法,也不成立。(不是很严谨,但容易理解)

(7)super表示父类的引用。

你可能感兴趣的:(java,开发语言)