首页 > 代码库 > 大数据JAVA基础第十天

大数据JAVA基础第十天

1.继承extends(也叫扩展)

 

引入

首先写两个类:

    //定义学生类

    class Student {

       //成员变量

       private String name;

       private int age;

       //空构造

       public Student(){}

      

       //getXxx()/setXxx()

   

       public void eat() {

           System.out.println("吃饭");

       }

    }

 

//定义教师类

    class Teacher {

       //成员变量

       private String name;

       private int age;

       //空构造

       public Teacher(){}

      

       //getXxx()/setXxx()

      

       public void eat() {

           System.out.println("吃饭");

       }

    }

2.继承概述

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

通过extends关键字可以实现类与类的继承,继承的格式如下:

    class 子类名 extends 父类名 {} 

单独的这个类,也就是被继承的类,称为父类,基类或者超类;这多个类称为子类或者派生类。

有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。

3.继承的案例和继承的好处

通过一个具体案例来演示代码

案例1:学生类和教师,定义两个功能(吃饭,睡觉)

案例2:加入人类后改进

/*

    继承概述:

       把多个类中相同的内容给提取出来定义到一个类中。

    格式:

       class 子类名 extends 父类名 {}

    好处:

       A:提高了代码的复用性

       B:提高了代码的维护性

       C:让类与类之间产生了关系,是多态的前提

*/

//使用继承前

/*

class Student {

    public void eat() {

       System.out.println("吃饭");

    }

    public void sleep() {

       System.out.println("睡觉");

    }

}

4.继承的好处

提高了代码的复用性

   多个类相同的成员可以放到同一个类中

提高了代码的维护性

   如果功能的代码需要修改,修改一处即可,继承的类中自动都被修改了

让类与类之间产生了关系,是多态的前提

5.Java中继承的特点

  • Java只支持单继承,不支持多继承。

    即:一个类只能有一个直接父类,不可以有多个直接父类。

 

    class SubDemo extends Demo{}           //ok

    class SubDemo extends Demo1,Demo2...//error不能继承多个类

 

  • Java支持多层继承(继承体系)

    class A{}

    class B extends A{}

    class C extends B{}

 

6.Java中继承的注意事项

子类只能继承父类所有非私有的成员(成员方法和成员变量)

 

子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法。

 

不要为了部分功能而去继承

 

我们到底在什么时候使用继承呢?

继承中类之间体现的是:"is a"的关系。

7.继承中成员变量的关系

案例演示

子父类中同名和不同名的成员变量

子类方法中寻找变量的顺序

类的组成:

       成员变量:

       构造方法:

       成员方法:

    而现在我们又讲解了继承,所以,我们就应该来考虑一下,类的组成部分的各自关系。

    继承中成员变量的关系:

       A:子类中的成员变量和父类中的成员变量名称不一样,这个太简单。

       B:子类中的成员变量和父类中的成员变量名称一样,这会出现什么情况呢?

           在子类方法中访问一个变量的查找顺序:

           a:在子类方法的局部范围找,有就使用

           b:在子类的成员范围找,有就使用

           c:在父类的成员范围找,有就使用

           d:如果还找不到,就报错。

8.结论

在子类方法中访问一个变量

首先在子类局部范围找,也就是方法内部

然后在子类成员范围找,也就是子类的成员变量

最后在父类成员变量范围找(肯定不能访问到父类局部范围)

如果还是没有就报错。

9.super关键字

super的用法和this很像

this   代表本类对象的引用

super  代表父类存储空间的标识(可以理解为父类对象的引用)

 

用法(this和super均可如下使用)

  • 访问成员变量

    this.成员变量

    super.成员变量(访问父类的成员变量,不能访问父类的private变量)

    访问静态成员时,也可以用:父类名.静态成员

  • 访问构造方法(子父类的构造方法问题再讲)

this(…)       super(…)          //

  • 访问成员方法(子父类的成员方法问题再讲)

   this.成员方法()     super.成员方法()

10.问题是:

       我不仅仅要输出局部范围的num,还要输出本类成员范围的num。怎么办呢?

       我还想要输出父类成员范围的num。怎么办呢?

           如果有一个东西和this相似,但是可以直接访问父类的数据就好了。

           恭喜你,这个关键字是存在的:super。

    this和super的区别?

           this代表本类对应的引用。

           super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)

           A:调用成员变量

              this.成员变量 调用本类的成员变量

              super.成员变量 调用父类的成员变量

           B:调用构造方法

              this(...)  调用本类的构造方法

              super(...) 调用父类的构造方法

           C:调用成员方法

              this.成员方法 调用本类的成员方法

              super.成员方法 调用父类的成员方法

大数据JAVA基础第十天