我们声明对象赋值是这样的 Dog myDog = new Dog()
看上去是在调用Dog这个方法 其实我们是在调用Dog的构造函数
构造函数并不是方法,它带有new的时候会执行的程序代码,这段程序代码会在你初始一个对象时候执行
唯一能调用构造函数的办法就是新建一个类
无参构造函数
public Dog(){
}
看到它与方法的不同了么?它没有返回类型,并且名称与类的名称要相同
当我们在没有自己写构造函数,编译器会帮你写一个无参构造函数。但是如果你有参构造函数,在调用无参构造函数是错误的,例如:
public class Practice { // 带有public class的文件只能有一个且必须与文件名一致
public static void main(String[] args) {
// TODO 自动生成的方法存根
//调用这个无参构造函数就会如下图所示
//Dog dog = new Dog();
Dog dog2 = new Dog(10);
dog2.getDogAge();
}
}
class Dog{
int age;
public Dog(int DogAge){
age = DogAge;
}
public void getDogAge(){
System.out.println("Dog age : " + age);
}
}
构造函数有一个关键特征是它会在对象能够被赋值给引用之前就执行,这就代表可以有机会在对象使用前介入
public class Practice { // 带有public class的文件只能有一个且必须与文件名一致
public static void main(String[] args) {
Dog dog = new Dog();
}
}
class Dog{
public Dog(){
System.out.println("汪汪!");
}
}
构造函数就可以让我们有机会介入new的过程
构造函数的重载
如果类有一个以上的构造函数,则参数一定要不一样,这包括了参数的顺序与类型而不是参数的名字。
你使用int 型和double型的参数顺序 与 double型和int型的参数顺序是不同的
public class Mushroom(){
public Mushroom(int size){}
public Mushroom(){}
public Mushroom(boolean isMagic){}
public Mushroom(boolean isMagic, int size){}
public Mushroom(int size, boolean isMagic){}
}
到这个地方就该写父类了,假如说父类是抽象的也可以有构造函数么?
是可以的,虽然你不能对抽象的类执行new操作,但抽象的类还是父类,因此它的构造函数会在具体子类创建出实例时执行
父类的构造函数需要执行,完整的对象需要也是完整的父类核心,所以这就是为什么父类构造函数必须执行的原因
子类调用父类的构造函数,应该用super(),并且super()必须放在第一句
public Boop(int i){
super();
size = i;
}
假如这么用super
public Boop(int i){
size = i;
super()
}
这样编译器就不允许通过了
还有你没有自己加上super(),编译器会自己给子类构造函数加上super();
但编译器帮忙加的一定是没有参数的版本,要是父类有多个重载版本,也只有无参数的这个版本会被调用
你要从某个构造函数调用重载版的另一个构造函数 就要用this() 但是要记住super和this不能同时调用,因为这两个都要放在第一行语句
public class Practice { // 带有public class的文件只能有一个且必须与文件名一致
public static void main(String[] args) {
Animal dog = new Dog();
}
}
class Animal{
int age;
public Animal(){
this(3);
System.out.println("age1 : " + age);
}
public Animal(int myAge){
age = myAge;
System.out.println("age2 : " + age);
}
}
class Dog extends Animal{
public Dog(){
// super();
System.out.println("汪汪!");
}
}