java构造方法菜鸟教程_java好学吗「建议收藏」

java构造方法菜鸟教程_java好学吗「建议收藏」构造方法可以做什么,到底有什么作用?默认构造方法又是什么?_构造方法

你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家。这是《教妹学 Java》专栏的第二十五篇,我们来理解一下 Java 中的构造方法——构造方法可以做什么,到底有什么作用?

本专栏中的代码已收录到 GitHub github.com/itwanger ,里面还有我精心为你准备的一线大厂面试题。

java构造方法菜鸟教程_java好学吗「建议收藏」

三妹终于上大学了,学的计算机软件编程。她学校离我家很近,坐公交车也就 10 站路的距离, 每逢周末她都会来找我,让我辅导她学习 Java。作为一名拥有十余年编程经验的程序员,再加上父母给我们的这份血缘关系,我觉得义不容辞。

“二哥,这次我们要学习的内容是‘构造方法’,对吧?”看来三妹已经提前预习了我上次留给她的作业。

“是的,三妹。在 Java 中,构造方法是一种特殊的方法,当一个类被实例化(创建对象)的时候,就会调用构造方法。只有在构造方法被调用的时候,对象才会被分配内存空间。 ”我面带着朴实无华的微笑回答着她,“每次使用 new 关键字创建对象的时候,构造方法至少会被调用一次。”

“如果你在一个类中没有看见构造方法,并不是因为构造方法不存在,而是被缺省了,编译器会给这个类提供一个默认的构造方法。”

“往大的方面说,Java 有两种类型的构造方法:无参构造方法和有参构造方法。”

“注意,之所以叫它构造方法,是因为对象在创建的时候,需要通过构造方法初始化值(就是描写对象的那些状态)。”

—-正儿八经的分割线,正文开始————

01、创建构造方法的规则有哪些

构造方法必须符合以下三个规则:

  • 构造方法的名字必须和类名一样;
  • 构造方法没有返回类型;
  • 构造方法不能是抽象的、静态的、最终的、同步的,也就是说,构造方法不能通过 abstract、static、final、synchronized 关键字修饰

不过,我们可以使用访问权限修饰符(private、protected、public、default)来修饰构造方法,它控制了构造方法的创建方式。

02、 什么是默认构造方法

如果一个构造方法中没有任何参数,那么它就是一个默认构造方法,也称为无参构造方法。

/** * @author 微信搜「沉默王二」,回复关键字 PDF */
public class Bike { 
   
    Bike(){ 
   
        System.out.println("一辆自行车被创建");
    }

    public static void main(String[] args) { 
   
        Bike bike = new Bike();
    }
}

在上面这个例子中,我们为 Bike 类中创建了一个无参的构造方法,它在我们创建对象的时候被调用。

程序输出结果如下所示:

一辆自行车被创建

通常情况下,无参构造方法是可以缺省的,我们程序员并不需要显式的声明无参构造方法,我们更倾向于把这项工作交给编译器。

java构造方法菜鸟教程_java好学吗「建议收藏」

“二哥,默认构造方法的目的是什么?它是一个空的啊!”三妹疑惑地看着我,提出了这个尖锐的问题。

“三妹啊,默认构造方法的目的主要是为对象的字段提供默认值,看下面这个例子你就明白了。”我胸有成竹地回答道。

/** * @author 沉默王二,一枚有趣的程序员 */
public class Person { 
   
    private String name;
    private int age;

    public static void main(String[] args) { 
   
        Person p = new Person();
        System.out.println("姓名 " + p.name + " 年龄 " + p.age);
    }
}

输出结果如下所示:

姓名 null 年龄 0

在上面的例子中,默认构造方法初始化了 name 和 age 的值,name 是 String 类型,所以默认值为 null,age 是 int 类型,所以默认值为 0。

03、什么是有参构造方法

有参数的构造方法被称为有参构造方法,参数可以有一个或多个。有参构造方法可以为不同的对象提供不同的值。当然,也可以提供相同的值。

/** * @author 沉默王二,一枚有趣的程序员 */
public class ParamConstructorPerson { 
   
    private String name;
    private int age;

    public ParamConstructorPerson(String name, int age) { 
   
        this.name = name;
        this.age = age;
    }

    public void out() { 
   
        System.out.println("姓名 " + name + " 年龄 " + age);
    }

    public static void main(String[] args) { 
   
        ParamConstructorPerson p1 = new ParamConstructorPerson("沉默王二",18);
        p1.out();

        ParamConstructorPerson p2 = new ParamConstructorPerson("沉默王三",16);
        p2.out();
    }
}

在上面的例子中,构造方法有两个参数(name 和 age),这样的话,我们在创建对象的时候就可以直接为 name 和 age 赋值了。

new ParamConstructorPerson("沉默王二",18);
new ParamConstructorPerson("沉默王三",16);

04、如何重载构造方法

在 Java 中,构造方法和方法类似,只不过没有返回类型。它也可以像方法一样被重载。构造方法的重载也很简单,只需要提供不同的参数列表即可。编译器会通过参数的数量来决定应该调用哪一个构造方法。

/** * @author 沉默王二,一枚有趣的程序员 */
public class OverloadingConstrutorPerson { 
   
    private String name;
    private int age;
    private int sex;

    public OverloadingConstrutorPerson(String name, int age, int sex) { 
   
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public OverloadingConstrutorPerson(String name, int age) { 
   
        this.name = name;
        this.age = age;
    }

    public void out() { 
   
        System.out.println("姓名 " + name + " 年龄 " + age + " 性别 " + sex);
    }

    public static void main(String[] args) { 
   
        OverloadingConstrutorPerson p1 = new OverloadingConstrutorPerson("沉默王二",18, 1);
        p1.out();

        OverloadingConstrutorPerson p2 = new OverloadingConstrutorPerson("沉默王三",16);
        p2.out();
    }
}

创建对象的时候,如果传递的是三个参数,那么就会调用 OverloadingConstrutorPerson(String name, int age, int sex) 这个构造方法;如果传递的是两个参数,那么就会调用 OverloadingConstrutorPerson(String name, int age) 这个构造方法。

05、构造方法和方法有什么区别

构造方法和方法之间的区别还是蛮多的,比如说下面这些:

方法 构造方法
方法反映了对象的行为 构造方法用于初始化对象的字段
方法可以有返回类型 构造方法没有返回类型
方法的调用是明确的,开发者通过代码决定调用哪一个 构造方法的调用是隐式的,通过编译器完成
方法在任何情况下都不由编译器提供 如果没有明确提供无参构造方法,编译器会提供
方法名可以和类名相同,也可以不同 构造方法的名称必须和类名相同

06、如何复制对象

复制一个对象可以通过下面三种方式完成:

  • 通过构造方法
  • 通过对象的值
  • 通过 Object 类的 clone() 方法

1)通过构造方法

/** * @author 沉默王二,一枚有趣的程序员 */
public class CopyConstrutorPerson { 
   
    private String name;
    private int age;

    public CopyConstrutorPerson(String name, int age) { 
   
        this.name = name;
        this.age = age;
    }

    public CopyConstrutorPerson(CopyConstrutorPerson person) { 
   
        this.name = person.name;
        this.age = person.age;
    }

    public void out() { 
   
        System.out.println("姓名 " + name + " 年龄 " + age);
    }

    public static void main(String[] args) { 
   
        CopyConstrutorPerson p1 = new CopyConstrutorPerson("沉默王二",18);
        p1.out();

        CopyConstrutorPerson p2 = new CopyConstrutorPerson(p1);
        p2.out();
    }
}

在上面的例子中,有一个参数为 CopyConstrutorPerson 的构造方法,可以把该参数的字段直接复制到新的对象中,这样的话,就可以在 new 关键字创建新对象的时候把之前的 p1 对象传递过去。

2)通过对象的值

/** * @author 沉默王二,一枚有趣的程序员 */
public class CopyValuePerson { 
   
    private String name;
    private int age;

    public CopyValuePerson(String name, int age) { 
   
        this.name = name;
        this.age = age;
    }

    public CopyValuePerson() { 
   
    }

    public void out() { 
   
        System.out.println("姓名 " + name + " 年龄 " + age);
    }

    public static void main(String[] args) { 
   
        CopyValuePerson p1 = new CopyValuePerson("沉默王二",18);
        p1.out();

        CopyValuePerson p2 = new CopyValuePerson();
        p2.name = p1.name;
        p2.age = p1.age;
        
        p2.out();
    }
}

这种方式比较粗暴,直接拿 p1 的字段值复制给 p2 对象(p2.name = p1.name)。

3)通过 Object 类的 clone() 方法

/** * @author 沉默王二,一枚有趣的程序员 */
public class ClonePerson implements Cloneable { 
   
    private String name;
    private int age;

    public ClonePerson(String name, int age) { 
   
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException { 
   
        return super.clone();
    }

    public void out() { 
   
        System.out.println("姓名 " + name + " 年龄 " + age);
    }

    public static void main(String[] args) throws CloneNotSupportedException { 
   
        ClonePerson p1 = new ClonePerson("沉默王二",18);
        p1.out();

        ClonePerson p2 = (ClonePerson) p1.clone();
        p2.out();
    }
}

通过 clone() 方法复制对象的时候,ClonePerson 必须先实现 Cloneable 接口的 clone() 方法,然后再调用 clone() 方法(ClonePerson p2 = (ClonePerson) p1.clone())。

07、ending

“二哥,我能问一些问题吗?”三妹精神焕发,没有丝毫的疲惫。

“当然可以啊,你问。”我很欣赏三妹孜孜不倦的态度。

“构造方法真的不返回任何值吗?”

“构造方法虽然没有返回值,但返回的是类的对象。”

“构造方法只能完成字段初始化的工作吗?”

“初始化字段只是构造方法的一种工作,它还可以做更多,比如启动线程,调用其他方法等。”

“好的,二哥,我的问题问完了,今天的学习可以结束了!”三妹一脸得意的样子。

“那你记得复习下一节的内容哦,static 关键字。”感受到三妹已经学到了知识,我也很欣慰。

二哥肝了两天两夜,《程序员不可或缺的软实力》第一版强势来袭,纯手敲,足足 20 万字精华文章,贯穿了我十余年的编程生涯,涉及到了生活和工作中的方方面面,如果你是迷茫的在校大学生,或者刚入职的新人,相信我的个人经历,可以给你带去一些思考,从而树立起正确的人生观和价值观。

java构造方法菜鸟教程_java好学吗「建议收藏」

那这份 PDF 该怎么获取呢?

链接:https://pan.baidu.com/s/1TA3txLvHxQNJEOJUHSZEqQ 密码:ps7z

如链接失效,请转至备用链接:https://shimo.im/docs/pJQv6qVcHqdYwrxx

最后,真心希望这份 PDF 能够对大家起到实质性的帮助,我也会在后面不断完善这本电子书,敬请期待。

今天的文章java构造方法菜鸟教程_java好学吗「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/68467.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注