zoukankan      html  css  js  c++  java
  • java 构造函数

    1、public className(){}。

    2、名称与类名相同,无返回值,无返回类型,void也不行。(就是上边的形式,除了可以有参数)。

    3、有0个或多个参数。

    4、每个类都至少有一个constructor。如果没有显示的写,系统会默认构造一个方法体为空的空参构造函数。如果类有显示声明的构造函数(不一定是空参的),那么系统就不会默认构造一个空参constructor,进而若声明的函数正好不是空参的,那么该类就没有空参构造函数,而空参构造函数始终是一个类的默认构造函数)。

    5、每个类可以有多个constructor,即重载,其参数不同。默认的constructor是空参构造函数。

    6、constructor用于new一个新的对象。

    7、继承。子类不会继承父类constructor(因为此时继承下来的类名和子类类名不同),但是出于尊重,在initialize子类之前,必须先initialize父类(下边第二条)

      1)子类继承父类,子类构造器中,如果要显示的调用父类构造器,必须在其第一行中写super(),eg:

    public class Son{
      public Son(<参数>){
          super(<参数>);
          ...
    }        
    }

      2)子类继承父类,子类构造器中如果没有显示的调用父类构造器,那么我们在调用执行子类构造器时,系统会默认先调用父类默认构造器(空参构造器),即会在子类构造器的第一行默认加上super()。如果父类显示声明了带参构造器,而没有声明空参构造器,那么编译器就会报错了。 即不管怎样,都是要先执行父类的构造函数,以把父类的东西继承下来,然后才执行子类本身。 另外这个调用是从父层往下一层一层调用的,即先调用执行父父层的默认构造器,然后父层的默认构造器,然后子类构造器,依此类推。eg:

     1 public class Grandfather {  
     2        
     3      public Grandfather(){  
     4          System.out.println("This is Grandfather!");  
     5      }  
     6        
     7      public Grandfather(String s){  
     8          System.out.println("This is Grandfather"+s);  
     9      }  
    10  }  
    11   
    12  public class Father extends Grandfather {  
    13   
    14      public Father(){  
    15          System.out.println("This is Father!");  
    16      }  
    17      public Father(String s){  
    18          System.out.println("This is Father!"+s);  
    19      }  
    20  }  
    21   
    22  public class Son extends Father {  
    23   
    24      public Son(){  
    25          System.out.println("This is Son!");  
    26      }  
    27      public Son(String s){  
    28          System.out.println("This is Son"+s);  
    29      }  
    30  }  
    31   
    32  public class Construct {  
    33   
    34      /**  
    35       * @param args  
    36       */ 
    37      public static void main(String[] args) {  
    38   
    39          Son son = new Son();  
    40          System.out.println("**********************************");  
    41          Son son1 = new Son("**==**");  
    42   
    43      }  
    44 }

    执行结果:

    This is Grandfather!
    This is Father!
    This is Son!
    **********************************
    This is Grandfather!
    This is Father!
    This is Son**==**
    从控制台打印的结果可以看出,当执行子类时,都是去找它的父类的默认的构造函数,先执行父类的构造函数,再执行子类的本身。

      针对以上情况,我们现在做个修改,改其中的一个类的代码如下:把Grandfather类显式写出的缺省构造函数注释掉:

     1 public class Grandfather {  
     2           
     3     //  public Grandfather(){  
     4     //      System.out.println("This is Grandfather!");  
     5     //  }  
     6     //      
     7         public Grandfather(String s){  
     8             System.out.println("This is Grandfather"+s);  
     9         }  
    10    }

      此时,Father类就会报错了。即子类没有显示调用的情况下,父类要么没有声明任何构造器,要么有一个显示声明的空参构造器。

      上述若想不报错,也可以在Father类中显示声明对父类构造器的调用:

     1 public class Father extends Grandfather {  
     2   
     3      public Father(){  
     4          super("**ss**");  
     5          System.out.println("This is Father!");  
     6      }  
     7      public Father(String s){  
     8          super(s);  
     9          System.out.println("This is Father!"+s);  
    10      }  }

    执行Construct.java

    控制台输出为:

    This is Grandfather**ss**
    This is Father!
    This is Son!
    **********************************
    This is Grandfather**ss**
    This is Father!
    This is Son**==**

  • 相关阅读:
    jenkins 简单实现php集成上线部署
    关于PHP7
    关于版本迭代的那些事
    confirmit中手机端不能直接给input设置disabled属性
    confirmit中Html Styles有一处bug(或者说是一个坑)
    vsCode快捷键大全
    vscode打不开文件夹或文件夹未响应
    js中排序方法sort() 和 reverse()
    js最简单的编写地点
    js对象转换为json格式时,js对象属性中有值为null和undefined注意事项
  • 原文地址:https://www.cnblogs.com/hf-cherish/p/3716486.html
Copyright © 2011-2022 走看看