继承性:
提高了代码的复用性,让类与类之间产生了关系。有了这个关系,才有了多态的特性。注意:千万不要为了获取其他类的功能,简化代码而继承。必须是类与类之间有所属关系才可以继承。
JAVA只支持单继承,不支持多继承。因为多继承容易带来安全隐患:当多个父类中定义了相同功能函数,但功能函数的内容不同时,子类如果进行多继承会出现不知道该使用哪一个的情况。这是JAVA在C++基础上的一个优化。同时JAVA也保留了这一机制,用另一种体现形式来表示:多实现。
总之:和C++不同的是,1个子类不能多个父类(可以多层),但和C++相同的是,子类中的成员可以覆盖父类中的成员,覆盖后如果想要在子类访问父类中的成员,就需要使用super关键字:super.成员名。类似于C++中的作用域符号::。
注:子类要覆盖父类类成员,权限必需要大于等于父类的权限而且子父类方法要一模一样!
继承后的构造函数:
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句 super(),super():会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super()。
为什么要一定要访问父类的构造函数呢?
因为:子类在继承父类后并调用自己的构造函数时,需要知道父类是如何初始化的,需要继承父类初始化的数据,于是子类就一定会隐式的访问父类的构造函数。如果父类中没有空参数的构造函数,则子类必须显式的用带参数的(如super(int x))来访问父类的带参数的构造函数。
结论:子类的所有的构造函数,默认都会访问父类中空参数的构造函数。哪怕你在一个子类构造函数中调用this()-------此时这个构造函数不能有super(),因为this()和super()只能在第一行(都是初始化,都要求先做)。但是你还是会调用子类自己的无参数构造函数,而你自己的无参数构造函数中一定会有super函数。
class Fu
{
Fu()
{
System.out.println("调用父类构造函数");
};
}
class Zi extends Fu
{
Zi(int i)
{
//这里隐式调用了super();
System.out.println(i);
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Zi b=new Zi(4);
}
}
/*
输出:
调用父类构造函数
4
*/
若如在子类构造函数中使用this()看一看是否如结论所说依旧会调用super函数
class Fu
{
Fu()
{
System.out.println("调用父类构造函数");
};
}
class Zi extends Fu
{
Zi(int i)
{
this();//此处有this() 这此类必须要有一个空构造函数
System.out.println(i);
}
Zi()
{
//这里还是会有super() 总之一定会有一个super方法被调用。
System.out.println("调用子类空参数构造函数");
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Zi b=new Zi(4);
}
}
/*
输出:
调用父类构造函数
调用子类空参数构造函数
4
*/
当然你不想调用空参数的super()时,可以在子类中显示调用带参数的super(),前提是父类中的构造函数有类似形式。