在面向对象的编程过程中,类是一个极极极为重要的概念,它是一群具有相似状态与行为的东西的组合,例如动物就是一个类。
但世界上不是只有一个类,动物这个类之下还有猫狗虎豹豺狼,他们都有动物这个类包含的特征,即共性;但他们作为不同物种不同类,又有各自特殊的行为与生活习性。
一、概念
使不同子类保留父类共性的同时维持自己的特性。
二、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类是所有类的父类;