Java基本语法之构造方法

来源:互联网 发布:linux vi e325 编辑:程序博客网 时间:2024/05/16 06:18
1、what
什么是构造方法?它长的如下:
public Apple() {}

因为本质上也是方法,所以要遵循方法的语法,即方法名,圆括号,花括号。圆括号内有参数列表,花括号内是方法体。方法名前面可以被访问修饰符修饰。但是构造方法最特殊的地方在于,它不需要返回类型,这并不是说,它的返回类型是void,而是根本没有。另外,它的名字必须和类名保持一致。


2、why
干嘛要弄这么个特殊的方法呢?官方的说法是为了保证类字段(数据成员或属性)的初始化。可以在构造方法内部对类的属性变量赋值,保证它们在被使用之前已经被恰当的初始化。
但是,初始化类字段完全可以使用任意一个方法,一定要用构造方法吗?答案是否定的。我们完全可以在类中随便写一个方法,并在这个方法中初始化类字段。然而这需要我们自己去保证,每次创建完对象都回去调用这个自己写的方法。这就呵呵了,显然可操作性不强,估计没人能一直记得做这件事。而类字段的初始化又是很重要的,所以Java的设计者们就想了构造方法这个点子。
假设没有构造方法,创建对象可能是这样的:
Apple apple = new Apple;
apple.initialize();
但是自从有了构造方法,就成了这样:
Apple apple = new Apple();
直接在类名后面加了个圆括号,一举两得:既指明了类的名称,又调用了初始化方法。坏处就是显得不伦不类:new后面怎么跟了个方法,不应该是个类吗?这也是构造方法的名称必须要和类名保持一致的原因,创建对象必须指明是哪个类,同时还得调用构造方法,那干脆用类名做构造方法名好了,起别的名字人家怎么知道是哪个类?

这样一来,调用构造方法就是在创建对象,而创建对象同时也调用了构造方法,二者达到了高度的合体~妈妈再也不会担心我忘记初始化了。第一个想到这个点子的人请收下我的膝盖。


3、how
构造方法里面只能写给类字段赋值的语句吗?可以写别的。但是从设计的角度,如果功能很多,还是另写一个方法较好。
构造方法可以不写吗?可以。如果不写,编译器会帮你自动生成一个默认的,就是参数列表和方法体都是空的那种。不写就代表你没有初始化需求,从而创建对象的时候只能使用不带参数的构造方法。
构造方法可以重载吗?可以。一个类中可以有多个构造方法,它们的参数列表不同。

关于默认构造函数,需要多说几句。假如你实现了任意一个构造方法,那么编辑器就不再为你添加默认的构造方法。于是你在创建对象时,必须按照你的构造方法的格式去传入参数。比如,你的类只有一个下面的构造方法:
public Apple(String s) {}
那么这样创建对象是不行的:
Apple apple = new Apple();

4、more
综上我们可以知道,要创建对象,必须得调用构造方法。但是如果我们用private来修饰构造方法,是不是就不能再创建这个类的对象了呢?这个问题要分情况回答。可以肯定的一点是,在类外显然不能再使用new这种方式来创建该类对象,因为别人(和你)不能在类外调用构造方法。
那如何才能让别人获取到该类对象呢?注意,private只是限制类成员不能在类外访问,但是在类内还是可以继续访问的。所以我们可以在类内的任一个方法内部调用构造方法产生该类对象并返回。这样一来还是不行,因为这个方法无法被访问到,毕竟有了对象才能调用方法。于是答案就出来,把这个方法声明为static的,就可以直接通过类名来调用。搞定~

5、父类的构造方法
Java中任意一个类必然会存在继承,至少继承了根类Object。那么子类和父类的构造方法有什么关系?关系就是,调用子类的构造方法之前,必然先调用了父类的构造方法。因为类的初始化顺序决定了父类的初始化先于子类。一般情况下,父类的构造器会被自动调用,不必写显式的代码。但是如果出于某种考虑需要显式调用父类的构造方法时,需要保证这个调用语句是子类构造方法的第一行代码。只有这样父类的初始化才能在子类之前。
0 0