A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔司龙 中级黑马   /  2015-6-28 21:21  /  104 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、子类中对父类构造函数的调用规则
1、如果不显式指定,子类中的构造函数会默认调用父类中的无参构造
测试代码
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 ExtendsDemo02{
         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)

如果此时父类中没有无参构造,则编译会报错,如:
class Parent{
         private String name;
         private int age;
         public Parent(String name, int age){
                   System.out.println("Person(String name, int age)");
                   this.name = name;
                   this.age = age;
         }
}

class Child extends Parent{
         public Child(){
                   System.out.println("Child()");
         }
}

public class ExtendsDemo{
         public static void main(String args[]){
                   Child c1 = new Child();
         }
}

上面的代码编译时会出现如下错误提示:
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()
------------------------------------------

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马