下面这段代码的输出结果是什么?
public class Test { public static void main(String[] args) { new Circle(); }} class Draw { public Draw(String type) { System.out.println(type+" draw constructor"); }} class Shape { private Draw draw = new Draw("shape"); public Shape(){ System.out.println("shape constructor"); }} class Circle extends Shape { private Draw draw = new Draw("circle"); public Circle() { System.out.println("circle constructor"); }}运行结果shape draw constructorshape constructorcircle draw constructorcircle constructor
父类的构造器调用以及初始化过程一定在子类的前面。
由于Circle类的父类是Shape类,所以Shape类先进行初始化,然后再执行Shape类的构造器。接着才是对子类Circle进行初始化,最后执行Circle的构造器。
2.下面这段代码的输出结果是什么?
public class Test { public static void main(String[] args) { Shape shape = new Circle(); System.out.println(shape.name); shape.printType(); shape.printName(); }} class Shape { public String name = "shape"; public Shape(){ System.out.println("shape constructor"); } public void printType() { System.out.println("this is shape"); } public static void printName() { System.out.println("shape"); }} class Circle extends Shape { public String name = "circle"; public Circle() { System.out.println("circle constructor"); } public void printType() { System.out.println("this is circle"); } public static void printName() { System.out.println("circle"); }}运行结果shape constructorcircle constructorshapethis is circleshape
1.对于这个例子,静态绑定的过程是:java文件编译时,编译器检查出引用shape的静态类型是Shape类,由于将printName()方法和父类Father关联起来。也就是说,程序运行前编译器是无法检查出引用shape的动态类型的,所以会直接调用静态类型中对应的方法。
2.覆盖只针对非静态方法,而隐藏是针对成员变量和静态方法的。
3.覆盖和隐藏之间的区别是:覆盖受RTTI约束的,而隐藏却不受该约束。也就是说只有覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。
以上就是长沙一度软件培训java培训机构的小编针对“Java面试题必知,常见Java继承面试题”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
Java面试题