太久没有写代码了,目前准备重新做回Java程序员,最近一直在复习Java的基础知识。古人一直都在说温故而知新,在重新学习Java的过程中我已经深切感受到古人所说的真谛。今天就子类和父类之间的构造函数的调用关系简单谈一下我的认识,有不足的地方烦请指出。
1.在Java中每一个类必须拥有构造函数,构造函数是其在实例化的时候调用。
2.在类中你可以显示的指定一个或多个构造函数。你也可以不指定的构造函数,这个时候Java在后台会默认指定一个无参的构造函数。
如果你显示指定了构造函数那么Java不会再在后台默认指定一个无参的构造函数。
3.子类中的构造函数中第一行必须调用父类的构造函数。
4.子类中的构造函数中第一行你可以显示指定调用父类的那个构造函数,也可以不显示指定。
不显示指定的时候Java在后台默认调用super()来调用父类的无参构造函数。
5.如果父类中没有无参构造函数,而且子类中又没有显示指定调用父类的其他构造函数时候,Java编译不通过。
情况一:
public class A {
public A(){
System.out.println("A的无参构造函数");
}
public A(int arg){
System.out.println("A的有参构造函数");
}
}
public class B extends A{
public B() {
System.out.println("B的无参构造函数");
}
public B(int arg) {
System.out.println("B的有参构造函数");
}
}
public class Control {
public static void main(String[] args) {
B b = new B();
B c = new B(1);
}
}
运行结果:
A的无参构造函数
B的无参构造函数
A的无参构造函数
B的有参构造函数
情况二:
将父类A的无参构造函数注释掉
public class A {
/*
public A(){
System.out.println("A的无参构造函数");
}*/
public A(int arg){
System.out.println("A的有参构造函数");
}
}
这个时候子类B要做出相应调整,不然编译不通过,因为在子类B
的构造函数里的第一行默认调用了父类A的无参构造函数,而此时
父类A的无参构造函数已经被注释掉,所以子类B找不到父类A的
无参构造函数,所以报错。现在将子类B进行相应的调整,如下:
public class B extends A{
public B() {
super(1);
System.out.println("B的无参构造函数");
}
public B(int arg) {
super(arg);
System.out.println("B的有参构造函数");
}
}
contorl类不做调整。
运行结果:
A的有参构造函数
B的无参构造函数
A的有参构造函数
B的有参构造函数
1.在Java中每一个类必须拥有构造函数,构造函数是其在实例化的时候调用。
2.在类中你可以显示的指定一个或多个构造函数。你也可以不指定的构造函数,这个时候Java在后台会默认指定一个无参的构造函数。
如果你显示指定了构造函数那么Java不会再在后台默认指定一个无参的构造函数。
3.子类中的构造函数中第一行必须调用父类的构造函数。
4.子类中的构造函数中第一行你可以显示指定调用父类的那个构造函数,也可以不显示指定。
不显示指定的时候Java在后台默认调用super()来调用父类的无参构造函数。
5.如果父类中没有无参构造函数,而且子类中又没有显示指定调用父类的其他构造函数时候,Java编译不通过。
情况一:
public class A {
public A(){
System.out.println("A的无参构造函数");
}
public A(int arg){
System.out.println("A的有参构造函数");
}
}
public class B extends A{
public B() {
System.out.println("B的无参构造函数");
}
public B(int arg) {
System.out.println("B的有参构造函数");
}
}
public class Control {
public static void main(String[] args) {
B b = new B();
B c = new B(1);
}
}
运行结果:
A的无参构造函数
B的无参构造函数
A的无参构造函数
B的有参构造函数
情况二:
将父类A的无参构造函数注释掉
public class A {
/*
public A(){
System.out.println("A的无参构造函数");
}*/
public A(int arg){
System.out.println("A的有参构造函数");
}
}
这个时候子类B要做出相应调整,不然编译不通过,因为在子类B
的构造函数里的第一行默认调用了父类A的无参构造函数,而此时
父类A的无参构造函数已经被注释掉,所以子类B找不到父类A的
无参构造函数,所以报错。现在将子类B进行相应的调整,如下:
public class B extends A{
public B() {
super(1);
System.out.println("B的无参构造函数");
}
public B(int arg) {
super(arg);
System.out.println("B的有参构造函数");
}
}
contorl类不做调整。
运行结果:
A的有参构造函数
B的无参构造函数
A的有参构造函数
B的有参构造函数