Java中继承的规则

一、子类中对父类构造函数的调用规则

1、如果不显式指定,子类中的构造函数会默认调用父类中的无参构造

测试代码

package day07;

import java.sql.Date;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter.DEFAULT;

class Parent{

    private String name;

    private int age; 

    public Parent(){

              System.out.println("Person()");

    } 

    public Parent(String name){

              System.out.println("Person(String name)");

              this.setName(name);

    } 

    public Parent(String name, int age){

              System.out.println("Person(String name, int age)");

              this.setName(name);

              this.setAge(age);

    } 

    public void setName(String name){

              this.name = name;

    } 

    public void setAge(int age){

              this.age = age;

    }

}



class Child extends Parent{



    public Child(){

              System.out.println("Child()");

    } 

    public Child(String name){

              System.out.println("Child(String name)");

    } 

    public Child(String name, int age){

              System.out.println("Child(String name, int age)");

    }

}



public class StaticKey{

    public static void main(String args[]){

              Child c1 = new Child();

              Child c2 = new Child("张三");

              Child c3 = new Child("张三", 15);

    }

}

输出

 Person()  

 Child()
 Person()
 Child(String name)
 Person()
 Child(String name, int age)

如果此时父类中没有无参构造,则编译会报错,如:

Java中继承的规则

上面的代码编译时会出现如下错误提示:

ExtendsDemo.java:13: 错误: 无法将类 Parent中的构造器 Parent应用到给定类型;
        public Child(){
                      ^
  需要: String,int
  找到: 没有参数
  原因: 实际参数列表和形式参数列表长度不同
1 个错误

2、如果父类中有多个构造函数,可以使用“super(参数列表)”的格式显式地调用父类中指定构造函数,如上述代码在Child类中做如下修改后就可以消除上面的编译错误。

class Child extends Parent{

         public Child(){

             super("bing", 30);

             System.out.println("Child()");

         }

}

二、子类中对父类函数的覆写规则

1、子类覆写父类中的函数时,访问权限只能扩大,不能减小

2、父类中private权限的函数无法被子类覆写

测试代码:

class Parent{

         public void print(){

                   System.out.println("Parent: print()");

         } 

         public void fun(){

                   this.print();

         }

}

 

class Child extends Parent{

         public void print(){

                   System.out.println("Child: print()");

         }

}

 

public class ExtendsDemo01{

         public static void main(String args[]){

                   Child c1 = new Child();

                   c1.print();

                   c1.fun();

         }

}

分别将Parent类中的print()方法的权限修改为private、default和public,然后在Child类中进行覆写,输出结果如下表所示。

------------------------------------------

父类         子类           输出

------------------------------------------

private      default        Child: print()

                                Parent: print() 

private      public         Child: print()

                                Parent: print() 

default      default        Child: print()

                                Child: print() 

default      public         Child: print()

                                Child: print()

public       public          Child: print()

                                Child: print()

------------------------------------------