Java构造器与c++构造函数非常的类似,相同点如下:

1、构造函数的名称均与类名相同。

2、均没有函数类型,因此也没有返回值。

3、都是在new时隐式的调用(实例化一个类时)。

4、都不可以在除构造器之外的函数中显示调用(???)。

5、构造函数都不可以被private关键字修饰。

6、一个类可以有一个以上构造函数,若没有,编译器默认有一个不带参数的空构造函数。.

7、一旦显式的写出了构造函数,无论显式写出的函数是否有参数,编译器将不在默认有一个不带参数的空构造函数。(即不写时,默认有一个不带参数的构造函数,一旦写了,即使是写了一个带参数的构造函数,原来默认的不带参数的也不再存在了,除非自己手写)。


Java中构造器的独有特点(相比c++):

1、Java的构造函数可以是默认类型,或者申明为public。

2、构造器中可以显式的调用该类或者父类的构造函数,this()代表本类构造器,super()代表父类构造器,要调用带参数的构造器时,括号中写参数。(注意:显示调用构造器必须写在构造器内容的第一行,且只能调用一个,如果不写,默认调用父类不带参数的构造器。)(问:不妥吧?如果我在构造器中写了this(),那么在构造子类时不就不能调用父类的构造函数了,有些继承的变量将不能初始化。答:如果调用了this(),this()中也会有对父类构造器的调用,所以还是可以利用到父类构造器的,不过确实也有限制,即只能调用和this()相同的父类构造器。)这也能从侧面反映Java的执行顺序,实例化类时直接调用本类的构造器,只不过在构造器的第一行会显式或者隐式的出现父类构造器,但是在实例化时不会先跑到父类中执行构造器,而后再执行子类的构造器。

3、先想到这些。。。以后再补充


public class Main{
	public static void main(String[] ges){
		System.out.println("first:");
		Teacher t = new Teacher(3);
		System.out.println("second:");
		t.name = "小布";
		t.age = 70;
		t.school = "清华大学";
		t.subject = "Java";
		t.seniority = 12;
		t.say();
		return ;
	}
}

class People{
	People(int a){
		System.out.println("父类带参数的构造函数,参数为: "+a);
	}
	People(){
		System.out.println("父类不带参数构造函数");
	}
	public String name = "hehe";
	int age;
	int height;
	void say(){
		System.out.println("我的名字是"+name);
	}
}
class Teacher extends People{
	String school;
	String subject;
	int seniority;
	Teacher(){
		System.out.println("子类无参数构造函数");
	}
	Teacher(int k){
		this();
		System.out.println("子类含参构造函数,参数为:"+k);
	}
	void say(){
		System.out.println("我是叫"+name+"的老师");
	}
}