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+"的老师");
}
}