继承性:

提高了代码的复用性,让类与类之间产生了关系。有了这个关系,才有了多态的特性。注意:千万不要为了获取其他类的功能,简化代码而继承。必须是类与类之间有所属关系才可以继承。

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(),前提是父类中的构造函数有类似形式。