构造函数

构造函数的作用: 给对应的对象进行初始化。


构造函数的格式:

构造函数的格式:
    
    修饰符  函数名(形式参数列表){
        初始化的语句;
    }

构造函数要注意的细节:

1. 构造函数是没有返回值类型的。    
2. 构造函数的函数名必须 与类名一致。 
3. 构造函数并不是由我们手动调用的, 构造函数是在创建对应对象的时候由jvm主动调用的(每创建一个对象就会调用一次构造函数)。
4. 如果一个类没有显式的添加一个构造函数,那么java编译器会为该类添加一个无参的构造函数。
5. 如果一个类已经显式的添加一个构造函数,那么java编译器则不会再为该类添加一个无参的构造函数。
6. 构造函数是可以以函数重载的形式存在多个的。

疑问1 :我们现在知道创建对象的时候,jvm需要调用到对应的构造方法,那么以前我们没有学构造方法,那么
jvm还会调用到构造方法吗?而且构造方法存在吗?

存在构造方法的, 但是不是java虚拟机添加的,是java编译器添加的。


疑问2:java编译器添加的无参构造函数的修饰符是什么?

无参的构造函数的权限修饰符是与类名一致的。

需求: 使用一个java类描述一个婴儿。

问题: 在现实生活中有两种婴儿,一出生就有姓名与身份证编号(白户),
一种出生之后才有身份证编号与姓名(黑户)。

//婴儿类
class Baby{
    
    int id; //身份证编号

    String name; // 名字
    
    //无参的构造函数
    public Baby(){
        System.out.println("无参的构造函数调用了..");
    }
     

    //带参构造函数
    public Baby(int i , String n){
        id = i ;
        name = n;
        System.out.println("两个参数构造函数调用了..");
    }



    public void cry(){
        System.out.println("哇哇哇....");
    }
}


class Demo2 {

    public static void main(String[] args) 
    {
        /*
        Baby b1 = new Baby(); //黑户
        b1.id = 110;
        b1.name= "狗娃";
        System.out.println("身份证:"+ b1.id+" 姓名:"+ b1.name);
        */
        new Baby();
        new Baby();
        Baby b2 = new Baby(110,"狗剩");    //白户
        System.out.println("身份证:"+ b2.id+" 姓名:"+ b2.name);
    
    }
}

需求: 使用java类描述一个员工,员工具备的公共属性: id、 name、 age. 公共行为:上班

要求:一旦创建一个员工对象,那么该员工对象要马上具备相应的属性值。

class Emp{
    
    //事物的公共的属性

    int id;

    String name;

    int age;

    //构造函数
    public Emp(int i , String n ,int a){
        id =i;
        name = n;
        age = a;
    }


    //上班
    public void work(){
        System.out.println(name+" 好好上班!!");
    }
        
}


class Demo3 
{
    public static void main(String[] args) 
    {
        Emp e = new Emp(110,"狗娃",18);
        System.out.println("编号: "+ e.id+" 姓名:"+ e.name+" 年龄:"+ e.age);
    }
}

问题:重复代码。

构造函数的作用:给对应的对象进行初始化。

构造代码块:给所有的对象进行统一的初始化。

构造代码块格式:

构造代码块格式:
    {
        初始化语句;
    } 

代码块的类型:

构造代码块: 代码块位于成员位置上。

局部代码块 :代码块位于方法之内。

局部代码块的作用: 缩短局部变量的生命周期。


静态代码块:

//婴儿类
class Baby{
    
    int id; //成员变量

    String name;
    
    //构造代码块
    {
        //System.out.println("构造代码块被调用了.....");
        cry();
    }


    //无参的构造函数
    public Baby(){
        
    }

    //带参构造函数
    public Baby(int i,String n){
        id = i;
        name = n;
    }

    public void cry(){
        System.out.println("哇哇哇..");
    }
}


class Demo4 
{
    public static void main(String[] args) 
    {
        Baby b1 = new Baby(110,"狗娃");
        
        /*
        Baby b1 = new Baby(); //黑户
        Baby b2 = new Baby(110,"狗娃"); //白户
        //System.out.println("Hello World!");
        */
    }    
}
原文地址:https://www.cnblogs.com/hbxZJ/p/10549603.html