class Pun
{
Pun ()
{
System.out.println("调用了构造函数Pun");
}
}
class Hed extends Pun{
Hed ()
{ super();
System.out.println("调用了子类的构造函数");
}
}
public class T7 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Hed hed =new Hed();
}}
看上面的代码
我想问的是 当new Hed()的时候应该运行的是 初始化父类的构造函数 —>初始话子类的构造函数 ,因为在子类中遇到super(),导致调用 父类的构造函数 ,那样的话 输出的结果 应该是 调用了构造函数Pun 调用了构造函数Pun 调用了子类的构造函数 但是为什么结果不是那样子的?
{
Pun ()
{
System.out.println("调用了构造函数Pun");
}
}
class Hed extends Pun{
Hed ()
{ super();
System.out.println("调用了子类的构造函数");
}
}
public class T7 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Hed hed =new Hed();
}}
看上面的代码
我想问的是 当new Hed()的时候应该运行的是 初始化父类的构造函数 —>初始话子类的构造函数 ,因为在子类中遇到super(),导致调用 父类的构造函数 ,那样的话 输出的结果 应该是 调用了构造函数Pun 调用了构造函数Pun 调用了子类的构造函数 但是为什么结果不是那样子的?
也会自动加上,而且肯定是第一行,Hed ()
{ super(); // 当运行Hed的构造函数时,在这里只会调用一次父类Pun的构造函数
System.out.println("调用了子类的构造函数");
}
}
调用了子类的构造函数
你的结果不是这样的吗?代码没问题的
java也会默认帮你写上super()调用父类无参的构造方法
你把父类的构造方法写上参数再把super()去掉,编译就通不过了。
super()一般用于调用有参构造无参的就可以免了
class Pun
{
Pun () {
System.out.println("调用了构造函数Pun");
} }
class Hed extends Pun{
Hed () {
//super(); //这句你是显示地调用了super,如果你去掉这句,依然是打印一句调用了构造函数Pun。
System.out.println("调用了子类的构造函数");
}
}
public class Test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Hed hed =new Hed();
} }
如果你不显示地调用,系统会自动去调用那个无参的构造函数,如果你显示地调用了,就只调用一次了。不知道我讲得明不明白
你要明白就算你不添加该类的构造函数。
系统也会给你加上一个隐式的构造函数。
class test
{ //系统默认的构造函数格式,你是看不见的,但确实存在。
public void test()
{
super();
}
}
但是你要是自己构造了一个构造函数,系统就不会为你添加上面的构造函数了。比如:
class test
{ //这个是你自己写的构造函数。
public void test()
{
/*这个你也可以自己添加。就算你不加,系统也会默认帮你加上。
super();*/
}
}
public class test1
{
public void test1()
{
System.out.println("父类的构造函数运行1次");
}
}public class test2 extends test1
{
public void test2()
{
System.out.println("子类构造函数的运行");
}}
然后你自己在父类、子类里 构造对象,看看怎么运行的。
public class test2 extends test1
{
public void test2()
{ this();
System.out.println("子类构造函数的运行");
}
}