Day18---学习Java第二弹
2021-07-28
对象和类
二、类中的构造方法
先来看对象的产生格式:
1 ①类名称 ②对象名称 = ③new ④类名称();
①类名称:规定了对象的类型。即:对象可以使用哪些属性和方法都是由类定义的;
②对象名称:如果需要使用对象,需要有一个名称,这是一个唯一的标记;
③new:分配新的堆内存空间;
④类名称():调用了名称和类名称相同的方法,这就是构造方法。
实际上,构造方法一直在被我们调用,但我们并没有去定义它,为什么能够使用呢?这是因为在整个Java开发中,
为了保证程序可以正常执行,即便用户没有定义任何构造方法,也会在程序编译后自动为类增加一个没有参数,
方法名称与类名称相同,没有返回值的构造方法。
构造方法的定义:方法名称和类名称相同,没有返回值声明。
1 //无参,无返回值的构造方法
2 public Book() {
3
4 }
如果在Book类中没有定义以上的构造方法,那么也会自动生成一个无参,无返回值的构造方法。
我们再看:
1 package com.wz.classandobj;
2
3 class Book{
4
5 //无参,无返回值的构造方法
6 public Book() {
7 System.out.println("无参构造方法");
8 }
9
10 }
11
12 public class TestDemo {
13 public static void main(String args[]) {
14 Book book = null;//声明对象
15 }
16 }
运行,什么也没有打印。
在主方法中加入实例化对象的代码:
1 public class TestDemo {
2 public static void main(String args[]) {
3 Book book = null;//声明对象
4 book = new Book();//实例化对象
5 }
6 }
运行:
无参构造方法
以上说明,构造方法是在对象使用关键字new实例化的时候被调用。
构造方法与普通方法最大的区别是:
构造方法在实例化对象(new)的时候只调用一次,而普通方法是在实例化对象之后可以随意调用多次。
在实际开发中,构造方法的作用是在类对象实例化的时候设置属性的初始化内容,范例如下:
1 package com.wz.classandobj;
2
3 class Book{
4
5 private String title;
6 private double price;
7
8 public Book(String title, double price) {
9 this.title = title;
10 this.price = price;
11 }
12
13 public String getTitle() {
14 return title;
15 }
16
17 public void setTitle(String title) {
18 this.title = title;
19 }
20
21 public double getPrice() {
22 return price;
23 }
24
25
26 public void setPrice(double price) {
27 this.price = price;
28 }
29
30 public void getInfo(){
31 System.out.println("图书的名称:"+title+" 图书的价格:"+price);
32 }
33 }
34
35 public class TestDemo {
36 public static void main(String args[]) {
37 Book book = new Book("Java开发",89.9);//设置属性的初始化内容
38 book.getInfo();
39
40 }
41 }
运行结果:
图书的名称:Java开发 图书的价格:89.9
如果一个类中已经明确定义了一个构造方法,则无参构造方法将不会自动生成。而且,一个类之中至少存在一个构造方法。另外,既然构造方法也属于方法,那么构造方法也可以重载,但是由于构造方法的特殊性,所以在构造方法重载时注意其参数的类型及参数的个数即可。
范例如下:
1 package com.wz.classandobj;
2
3 class Book{
4
5 private String title;
6 private double price;
7
8
9 public Book() {
10 System.out.println("无参的构造方法");
11 }
12
13
14 public Book(String title) {
15 this.title = title;
16 System.out.println("有一个参数的构造方法");
17 }
18
19
20 public Book(String title, double price) {
21 this.title = title;
22 this.price = price;
23 System.out.println("有俩个参数的构造方法");
24 }
25
26 public void getInfo(){
27 System.out.println("图书的名称:"+title+" 图书的价格:"+price);
28 }
29 }
30
31 public class TestDemo {
32 public static void main(String args[]) {
33 Book book1 = new Book();
34 book1.getInfo();
35
36 Book book2 = new Book("Java开发");
37 book2.getInfo();
38
39 Book book3 = new Book("Java开发",89.9);
40 book3.getInfo();
41
42 }
43 }
运行结果:
无参的构造方法
图书的名称:null 图书的价格:0.0
有一个参数的构造方法
图书的名称:Java开发 图书的价格:0.0
有俩个参数的构造方法
图书的名称:Java开发 图书的价格:89.9
在进行构造方法重载时有一个编写建议:所有重载的构造方法按照参数的个数由多到少,或者是由少到多排列。
我们再来看,如果在类中为属性直接设置默认值,结果会怎样?
1 package com.wz.classandobj;
2
3 class Book{
4
5 private String title = "Android开发";
6 private double price = 199.9;
7
8
9 public Book() {
10 System.out.println("无参的构造方法");
11 }
12
13
14 public Book(String title) {
15 this.title = title;
16 System.out.println("有一个参数的构造方法");
17 }
18
19
20 public Book(String title, double price) {
21 this.title = title;
22 this.price = price;
23 System.out.println("有俩个参数的构造方法");
24 }
25
26 public void getInfo(){
27 System.out.println("图书的名称:"+title+" 图书的价格:"+price);
28 }
29 }
30
31 public class TestDemo {
32 public static void main(String args[]) {
33 Book book1 = new Book();
34 book1.getInfo();
35
36 Book book2 = new Book("Java开发");
37 book2.getInfo();
38
39 Book book3 = new Book("Java开发",89.9);
40 book3.getInfo();
41
42 }
43 }
运行结果:无参的构造方法
图书的名称:Android开发 图书的价格:199.9 有一个参数的构造方法 图书的名称:Java开发 图书的价格:199.9 有俩个参数的构造方法 图书的名称:Java开发 图书的价格:89.9
从上面可以发现:如果在类中为属性直接设置默认值,而且这个默认值是在构造方法执行完后才会设置的,
且属性内容为对应数据类型的默认值时才设置类中定义的这个默认值。但是,要注意的是在构造方法没有执行之前,属性内容都是其对应数据类型的默认值。