继承

基本概念

  • 扩充一个类已有的功能

优点

  • 父类定义公共的内容,方便统一修改
  • 整体减少代码量
  • 添加新类方便

语法

class 子类 extends 父类{}
  • 子类又叫派生类
  • 父类又叫超类,super(class)

在一个子类继承时,实际上会继承父类中的所有操作,对于所有的非私有(no private)操作属于显式继承(可以直接利用对象操作),而所有的私有操作属于隐式继承(间接完成)利用get/set方法间接操作

子类构造和父类构造

  • 默认情况下,子类会找到父类中的无参构造方法

    public class Hero{
        public Hero(){
            System.out.println("父类无参构造");
        }
    }
    
    public class Worrior extends Hero{
        public Worrior(){
            System.out.println("子类无参构造");
        }
        public static void main(String args[]){
            Worrior worrior = new Worrior();//实例化子类对象
        }
    }
    

    打印结果:

    父类无参构造

    子类无参构造

  • 子类实例化时会默认执行父类构造,调用父类构造方法,然后再实例化子类对象,调用子类的构造方法,其实相当于在子类构造隐藏了一个super();

    public class Worrior extends Hero{
        public Worrior(){
            super();//调用父类构造
            System.out.println("子类无参构造");
        }
    

    如果父类没有无参构造,则子类必须通过super()调用指定参数的构造方法

    public class Hero{
        private String nickName;
        public Hero(String nickName){
            this.setNickName(nickName);
            System.out.println("父类无参构造");
        }
    }
    
    public class Worrior extends Hero{
        public Worrior(){
            super("英雄名字");//调用父类对应的参数构造
            System.out.println("子类无参构造");
        }
        public static void main(String args[]){
            Worrior worrior = new Worrior();//实例化子类对象
        }
    }
    

    构造方法的执行顺序是按照继承顺序来执行的

    小结

    • 使用super关键字来调用父类构造方法
    • 默认会先调用父类构造,再调用子类构造
    • 构造方法不可继承
    • Java中只能继承一个父类
    • 父类私有属性在子类中不能直接访问(需通过get/set方法间接访问)
    • 继承关系是一种“- is - a -”关系,父类和子类之间必须存在is - a 关系

方法重写

当子类定义了和父类方法名称相同,返回值类型,参数类型和个数完全相同的方法的时候,叫做方法的重写

当在一个类中的方法被重写后,如果实例化的是这个子类对象,则调用的方法就是被重写过的方法

注意:
> 方法重写发生在通过继承而相关的不同类中
> 方法重写具有同样的方法签名和返回值类型
> @override 称为重写标注,用来保证重写的方法与原方法的前面和返回值类型一致

被子类重写的方法不能拥有比父类更严格的访问控制权限,(private < default(不写) < public)

1579177079312

当一个子类重写一个父类的方法时,想要调用父类重写的方法时,就得在方法前加上super

super.方法();
注意:
> this.方法();先从本类查找是否存在指定的方法,如果没有再调用父类操作
> super.方法();直接由子类从父类中调用指定的方法,不再找子类

重写的应用

Java中所有类都继承于java.lang.Object类,如果定义类没有显式指明父类,父类默认为object

Object类可以接收所有类的实例化对象

public class Hero{
    public static void main(String[] args){
        Object obj = new Hero();
        Hero hero = (Hero) obj;
    }
}

常用的需要重写的Object类中的三个方法:

> 取得对象信息:
public String toString();

> 对象比较:
public boolean equals(Object obj);

> 取得哈希码:
public int hashCode();
posted @ 2020-01-30 10:53  笔架山Code  阅读(111)  评论(0编辑  收藏  举报