8. 组合与继承

249 阅读2分钟

什么是继承?

继承的本质是避免重复。比如猫和狗都是动物,而动物都有一些共性,我们在声明Cat类和Dog类的时候他们的共性我们可以写到一个Animal类中,而不需要重复声明。

public class Animal{
    public void Eat(String food){}
}

public class Dog extends Animal{}
public class Cat extends Animal{}

通过extends关键字即可让Dog继承Animal类。

Java的继承体系与Object的常用方法

  1. 单根继承 当我们声明一个类的时候,都会隐式的继承自Object类,也就是说所有类都拥有Object的方法。多根继承如果父类有同名方法,在调用时会造成困惑,而单根继承不会出现这种情况。

  2. Object的常用方法

    • equals

      覆盖了equals方法就要覆盖hashCode方法。

    • toSting
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    

继承中的类结构与初始化顺序

在继承时首先完成父类的构造。

public class Animal{
    public String name;
    public Animal(){    }
    
    public Animal(String name){
        this.name = name
    }
    
    public void meow(){
        Syetem.out.println("我的名字是" + name);
    }
}

public void Cat extends Animal{
    public void Cat(String name){
        super(name); // 
        //super(); // 调用Animal的无参构造器,不写super,默认也会调用;
    }
}

public static void main(){
    new Cat("张三");
}

在初始化一个猫的实例的时候,会先执行super方法去实例化父类。

实例方法的覆盖Override

父类的行为不是我们想要的时候,我们可以覆盖父类的方法。

public class americanCat extends Animal{
    public void americanCat(String name){
        super(name);
    }
    
    @Override
    public void meow(){
        super.meow(); // 调用父类方法
        Syetem.out.println("My name is" + name);
    }
}

向上向下转型

  1. 一个子类型的对象永远是一个父类类型对象,比如一只猫一定是个动物。
  2. 当需要一个父类型时总可以传递一个子类型,反过来不行。猫肯定是动物,而一个动物不一定是一只猫。

final关键字

  1. final声明的变量被初始化后其值就不能改变了,它是线程安全的。
  2. 用来修饰对象的时候,对象的地址是不可改变,而地址指向的实际内容是可变的,这一点和js中的const是差不多的。
  3. 用来修饰class的时候,这个类将不可以背继承。
  4. 用来修饰方法的时候禁止继承/覆盖/重写这个方法。