1. java的继承(Inheritance)
继承是OOP一个重要特性。的主要目的就是代码的re-use,以减少代码量。并且可以很好的理解和管理class们。对java中的继承,了解下面这些要点就差不多了:
1. 继承的基本概念
2. is-a relationship
3. 关键词 extends
4. 构造函数和继承
5. 调用父类方法和变量: super
6. type-casting: upcasting 和 downcasting
7. instanceof
8. override和override的规则 **(hin重要)
9. inner class的继承
10. abstract class 和继承
11. 其他
1. 继承的基本概念
继承是一个允许class继承另一个class的一些通用的fields和methods。几个概念:
- Super Class: 父类(也被叫做base class or a parent class)。是那个被别人继承自己属性的class。
- Sub Class: 子类(也被叫做derived class, extended class, or child class)。是继承了另一个class的属性的class。子类也可以添加自己的fields和methods, 也可以覆盖重写(override)父类的方法(不影响父类)。
- Reusability: 当我们想创建一个新的class的时候,有另一个class包含了一些这个class需要的属性,就可以用继承的方式来re-use代码。
2. is-a relationship
要好好的理解继承,一定要牢牢的记住,is-a relationship。
子类 is-a 父类。
一只猫也是一只动物。
3. 关键词```extends```
一个继承的例子:
//猫是动物,有动物的属性猫都有,所以Cat可以继承Animal
class Cat extends Animal{
private String color; //猫自己的属性。
//同时猫也继承了父亲的两个属性: vegetarian和noOfLegs。
//虽然在父类里是private的,并不能被子类access,但是还是会继承来。
public Cat(String color) {
//猫不是吃素的,有四条腿。
super(false,4); //调用了Animal里面第二个构造函数。
this.color=color;
}
//这类method叫setter和getter
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
public class Main
{
public static void main(String args[])
{
Cat cat = new Cat("black");
System.out.println("Cat color is " + cat.getColor());
//cat 可以调用父类里的方法。
//private的field只能通过getter来access
System.out.println("Cat is Vegetarian?" + cat.isVegetarian());
System.out.println("Cat has " + cat.getNoOfLegs() + " legs.");
}
}
输出:
an animal with 4 legs created
Cat is Vegetarian?false
Cat has 4 legs.
Cat color is black
4. 构造函数和继承
- 父类里的构造函数不能被子类继承。
super()
是子类用来调用父类构造函数的方法。 而且只能在子类的构造函数的第一行。 - 如果要造一个subclass,会先调用父类的构造函数,再调用自己的构造函数。 super() 就是用来说明要用父类哪个构造函数。
- 如果在子类的构造函数里没有super(),系统会会调用父类默认 构造函数。如果父类里面没有默认的构造函数,那么子类必须调用相应的构造函数,不然会报错。
class Animal { //如果添加一个带参数的constructor,那么Animal里面就没有default的constructor了 public Animal(boolean vegetarian, int legs){ System.out.println("an animal with " + legs + " legs created"); } } class Cat extends Animal{ //此时必须