在面向对象的编程过程中,类是一个极极极为重要的概念,它是一群具有相似状态与行为的东西的组合,例如动物就是一个类。

但世界上不是只有一个类,动物这个类之下还有猫狗虎豹豺狼,他们都有动物这个类包含的特征,即共性;但他们作为不同物种不同类,又有各自特殊的行为与生活习性。

一、概念

使不同子类保留父类共性的同时维持自己的特性

二、Java中的继承

Java中子类通过extends来继承父类的方法和属性

//父类Animals
public class Animals{
    public void sleep();
}
//Cat类继承了Aninals类的方法sleep
//并且有自己独特的方法catchMouse,所以Cat类中实际上有两个方法
public class Cat extends Animals{
    public void sleep(){
    
    }
    public void catchMouse();
}

这里Cat类通过extends继承了Animals类,同时添加了自己的catchMouse方法,Animals即为Cat的父类,然后Cat便可以调用Animals类中的sleep方法。

Java语言满足单继承原则,即一个子类仅可继承一个父类。

三、继承的种类

①松散继承:子类可以重写(Overriding)父类中的方法;

②严格继承:子类只能添加方法,不可以修改父类中的方法(用final关键字修饰父类使其不可以被子类重写);

四、重写

子类继承了父类的方法,但有些时候父类的方法并不完全符合我们的需求,所以我们有时需要将父类的方法改造一下这种操作叫做重写(Overriding),重写之后的子类方法只能在子类中应用,父类中不可用(父类不可以继承子类)。

(1)我们可以这样设计:

//父类Animals
public class Animals{
    public int status = 1;
    public void sleep(){status = 0;}
}

//Cat类继承了Aninals类的方法sleep
//但是Cat重写了父类的sleep方法,
public class Cat extends Animals{
    public void sleep(){status=-status}
    public void catchMouse();
}

//此处调用sleep方法时会采用Cat类的sleep方法
public static void main(String args[]) {
    Cat a = new Cat();
    a.sleep();
    System.out.println(a.status);
}

这里最终输出的值为-1,表明a.sleep调用的是Cat子类重写的sleep方法。

(2)但我们如果这样设计:

//父类Animals
public class Animals{
    public int status = 1;
    public void sleep(){this.status = 0;}
}

//Cat类继承了Aninals类的方法sleep
//但是Cat重写了父类的sleep方法
public class Cat extends Animals{
    //此处将用super代替父类名字将子类的sleep方法用父类sleep方法实现
    public void sleep(){super.sleep();}
    public void catchMouse();
}


public static void main(String args[]) {
    Cat a = new Cat();
    a.sleep();
    System.out.println(a.status);
}

最终输出的结果就为0,因为这里用super代替了父类方法的名字,将子类中的sleep定义为父类方法的sleep,所以我们实际上调用的是父类中的方法。

(3)但如果有以下情况:

//父类Animals
public class Animals{
    public int status = 1;
    public String status;
    public void sleep(int status){status = 0;}
}

//Cat类继承了Aninals类的方法sleep
//但是Cat重写了父类的sleep方法
public class Cat extends Animals{
    //此处将用super代替父类名字将子类的sleep方法用父类sleep方法实现
    public void sleep(String status){status = "2";}
    public void sleep(int status){status = -status;}
    public void catchMouse();
}


public static void main(String args[]) {
    Cat a = new Cat();
    a.sleep();
    System.out.println(a.status);
}

其中的public void sleep(String status){status = "2";}就不算重写,因为该方法的参数列表为String status,与父类的int status不一致。这种方式叫做重载。

五、几种注意事项

①父类中的空实现被继承后要在子类中实现(父债子还);

通用的方法尽量要在父类中实现,免去了在子类中重复实现;

③子类中重写的方法要在访问限制上等于严于被重写的方法(private严于protected严于defualt严于public)

④Object类是所有类的父类;