子类中所有构造方法默认都会访问父类中空参数的构造方法。
例如下面这个例子:
class Father {
public Father(){
System.out.println("Father的无参构造方法");
}
}
class Son extends Father{
public Son(){
System.out.println("Son的无参构造方法");
}
}
public class jicheng_biduan {
public static void main(String[] args) {
Son son = new Son();
}
}
运行结果:
由运行结果我们可以看出最后运行的结果Father类中的无参构造方法也被打印出来了,但是我们main函数中并没有声明Father对象,按道理来说,不应该出现Father类中的构造方法,为什么呢?
原因是:因为子类会继承父类的非私有数据,可能也会使用父类中的数据,所以子类初始化之前,一定要完成父类数据的初始化,
attention:子类每一个构造方法第一句都是super();
示例二:
class Father {
public Father(){
System.out.println("Father的无参构造方法");
}
public Father(String name){
System.out.println("Father的有参构造方法");
}
}
class Son extends Father{
public Son(){
super(); //可注释
System.out.println("Son的无参构造方法");
}
public Son(String name){
super(); //可注释
System.out.println("Son的有参构造方法");
}
}
public class jicheng_biduan {
public static void main(String[] args) {
Son son = new Son();
System.out.println("---------------------");
Son s2=new Son("王祖贤");
}
}
运行结果:
由运行结果可得:
s2并没有执行父类的有参构造,所以我们必须记住:子类中所有构造方法默认都会访问父类中空参数的构造方法。
-------------------------------------------------------------------------------------------
若我们不想给父类无参构造,但还想调用父类中有参构造,怎么办呢?
这时我们可以super(....);方法调用父类中的有参构造函数,同样的,调用时也会对父类进行初始化。
也可以使用this();方法。
例如:
class Father {
// public Father(){
// System.out.println("Father的无参构造方法");
// }
public Father(String name){
System.out.println("Father的有参构造方法");
}
}
class Son extends Father{
public Son(){
super("linqingxia");
System.out.println("Son的无参构造方法");
}
public Son(String name){
super("linqingxia");//this(); 也可以用this来调用本类中的无参构造,但用this的前提是子类无参构造中含有super(.....);方法
System.out.println("Son的有参构造方法");
}
}
public class jicheng_biduan {
public static void main(String[] args) {
Son son = new Son();
System.out.println("---------------------");
Son s2=new Son("王祖贤");
}
}
运行结果:
继承中成员方法的关系
如果父类中的成员方法和子类中方法名字一样,通过子类调用,遵循就近原则。
class Father {
public void show(){
System.out.println("show Father");
}
}
class Son extends Father{
public void show(){
System.out.println("show Son");
}
}
public class jicheng_biduan {
public static void main(String[] args) {
Son son = new Son();
son.show();
}
}
---------------------------------------------------------------------------------------
class Father {
public void show(){
System.out.println("show Father");
}
}
class Son extends Father{
// public void show(){
// System.out.println("show Son");
// }
}
public class jicheng_biduan {
public static void main(String[] args) {
Son son = new Son();
son.show();
}
}
运行结果:
----------------------------------