zoukankan      html  css  js  c++  java
  • Java构造函数的深入理解

    Java构造函数的深入理解

     

    我们人出生的时候,有些人一出生之后再起名字的,但是有些人一旦出生就已经起好名字的。那么我们在 java 里面怎么在对象一旦创建就赋值呢?

    复制代码
    public class Person {
        
        String name; //    姓名
        int age; //    年龄
        
        public static void main(String[] args) {
            Person p = new Person(); //    创建了Person类型的p对象
            System.out.println("姓名: " + p.name + " 年龄: " + p.age); //    name = null, age = 0;
            //这个小孩刚出生的时候没有姓名和年龄
        }
    复制代码
    复制代码
    public class Person {
        
        String name; //    姓名
        int age; //    年龄
        //    构造方法
        Person(String name,int age){
            this.name = name; //     给对象赋予name值
            this.age = age; //    给对象赋予age值
        }
        public static void main(String[] args) {
            Person p = new Person("张三",1); //    创建了Person类型的p对象,并且调用构造方法赋予该对象属性值
            System.out.println("姓名: " + p.name + " 年龄: " + p.age); //    name = 张三, age = 1;
            //这个小孩刚出生的时候已经有了姓名和年龄
        }
    复制代码

    1. 构造方法的作用:

    构造方法作用:

    1).创建对象,凡是必须和new一起使用.

    2).对对象进行初始化.

    复制代码
    public class Person {
        
        String name; //    姓名
        int age; //    年龄
        //    全参构造方法
        Person(String name,int age){
            this.name = name; //     给对象赋予name值
            this.age = age; //    给对象赋予age值
        }
        //    无参构造方法
        Person(){
            
        }
        
        public static void main(String[] args) {
            Person p = new Person("张三",1); 
            /*
                 根据创建对象的实参个数,jvm回去寻找合适的构造方法,
                 两个实参所有会调用含有两个参数的构造方法.Person(String name,int age)
             */
            System.out.println("姓名: " + p.name + " 年龄: " + p.age); //    name = 张三, age = 1;
            //这个对象创建出来的时候已经有了自己的姓名和年龄
        }
    复制代码

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

    (1). 一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象在调用功能之前,在建立时,应该具备的一些内容。也就是对象的初始化内容。

    (2). 构造函数是在对象建立时由 jvm 调用, 给对象初始化。一般函数是对象建立后,当对象调用该功能时才会执行。

    (3). 普通函数可以使用对象多次调用,构造函数就在创建对象时调用。

    (4). 构造函数的函数名要与类名一样,而普通的函数只要符合标识符的命名规则即可。

    (5). 构造函数没有返回值类型。

    3. 构造函数要注意的细节:

    (1). 当类中没有定义构造函数时,系统会指定给该类加上一个空参数的构造函数。这个是类中默认的构造函数。当类中如果自定义了构造函数,这时默认的构造函数就没有了。

    备注:可以通过 javap 命令验证。

    (2). 在一个类中可以定义多个构造函数,以进行不同的初始化。多个构造函数存在于类中,是以重载的形式体现的。因为构造函数的名称都相同。

    复制代码
    class Perosn{
        private int id;
        
        private String name;
        
        private int age;
        
        public Perosn(){
            cry();
        }
        public Perosn(int id, String name, int age) {
            this.id = id;
            this.name = name;
            this.age = age;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
        
        public void cry(){
            System.out.println("哇哇哇....");
        }
        
    }
    复制代码

    问题:要求每个小孩出生都会哭,这份代码有两个构造函数,如果需要每个小孩出生都要哭的话,那么就需要在不同的构造函数中都调用 cry() 函数,但是这样子的话造成了代码重复问题,那么怎么解决呢?构造代码块。

    4. 构造代码块:

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

    复制代码
    class Perosn{
        private int id;
        
        private String name;
        
        private int age;
        
        {
            cry();// 每个Person对象创建出来都会执行这里的代码
        }
        
        public Perosn(){
            cry();
        }
        public Perosn(int id, String name, int age) {
            this.id = id;
            this.name = name;
            this.age = age;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        
        
        public void cry(){
            System.out.println("哇哇哇....");
        }
        
    }
    复制代码

    具体作用:

      1:给对象进行初始化。对象一建立就运行并且优先于构造函数。

      2:与构造函数区别

        1:构造代码块和构造函数的区别,构造代码块是给所有对象进行统一初始化, 构造函数给对应的对象初始化。

        2:构造代码块的作用:它的作用就是将所有构造方法中公共的信息进行抽取。

    例如孩子一出生统一哭

    代码如下:

    复制代码
    class Boy {
    
        String name;
        int age;
        String gender;
         // 构造代码块,给所有对象进行初始化。
        {
            System.out.println("哭。。。");
        }
         
        Boy() {
            System.out.println("无参构造");
        }
    
        Boy(String n, int a, String g) {
            name = n;
            age = a;
            gender = g;
            System.out.println("有参构造");
        }
    
        void run() {
            System.out.println("跑...");
        }
    
    }
    
    class Demo9 {
    
        public static void main(String[] args) {
    
            System.out.println();
            Boy b = new Boy();
    
            Boy b2 = new Boy("jack", 1, "男");
    
        }
    }
    复制代码
     
  • 相关阅读:
    HDU 6071
    HDU 6073
    HDU 2124 Repair the Wall(贪心)
    HDU 2037 今年暑假不AC(贪心)
    HDU 1257 最少拦截系统(贪心)
    HDU 1789 Doing Homework again(贪心)
    HDU 1009 FatMouse' Trade(贪心)
    HDU 2216 Game III(BFS)
    HDU 1509 Windows Message Queue(队列)
    HDU 1081 To The Max(动态规划)
  • 原文地址:https://www.cnblogs.com/xinxihua/p/13180180.html
Copyright © 2011-2022 走看看