//面试
public class Main
{
class demo
{
}
public static void main(String[] args)
{
new demo();//报错,因为主函数是静态的 所以class demo要加static
//static不能使用this
}
public void show()
{
new demo();//前面实际上省略this
}
}
1.面试 多态和匿名内部类的结合
提问为什么下述代码编译失败?(据说挂了很多人)
class in
{
void set()
{
Object obj = new Object()//匿名内部类的子类对象,并向上转型为Object
{
public void show()
{
System.out.print("sdf");
}
};
obj.show();//向上转型,限制了子类对象的特有方法,所以编译失败
}
}
public class Main
{
public static void main(String[] args)
{
new in().set();
}
}
2.下述代码打印什么?
class Fu
{
public Fu()
{
show();
}
void show()
{
System.out.println("呵呵");
}
}
class Zi extends Fu
{
int num = 9;
Zi()
{
System.out.println("子构造器..."+num);
}
void show()
{
System.out.println("shiow..."+num);
}
}
public class Main
{
public static void main(String[] args)
{
new Zi();
}
}
show。。。0
子构造器。。。9
为什么?
Zi()
{
实际上省略了,super();调用super,执行Fu构造器里的show,而子类中有show方法,所以覆盖执行子类的show,子类的num默认初始化是0,所以先打印show。。。0,然后num 可视初始化9,然后打印 子构造器。。。9
}
3.下面打印什么?
class Zi
{
int num = 9;
{
System.out.println("shiow..."+num);
}
Zi()
{
System.out.println("shiow2..."+num);
}
}
public class Main
{
public static void main(String[] args)
{
new Zi();
}
}
shiow...9
show2...9
4.下面打印什么?
class Fu
{
Fu()
{
System.out.println("fu++++++++");//3
show();
}
void show()
{
System.out.print("hehe");
}
}
class Zi extends Fu
{
int num = 9;
{
System.out.println("shiow..."+num);
num = 10;
}
Zi()
{
super();//2
//可视初始化 5
//构造代码块初始化 6
System.out.println("shiow2..."+num);//7
}
void show()//4
{
System.out.println("zi show..."+num);
}
}
public class Main
{
public static void main(String[] args)
{
new Zi();//1:num = 0
}
}
fu++++++++
zi show...0
shiow...9
shiow2...10
结合以上3、4两例:
new Zi()的时,num是默认初始化0,现在执行Zi类的构造函数,然后super执行父类的构造函数,然后执行子类覆盖的show,这时num还是0,然后num显示初始化为9,然后执行代码块初始化,然后Zi()构造函数的show
代码注释的标号为执行顺序