关于继承,被构造函数折腾得暴躁了一下

报错:There is no default constructor available in。。。

情境一:
   * ParentClass.java
     

Java code?

1

2

3

4

5

6

7

8

9

10

11

     /**

      * 超类

      */

      public class ParentClass {

     

      public ParentClass(String str1, String str2) {

         

      }

 

       }

      


     
   * Subclass.java
     

Java code?

1

2

3

4

5

6

7

     /**

      * 子类,继承了ParentClass类

      */

      (1public class Subclass extends ParentClass {

 

         }

      


     
   * 异常:
       在“(1)”标记处编译器提示:Implicit super constructor ParentClass() is undefined for default constructor. Must define an explicit constructor

   * 异常描述:我大致想了一下,可能冲突的地方时这样——因为父类(ParentClass)有一个带参的构造器,并且,构造器的参数一般比较重要,将在上下文中继续使用。也就是说 ParentClass 的其它方法将很可能使用到这个构造器的两个参数。而,按照继承规则,子类的对象将可以使用到父类的方法,所以,ParentClass中 那些使用了构造器参数值的方法,其子类(Subclass)对象将可能访问到。因此,必须要确保父类构造器的参数可以被赋值。“可以被赋值”有两种方式,一是先实例化出对象,再通过setter赋值;二是在实例化的时候就赋值,即通过构造器参数的形式传参。
     上例中,父类(ParentClass)没有提供默认的无参构造器。所以,方式一被封死。而方式二在本例中,无法通过在实例化Subclass时,同时为父类构造器变量赋值,方式二亦被封死。聪明的编译器意识到了这个风险,于是提前标识错误。
     根据这个思考,我给父类(ParentClass)加上了一个无参构造器,编译错误消失:
     * ParentClass.java
     

Java code?

1

2

3

4

5

6

7

8

9

10

11

     /**

      * 超类

      */

      public class ParentClass {

      (2public ParentClass(){ }

      public ParentClass(String str1, String str2) {

         

      }

 

       }

      


     “(2)”处为新加入的语句。

      继续思考,既然有两种解决方式,那么第二种方式该如何实现。我的理解是让子类覆盖父类的带参构造器:
       * ParentClass.java
     

Java code?

1

2

3

4

5

6

7

8

9

10

11

     /**

      * 超类

      */

      public class ParentClass {

     

      public ParentClass(String str1, String str2) {

         

      }

 

       }

      


     
   * Subclass.java
     

Java code?

1

2

3

4

5

6

7

8

9

     /**

      * 子类,继承了ParentClass类

      */

      public class Subclass extends ParentClass {

          (3public Subclass(String str1, String str2) {

        (4super(str1, str2);

    }    

      }

      


     “(3)”处的方法为新添。语句“(4)”不可以删去,可以解释为保障父类的构造器变量被赋值。错误警告亦被解除。
   * 疑问:
     老实说,我对我在“异常描述”中的思考结果不太满意,希望有前辈告知关于这个问题,SUN的官方定义。希望看到有关于这个问题的官方说明或者有详细描述的文章。


情境二:
   根据情境一,我修改了代码。
   * ParentClass.java
     

Java code?

1

2

3

4

5

6

7

8

9

10

11

     /**

      * 超类

      */

      public class ParentClass {

     

      public ParentClass(String str1, String str2) {

         

      }

 

       }

      


     
   * Subclass.java
     

Java code?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

     /**

      * 子类,继承了ParentClass类

      */

      public class Subclass extends ParentClass {

          public Subclass(String str1, String str2) {

        (5super(getStr1(), getStr2());

    }

 

        public String getStr1() {

        return null;

    }

     

    public String getStr2() {

        return null;

    }

      }

      


     我将“情境一”的方式二的代码在“(5)”处做出了改动,并且添加了两个获取构造器参数的方法。

     * 异常:
       在“(5)”标记处编译器提示:Cannot refer to an instance method while explicitly invoking a constructor
       
       同样若这样修改代码,因为它有点换汤不换药,亦给出同样的错误提示:     
     * Subclass.java
     

Java code?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

       /**

        * 子类,继承了ParentClass类

        */

        public class Subclass extends ParentClass {

            public Subclass(String str1, String str2) {

          super(str1, str2);

      }

 

      public Subclass(){

          this(getStr1(),getStr2());

      }

 

          public String getStr1() {

          return null;

      }

     

      public String getStr2() {

          return null;

      }

        }

        



     * 异常描述:异常提示大概是说不能在调用构造器时引用一个实例方法。
       我尝试给这个错误提示一个解释,可能是说,getStr1()方法属于Subclass的实例,而构造器 Subclass(String str1, String str2) 方法是供对象创建者调用的。亦可以说,在调用 Subclass(String str1, String str2) 构造器时,Subclass 类的实例对象并未创建成功。那么,要调用属于实例对象的 getStr1()、getStr2() 自然不被允许。因此,我将 getStr1()、getStr2() 修改为静态方法,异常消失:
     * Subclass.java
       

Java code?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

       /**

        * 子类,继承了ParentClass类

        */

        public class Subclass extends ParentClass {

            public Subclass(String str1, String str2) {

          super(getStr1(), getStr2());

      }

 

          //用static修饰为静态方法

          public static String getStr1() {

          return null;

      }

     

      public static String getStr2() {

          return null;

      }

        }

        


     感谢https://bbs.csdn.net/topics/350150672

你可能感兴趣的:(java)