欢迎来到【开开心心学java,快快乐乐写代码】此专栏,这一篇博客我将为大家讲解一下java中的构造方法和封装等知识点,我自认为依旧还是写的很详细哦,快来看看吧~
目录
1、构造方法
构造方法(也叫构造器)是一种特殊的方法,那什么是方法呢,哈哈,请看我写的这一篇博客(【开开心心学java~快快乐乐写代码】初识方法之方法的概念及使用),里面有详解,这里就不再赘述了。
构造方法即方法名必须与类名相同,且没有返回值,由编译器自动调用,且在整个对象的生命周期内只调用一次。请看如下代码:
class A{ public int year; public int month; public int data; //此时方法A就是一个构造方法,它的方法名与类名相同,且没有返回值。 /*构造方法的方法名与类名相同,且没有返回值,一般用public修饰。在整个对象的生命周期内只调用一次。*/ public A(int year, int month, int data) { this.year = year; this.month = month; this.data = data; } @Override public String toString() { return "A{" + "year=" + year + ", month=" + month + ", data=" + data + '}'; } } public class Test{ public static void main(String[] args) { A a=new A(2001,12,17); System.out.println(a); } }//输出结果
从这个测试函数中可以看到,我只是创建了一个对象,并没有显式的调用对象的方法,但是最后的输出结果很明显,对象的成员变量被赋值了,显然构造方法A被调用了。
我明明没有调用这个方法A,为什么结果显示已经被调用?
原因就在于方法A为构造方法。构造方法在创建对象时由编译器自动调用。
2、 构造方法特性
在一个类中,可以有多个构造方法。上面代码中可以看到,我所写构造方法A有3个参数,其实我还可以写带有2个参数的构造方法A,或者参数类型不同的构造方法甚至是没有参数的构造方法。因为它们的方法名都与类名相同,但参数列表不完全相同,因此构造方法也可以构成重载。
注意:构造方法的作用一般是对对象中的成员进行初始化。
但是如果我不写构造方法呢?刚刚说了创建对象时编译器会自动根据参数列表去调用相应的构造方法,那如果我一开始就没有写构造方法呢,编译器还需要调用吗?如果调用又应该上哪调用去呢?
java中,如果一个类中没有写构造方法,那么编译器会自动生成一个没有参数的构造方法(即无参构造器),构造方法没有任何功能。
但是如果我自己在类中写了构造方法,无论是有参还是无参的,编译器都不会自动生成了。比如你写了如下代码:
class A{ public int year; public A(int year) { this.year = year; } } public class Test{ public static void main(String[] args) { A a=new A(); System.out.println(a); } }
编译器会报以下错误:
因为在这段代码中,我已经写了带一个参数的构造方法了,因此编译器不会再自动生成一个无参的构造器,所以当我再去new一个对象时没有给参数,编译时无法匹配到一个无参的构造方法,自然就报错啦。这时应该把A a=new A()改成A a=new A(2003)就不会报错了(2003是我随便写的一个数字哈,只要是一个int型就行了)。
3、 this()在构造方法中的作用
在构造方法中,可以用this()来调用其他的构造方法来简化代码。
class A{ public int year; public int month; public int data; public A(){ this(2001,12,17); } public A(int year, int month, int data) { this.year = year; this.month = month; this.data = data; } @Override public String toString() { return "A{" + "year=" + year + ", month=" + month + ", data=" + data + '}'; } } public class Test{ public static void main(String[] args) { A a=new A(); System.out.println(a); } }
运行结果:
注意:
this(...)必须是构造方法中第一条语句
不能与另一个构造方法互相调用,不能形成环
比如:
public Date(){
this(1900,1,1);
}
public Date(int year, int month, int day) {
this();
}
以上就是我要今天分享的内容啦,后续我还会继续更新的哒,常看我的博客会学到很多知识哦