day10_面向对象特征之二:继承性丶this丶super

继承

由来

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

                                      

其中,多个类可以称为子类,单独那一个类称为父类、超类(superclass)或者基类。继承描述的是事物之间的所属关系,这种关系是: is-a 的关系。例如,图中兔子属于食草动物,食草动物属于动物。可见,父类更通用,子类更具体我们通过继承,可以使多种事物之间形成一种关系体系。

定义

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

继承的格式

通过 extends 关键字,可以声明一个子类继承另外一个父类,定义格式如下:

方法示例:

package com.wrg;


// 定义员工类Employee,做为父类
class Employee {
    // 定义name属性
    String name;

    // 定义员工的工作方法
    public void work() {
        System.out.println("尽心尽力地工作");
    }
}

/**
 * 定义讲师类Teacher 继承 员工类Employee
 */
class Teacher extends Employee {
    // 定义一个打印name的方法
    public void printName() {
        System.out.println("name=" + name);
    }
}

//定义测试类

public class ExtendsTest {
    public static void main(String[] args) {
        // 创建一个子类对象
        Teacher t = new Teacher();
        // 为该员工类的name属性进行赋值
        t.name = "小明";
        // 调用该员工的
        // printName()方法
        t.printName(); // name = 小明
        // 调用Teacher类继承来的work()方法
        t.work(); // 尽心尽力地工作
    }
}

继承带来的好处

  • 提高了代码的复用性(多个类相同的成员可以放到同一个类中)
  • 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
  • 继承的出现让类与类之间产生了关系,提供了多态的前提。

注意:不要仅为了获取其他类中某个功能而去继承

子类的特点

  • 子类继承了父类,就继承了父类的方法和属性。
  • 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。
  • 在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。

继承的规则:

子类不能直接访问父类中私有的(private)的成员变量和方法。

                                         

Java只支持单继承和多层继承,不允许多重继承

  •  一个子类只能有一个父类
  • 一个父类可以派生出多个子类
class SubDemo extends Demo{ } //ok
class SubDemo extends Demo1,Demo2...//error

                    

继承的弊端

  • 继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性

继承的应用场景

  • 使用继承,需要考虑类与类之间是否存在is..a的关系,不能盲目使用继承。is..a的关系:谁是谁的一种,例如:老师和学生是人的一种,那人就是父类,学生和老师就是子类

继承中变量的访问特点

在子类方法中访问一个变量,采用的是就近原则。

  1. 先去子类局部范围找
  2. 在去子类成员范围找
  3. 之后去父类成员范围找 
  4. 如果都没有就报错(不考虑父亲的父亲…

示例:

class Fu {
      int num = 10;
  }
  class Zi {
      int num = 20;
      public void show(){
          int num = 30;
          System.out.println(num);
      }
  }
  public class Demo1 {
      public static void main(String[] args) {
          Zi z = new Zi();
          z.show();    // 输出show方法中的局部变量30
      }
  }

this丶super关键字:

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

三种用法

      

this和super的区别

       

 继承中构造方法的访问特点

  • 子类中所有的构造方法默认都会访问父类中无参的构造方法
  • ​子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()
  • 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的
  • 对象在堆内存中,会单独存在一块super区域,用来存放父类的数据

问题:如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?

  • 通过使用super关键字去显示的调用父类的带参构造方法
  • 在父类中自己提供一个无参构造方法

继承中成员方法的访问特点

通过子类对象访问一个方法

  1. 先去子类成员范围找
  2. 在去父类成员范围找
  3. 如果都没有就报错(不考虑父亲的父亲…)

方法重写

概念

  • 子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)

方法重写的应用场景

  • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容

代码示例

package com.wrg;

public class Test {
    public static void main(String[] args) {
        // 创建子类对象
        NewPhone np = new NewPhone();
        // 调用父类继承而来的方法
        np.call("张三");
        // 调用子类重写的方法
        np.showNum();
    }
}

//父类
class Phone {
    //父类的方法
    public void sendMessage() {
        System.out.println("发短信");
    }

    public void call(String name) {
        System.out.println("给" + name + "打电话");
    }

    public void showNum() {
        System.out.println("来电显示号码");
    }

}

//智能手机类,子类
class NewPhone extends Phone {
    //重写父类的来电显示号码功能,并增加自己的显示姓名和图片功能
    public void showNum() {
        //调用父类已经存在的功能使用super关键字
        super.showNum();
        //增加自己特有显示姓名和图片功能
        System.out.println("显示来电姓名");
        System.out.println("显示头像");
    }
}

Override注解

  • 用来检测当前的方法,是否是重写的方法,起到【校验】的作用

注意事项

  • 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
  • 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
  • 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限,子类不能重写父类中声明为private权限的方法
  • 子类方法抛出的异常不能大于父类被重写方法的异常
  • 子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。

子类对象的实例化过程

 

   

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读