java 继承 第一篇

117 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

继承概述

继承引入

面向对象语言三大基本特征:

封装(private)、继承(extends)、多态

Java中的类是描述生活中的任何事物的。而在生活中任何事物之间必然会存在一些联系。那么我们在前面学习的过程中,仅仅只是在描述单个的事物,并没把握事物和事物之间的关系。

接下来我们要研究的是如何通过Java中的类,展示所描述的事物和事物之间的关系。

一般事物和事物之间会有继承的关系。在Java中我们的类就是描述事物的,那么也就是说我们的类之间也应该存在继承的关系。

需求:

分别描述学生和老师两个类。

学生:

属性:年龄、性别、姓名

行为:学习、吃饭

定义构造函数给属性初始化

老师:

属性:年龄、性别、姓名、薪水

行为:上课、吃饭

定义构造函数给属性初始化.

代码如下所示:

/*
学生:
    属性:年龄、性别、姓名
    行为:学习、吃饭
*/
class Student
{
    String name;
    int age;
    String sex;
​
    Student( String name , int age , String sex )
    {
        this.name = name;
        this.age  = age;
        this.sex = sex;
    }
    //行为
    void study()
    {
        System.out.println(name+"在 学习 java ......");
    }
​
    void eat()
    {
        System.out.println("吃饭.......");
    }
}
/*
老师:
    属性:年龄、性别、姓名、薪水
    行为:上课、吃饭
*/
class Teacher
{
    String name;
    int age;
    String sex;
    double salary;
​
    Teacher( String name , int age , String sex , double salary )
    {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.salary = salary;
    }
​
    void teach()
    {
        System.out.println(name+"正在讲 Java....");
    }
    void eat()
    {
        System.out.println("吃饭.......");
    }
}

上述程序在描述学生和老师这2类事物,但是学生和老师这两类事物中有共同的属性和行为,我们应该只描述一次就可以了,然后让学生和老师共享这些属性和行为。

把学生和老师中的共性行为和属性进行抽取。抽取到哪里合适呢?

在描述事物的时候,发现描述的两个事物之间没有继承的关系,但是2个事物之间有共同的属性和行为,那么我们就找这2个事物的共同祖先。

学生和老师,没有继承关系,但是学生和老师都属于人这类事物。那么我们就可以把学生和老师的共性内容抽取到人这个类中,然后让学生和老师与人这个类产生关系即可。

继承引入图解.jpg

1.jpg

其中,多个类可以称为子类,单独被继承的那一个类称为父类超类(superclass) 或者基类

继承的含义

继承描述的是事物之间的所属关系。例如,兔子属于食草动物,食草动物属于动物。可见,父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。

继承:就是子类继承父类的属性行为,使得子类对象可以直接具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。

Java中的继承体现

需求:把学生和老师中的共性内容抽取到人这个类中

然后分别建立学生、老师和人的关系,可以让学生和老师使用人类中的属性和方法。

怎么建立Person类和Student类还有Teacher类之间的关系?

   在java中使用关键字extends 建立类和类之间的关系,extends在java中表示继承的意思。

关键字extends的使用格式:

classs  类1  extends  类2
{     
       //代码
}

说明:类1叫做子类。类2叫做父类

代码如下:

/*
    把学生和老师中的共性内容抽取到人这个类中
​
*/
class Person
{
    String name;
    int age;
    String sex;
​
    void eat()
    {
        System.out.println("吃饭.......");
    }
}
/*
学生:
    属性:年龄、性别、姓名
    行为:学习、吃饭
​
*/
class Student extends Person
{
    Student( String name , int age , String sex )
    {
        this.name = name;
        this.age  = age;
        this.sex = sex;
    }
    //行为
    void study()
    {
        System.out.println(name+"在 学习 java ......");
    }
}
/*
老师:
    属性:年龄、性别、姓名、薪水
    行为:上课、吃饭
*/class Teacher extends Person
{
    double salary;
​
    Teacher( String name , int age , String sex , double salary )
    {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.salary = salary;
    }
​
    void teach()
    {
        System.out.println(name+"正在讲 Java....");
    }
}
​
​
class ExtendsDemo2 
{
    public static void main(String[] args) 
    {
        Student s = new Student("张三",23,"男");
        s.eat();
        s.study();
​
        Teacher t = new Teacher("黑旋风",28,"男",9999.99);
        t.eat();
        t.teach();
    }
}

Java中的继承代码体现:

当某个类需要继承其他类的时候,在当前定义这个类的地方使用 extends 关键字,然后让这个类去继承需要继承的其他类。

这时被继承的类称为 父类。  实现继承的这个类称为 子类。

例如:

 classs  类1 **extends**  类2
{     
       //代码
 }

类2就是父类,类1就是子类。 

在Java的继承语法中,只要使用extends 关键字 任何2个类之间都可以完成继承。但是我们在写程序的时候,一定要心里清楚2个类之间有没有联系,能不能继承。

继承的好处

  1. 提高代码的复用性(减少代码冗余,相同代码重复利用)。
  2. 使类与类之间产生了关系。

小结

1.继承实际上是子类相同的属性和行为可以定义在父类中,子类特有的属性和行为由自己定义,这样就实现了相同属性和行为的重复利用,从而提高了代码复用。

2.子类继承父类,就可以直接得到父类的成员变量和方法。是否可以继承所有成员呢?请看下节!

子类不能继承的内容

引入

并不是父类的所有内容都可以给子类继承的:

子类不能继承父类的构造器,因为子类有自己的构造器。

值得注意的是子类可以继承父类的私有成员(成员变量,方法),只是子类无法直接访问而已,可以通过getter/setter方法访问父类的private成员变量。

演示代码

class Fu {
    public int num1 = 10;
    private int num2 = 20;
​
    public void show1() {
        System.out.println("show1");
    }
​
    private void show2() {
        System.out.println("show2");
    }
​
    public int getNum2() {
        return num2;
    }
​
    public void setNum2(int num2) {
        this.num2 = num2;
    }
}
​
class Zi extends Fu {
}
public class Demo03 {
    public static void main(String[] args) {
        Zi z = new Zi();
        System.out.println(z.num1);
//      System.out.println(z.num2); // 私有的子类无法使用
        // 通过getter/setter方法访问父类的private成员变量
        System.out.println(z.getNum2());
​
        z.show1();
        // z.show2(); // 私有的子类无法使用
    }
}
​