运行以下两个程序,写出输出结果:
程序一:
class ClassA{
public ClassA(){
System.out.println("ClassA()"); //6.输出classA() 14. 18.
}
}
class ClassB{ //3.执行classB 11.
public ClassB(){
System.out.println("ClassB()"); //4.输出ClassB() 12.
}
}
class ClassC extends ClassA{ //17.找到classA
public ClassC(){
System.out.println("ClassC()"); //19.输出classC
}
}
class ClassD extends ClassB{ //2.继承classB 10.
private ClassA ca = new ClassA(); //5.找到classA() 13.
private ClassC cc; //7.没有new 什么也不执行 15.
public ClassD(){
System.out.println("ClassD()"); //8.输出classD()
}
public ClassD(int i){
cc = new ClassC(); //16.找到classC
System.out.println("ClassD(int)"); //20.输出classD(int)
}
}
public class TestConstructors{
public static void main(String args[]){
ClassD cd1 = new ClassD(); //1.找到claasD
ClassD cd2 = new ClassD(10); //9.找到带参的classD()
}
}
方法:从main方法入手,分析语句。PS(每条语句后注释为程序语句执行顺序)
运行结果为:
classB() classA() classD() classB() classA() classA() classC() classD(int)
程序二:
class ClassA{
static {
System.out.println("In ClassA Static"); //3.
}
public ClassA(){
System.out.println("ClassA()"); //4.
}
}
class ClassB{
static {
System.out.println("In ClassB Static"); //8.
}
public ClassB(){
System.out.println("ClassB()"); //10.
}
}
class ClassC extends ClassB{ //7.
static{
System.out.println("In ClassC Static"); //9.
}
public ClassC(){
System.out.println("ClassC()"); //11.
}
}
class MyClass {
static ClassA ca = new ClassA(); //2.
ClassC cc = new ClassC(); //6.
static{
System.out.println("In Static MyClass"); //5.
}
public MyClass(){
System.out.println("MyClass()"); //12.
}
}
public class TestMain{
public static void main(String args[]){
MyClass mc1 = new MyClass(); //1.
MyClass mc2 = new MyClass(); //13.
System.out.println(mc1.cc == mc2.cc);//14
System.out.println(mc1.ca == mc2.ca);//15
}
}
思路:从main方法入手
1.有static 先执行static
2.static存在于继承中时,执行完子类、父类中所有的ststic后在执行其他的。
3.Static 仅执行一次
运行结果:In ClassA Static ClassA() In Static MyClass In ClassB Static In ClassC Static
ClassB() ClassC() MyClass()
false true
注释13句执行与第1句一样,只是所有Static 修饰的不在执行,故输出ClassB() ClassC() MyClass()
14句cc为new ClassC(),故mc1.cc与mc2.cc不相等,返回false
15句ca为static修饰,故mc1.ca与mc2.cc相等,返回true