什么是继承?
继承的本质是避免重复。比如猫和狗都是动物,而动物都有一些共性,我们在声明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的常用方法
-
单根继承 当我们声明一个类的时候,都会隐式的继承自Object类,也就是说所有类都拥有Object的方法。多根继承如果父类有同名方法,在调用时会造成困惑,而单根继承不会出现这种情况。
-
Object的常用方法
- equals
覆盖了equals方法就要覆盖hashCode方法。
- toSting
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } - equals
继承中的类结构与初始化顺序
在继承时首先完成父类的构造。
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);
}
}
向上向下转型
- 一个子类型的对象永远是一个父类类型对象,比如一只猫一定是个动物。
- 当需要一个父类型时总可以传递一个子类型,反过来不行。猫肯定是动物,而一个动物不一定是一只猫。
final关键字
- final声明的变量被初始化后其值就不能改变了,它是线程安全的。
- 用来修饰对象的时候,对象的地址是不可改变,而地址指向的实际内容是可变的,这一点和js中的const是差不多的。
- 用来修饰class的时候,这个类将不可以背继承。
- 用来修饰方法的时候禁止继承/覆盖/重写这个方法。