当前位置: 代码迷 >> J2SE >> 为什么下面的代码执行完毕,结果是12test呢?搞不明白!解决思路
  详细解决方案

为什么下面的代码执行完毕,结果是12test呢?搞不明白!解决思路

热度:150   发布时间:2016-04-24 12:35:17.0
为什么下面的代码执行完毕,结果是12test呢?搞不明白!
class A{
A(){
this("1","2");
}

A(String s){
System.out.print(s);
}

A(String s1,String s2){
this(s1+s2);
}
}

class B extends A{
B(){
super("4");
}
B(String s){
System.out.println(s);
 
}
B(String s1,String s2){
this(s1+s2+"3");
}
}

public class test {
 
public static void main(String[] args) {
B b = new B("test");

}

}

------解决方案--------------------
生成一个对象时,也就是new 子类构造方法()
在子类构造方法的【第一行】会有三种情况
(1)this(有入参or无入参),作用:调用同类其他的构造方法
(2)super(有入参无入参),作用:调用父类的构造方法
(3)不写this(有入参or无入参)和super(有入参无入参),就会默认super(),作用:调用父类无参构造

B(String s){
System.out.println(s);
  
}
第一行不是执行System.out.println(s);而是上面的第三种情况,缺省的super();所以执行
A(){ 
this("1","2"); 
}

------解决方案--------------------
Java code
B b = new B("test");会调用B(String s){    super(); //--1 这里隐式调用A的无参构造方法,LZ可以试着把A的无参构造方法去掉,会发现无法编译    System.out.println(s);}--1会调用A(){     this("1","2"); // --2}--2会调用A(String s1,String s2){    this(s1+s2); // --3}--3会调用A(String s){    System.out.print(s); }所以--3打印 12然后回到--2,然后回到--1,然后打印B(String s)构造方法的"test"所以结果就是12test
------解决方案--------------------
class A{
A(){ 
this("1","2"); 
}

A(String s){
System.out.print(s); 
}

A(String s1,String s2){
this(s1+s2); 
}
}

class B extends A{
B(){
super("4"); 
}
B(String s){
System.out.println(s);
  
}
B(String s1,String s2){
this(s1+s2+"3"); 
}
}

public class test {
 
public static void main(String[] args) {
B b = new B("test");//子类B调用子类B的有参构造方法,B(String s){System.out.println(s);}
//打印test,而楼主忽略了一定,由于子类是从父类继承的,若想构造子类,所以得先构造父类,而规定当子类的构造方法中没有显示的调用父类的构造方法时,默认调用父类的无参构造方法,所以先执行A(){ 
this("1","2");},而this代表当前对象的引用,是A类对象,相当于调用了A(String s1,String s2){
this(s1+s2); }方法,而s1+s2是由俩个字符串并连接起来,即“12”,变成了this(“12”),接着就调用了A(String s){System.out.print(s); }方法,打印出s,即结果中多余的12,后面的不用说了吧


}




}


 
 
  相关解决方案