一、主要的区别在于三个方面:修饰符、返回值、命名
1、和实例方法一样,构造器可以有任何访问的修饰符,public、private、protected或者没有修饰符 ,都可以对构造方法进行修饰。不同于实例方法的是构造方法不能有任何非访问性质的修饰符修饰,例如static、final、synchronized、abstract等都不能修饰构造方法。
解释:构造方法用于初始化一个实例对象,所以static修饰是没有任何意义的多个线程不会同时创建内存地址相同的同一个对象,所以synchronized修饰没有意义
构造方法不能被子类继承,所以final和abstract修饰没有意义。
2、返回类型是非常重要的,实例方法可以返回任何类型的值或者是无返回值(void),而构造方法是没有返回类型的,void也不行。
3、至于命名就是构造方法与类名相同,当然了实例方法也可以与类名相同,但是习惯上我们为实例方法命名的时候通常是小写的,另一方面也是与构造方法区分开。
而构造方法与类名相同,所以首字母一般大写。
下面看几个例子熟悉一下:
public class Sample {
private int x
public Sample() { // 不带参数的构造方法
this(1)
}
public Sample(int x) { //带参数的构造方法
this.x=x
}
public int Sample(int x) { //不是构造方法
return x++
}
}
上面的例子即使不通过注释我们也很容易能区分开的,再看下面一个例子
public class Mystery {private String s
public void Mystery() { //不是构造方法
s = "constructor"
}
void go() {
System.out.println(s)
}
public static void main(String[] args) {
Mystery m = new Mystery()
m.go()
}
}
程序执行的结果为null,虽然说Mystery m = new Mystery()调用了Mystery 类的构造方法,但是public void Mystery()并不是构造方法,他只是一个普通的实例方法而已,那该类的构造方法哪去了呢?
二、说到这就得说一下java的默认构造方法
我们知道,java语言中规定每个类至少要有一个构造方法,为了保证这一点,当用户没有给java类定义明确的构造方法的时候,java为我们提供了一个默认的构造方法,这个构造方法没有参数,修饰符是public并且方法体为空。如果用户有定义构造方法,就不会有默认构造方法!!!
其实默认的构造方法还分为两种,一种就是刚刚说过的隐藏的构造方法,另一种就是显示定义的默认构造方法.
如果一个类中定义了一个或者多个构造方法,并且每一个构造方法都是带有参数形式的,那么这个类就没有默认的构造方法,看下面的例子。
public class Sample1{}
public class Sample2{
public Sample2(int a){System.out.println("My Constructor")}
}
public class Sample3{
public Sample3(){System.out.println("My Default Constructor")}
}
上面的三个类中Sample1有一个隐式的默认构造方法,下列语句Sample1 s1=new Sample()合法
Sample2没有默认的构造方法,下列语句Sample2 s2=new Sample2()不合法,执行会编译错误
Sample3有一个显示的默认构造方法,所以以下语句Sample3 s3=new Sample3()合法。
构造方法的方法名必须与类名一样。
构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
构造方法不能作用是完成对象的初始化工作,他能够把定义对象时的参数传递给对象的域。
构造方法不能由编程人员调用,而要系统调用。
构造方法可以重载,以参数的个数,类型,或排序顺序区分。
例子:
1;单个构造函数方法;’
2;多个构造函数方法
(例子为;带参数与不带参数)
3;关于继承类的构造方法的调用;
先看事例;
首先要搞清楚什么是类方法,什么是构造方法一个类中的方法分为三类:
1)全局方法 2) 成员方法 3)构造方法
例:
123456789101112public class Test{private int age //这是成员变量public Test(int age){ //这是构造方法this.age = age}public void setAge(int age){ //这是成员方法this.age = age}public static int getAge(){ //这是全局方法,加了static ,成员方法就会变成全局方法return this.age}}
成员方法和构造方法没啥关系,区别在于成员方法必须用类的实例化对象进行访问,而全局方法是用类直接访问的,而构造方法是实例化对象时进行初始化的
先解释构造方法:
Test t = new Test(34)
这里的new Test(34) 括号代表了构造方法,一般的构造的方法是默认的,可以不用写,如果上面的构造方法不写,这里就应该这样实例化对象:
Test t = new Test()
成员方法:
Test t = new Test(34)
t.setAge(35)
用实例化对象调用普通方法即可
普通成员变量:
Test t = new Test(34)
因为变量age加了private 不能这样调用:t.age = 35这样是错的,只能通过方法来进行修改
全局方法:
Test.getAge()
直接这样调用就可以了,当然如果没有实例化过,这里的Test.getAge()为0