java 继承
1.概念
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
可以类比生物学中的门、纲、目、科、属、种这种对生物的等级层次划分。
比种高一级的是属,所有种具有属的所有特性,依次类推。
在面向对象语言中也是如此,可以定义一个Animal类,有cat,dog等类是属于动物的,因此可以继承Animal类。
class 父类名{
}
class 子类名 extends 父类名{
}
父类 parent class
超类 super class
//通常指直接上级
基类 base class
//通常指包括直接上级在内的上级的上级
关键字:extends
2.使用继承原因
提高代码复用率
举个例子,比如需要开发一个cat和一个dog类,二者有一个ID和一个name属性,以及一个介绍自己的方法,如果按一般方式就是创建两个类,两个类大体一样,这样,代码就有重复,导致代码臃肿。使用继承可以解决,如下:
public class Animal {
private int id;
private String name;
public Animal(int id,String name){
this.id=id;
this.name=name;
}
public void introduct(){
System.out.println("I'm No."+this.id+",my name is "+this.name+".");
}
}
public class Cat extends Animal{
public Cat(int id, String name) {
super(id, name);
}
}
public class Dog extends Animal{
public Dog(int id, String name) {
super(id, name);
}
}
按照如上方式可以节省很多代码量,同时也便于管理代码
3.继承特性
子类拥有父类非private的属性,方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。
子类不能继承父类的构造器(构造方法或者构造函数),如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句
如下例子说明:
public class Animal {
private int id;
public Animal(){
System.out.println("animal is created");
}
public Animal(int id){
this.id=id;
System.out.println("id:"+id+" animal is created");
}
}
public class Cat extends Animal{
private int id;
public Cat(){
super(2);
System.out.println("cat is created");//交换这两句的位置报错
}
public Cat(int id){
System.out.println("id:"+id+" cat is created");
this.id=id;
}
}
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Cat cat1=new Cat(1);
Cat cat2=new Cat();
}
}
输出:
animal is created
id:1 cat is created
id:2 animal is created
cat is created
4.特殊:
不允许继承类:
final class 类名{ }
以final声明的方法不允许覆盖,以final声明的变量不允许更改。
使用final可以构造一个只读类。
override:
子类父类定义了一样的方法,方法名及参数一样,但是,方法内容可以改变
overloads:
子类拥有父类同名的方法,但是两者参数类型或者参数数目不一样。
参考:
金旭亮Java编程系列
菜鸟教程