Java中对构造函数的理解

来源:互联网 发布:女人被强奸 知乎 编辑:程序博客网 时间:2024/06/05 11:26

1使用构造器需要注意的事项:(构造器的作用是:对对象进行初始化,它能够把定义对象时的参数传给对象的域。)

  当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。当类中如果自定义了构造函数,这时默认的构造函数就没有了。(备注:可以通过javap命令验证
1:构造器必须与类同名,(如果一个源文件中有多个类,那么构造器必须与公共类同名)
2:每个类可以有一个以上的构造器
3:构造器可以有0个,1个,或者多个参数
4:构造器没有返回值,也不能定义为void,在方法名前面不声明方法类型。
5:构造器总是伴随着new操作一起调用
6:使用super调用父类构造器的语句必须是子类构造器的第一条语句
如果子类构造器没有显试的调用父类的构造器,则将自动调用父类的默认(没有参数)的构造器,
如果父类没有不带参数的构造器,并且在子类的构造器中又没有显试的调用父类的构造器,则java编译器将报告错误。

代码:

public class A{
   public A(){
      System.out.println("调用了无参的构造函数");
   }
   public A(String mess){
      System.out.println("调用了有参的构造函数\n"+
         "参数内容为:"+mess);
   }
}

public class Test{
   public static void main(String [] args){
       A a_1=new A();//调用无参的构造函数
       A a_2=new A("Hello");//调用有参的构造函数
   }
}


pub

2构造函数与普通函数的区别:

1:一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象在调用功能之前,在建立之时,应该具备的一些内容,也就是对象初始化内容。
2:构造函数是在对象建立时由jvm调用,给对象初始化,一般函数是对象建立后当对象调用该功能时才会执行。
3:普通函数可以使用对象多次调用,构造函数在创建对象是调用。
4:构造函数的函数名要与类名一样,而普通函数的函数名只要符合标识符的命名规则即可。
5:构造函数没有返回值类型。


3构造代码块:(构造代码块用一对“{}”表示,代码块位置没有具体的要求,但必须与类的成员同等级别,在括号的区域内,可以对所有该类的对象进行初始化,也就是说该类对象创建时都会执行到该代码块,并且其优先于构造函数执行。)

1:构造代码块的作用:
给所有的对象进行统一的初始化。对象一建立就运行并且优先于构造函数。
2:与构造函数区别:
1:构造代码块是给所有对象进行统一初始化,构造函数是给对应的对象进行初始化;
2:构造代码块的作用是将所有构造方法中公共的信息进行抽取。
  
  1. class Perosn{  
  2.     private int id;  
  3.       
  4.     private String name;  
  5.       
  6.     private int age;  
  7.       
  8.     {  
  9.         cry();// 每个Person对象创建出来都会执行这里的代码  
  10.     }  
  11.       
  12.     public Perosn(){  
  13.         cry();  
  14.     }  
  15.     public Perosn(int id, String name, int age) {  
  16.         this.id = id;  
  17.         this.name = name;  
  18.         this.age = age;  
  19.     }  
  20.     public int getId() {  
  21.         return id;  
  22.     }  
  23.     public void setId(int id) {  
  24.         this.id = id;  
  25.     }  
  26.     public String getName() {  
  27.         return name;  
  28.     }  
  29.     public void setName(String name) {  
  30.         this.name = name;  
  31.     }  
  32.     public int getAge() {  
  33.         return age;  
  34.     }  
  35.     public void setAge(int age) {  
  36.         this.age = age;  
  37.     }  
  38.       
  39.       
  40.     public void cry(){  
  41.         System.out.println("哇哇哇....");  
  42.     }  
  43.       
  44. }  


4java构造函数的调用问题//不能继承

1:子类只调用父类默认构造函数,即无形参构造函数。如果父类没有默认构造函数(如果父类自定义了构造函数,这时默认的构造函数就没有了),那子类不能从父类调用默认构造函数。
2:子类从父类处调用父类默认构造函数,不能成为子类的默认构造函数。
3:在创建对象是,先调用父类默认构造函数对象进行初始化,然后调用子类自身自己定义的构造函数。
4:如果子类想调用父类的非默认构造函数,则必须使用super来实现。
5:子类的构造函数中,super()语句代表调用了父类的构造函数;this()语句代表调用了子类自身的构造函数。
需要注意的是,如果这两条语句显式写出来必须放在构造方法的第一行,而且这两条语句不能共存,一个构造函数中的第一行要么是this()要么是super()。
      为什么在第一行?
因为需要首先进行初始化。
      为什么不能共存?
因为this()代表的本类的其他构造函数,也会去调用super(),出现了this()就没有必要再出现super()了,重复调用没有意义。
换言之,子类中至少有一个构造函数的开头为super(),当然可以隐式存在;也就是说至少有一个构造函数的开头不是this()。

5java构造函数的执行过程:

类初始化时构造函数调用顺序:
1:初始化对象的存储空间为零活null。
2:调用父类构造函数。

3:按顺序分别调用类成员变量和实例成员变量的初始化表达式。

class Dollar {
Money m = new Money();
Rmb r = new Rmb();
public Dollar() {
System.out.println("Dollar is construct!");
}
public static void main(String[] args) {
new Dollar();
}
}
class Money {
public Money() {
System.out.println("Money is construct!");
}
}
class Rmb {
public Rmb() {
System.out.println("RMB is construct!");
}
}
输出结果:
Money is construct
RMB is construct
Dollar is construct!

原创粉丝点击