8.以下代码能否编译通过?假如能编译通过,运行时将得到什么打印结果? class A { public A() {} public A(int i) { this(); } } class B extends A { public boolean B(String msg) { return false; } } class C extends B { private C() { super(); } public C(String msg) { this(); } public C(int i) {} } 
4.以下代码能否编译通过?假如能编译通过,运行“java B”时将得到什么打印结果?class A {int i;A(int i) {this.i = i * 2;}}
class B extends A {public static void main(String[] args) {B b = new B(2);}B(int i) {System.out.println(i);}}

解决方案 »

  1.   

    第一题能通过编译,因为B类中没有构造方法
    第二题不能,因为B类继承A,而A又没有无参数构造方法,所有在B的构造方法中要显示调用父类构造方法才行
      

  2.   

    第一个没有语法冲突
    只是有一个和类名一样的方法名
    这是允许的,只是会有警告说你最好不要这样命名第二个不能编译通过
    因为B在调用B(int i)之前会调用他的父类的默认构造函数A()
    但是A里没有定义(这是因为它已经定义了A(int i),导致不会自动生成默认构造函数),所以编译失败
      

  3.   

    我们假设A是B的父类,B是A的子类。1、如果程序员没有给类A没有提供构造函数,则编译器会自动提供一个默认的无参数的构造函数,如果用户提供了自己的构造函数,则编译器就不在提供默认的无参数构造函数。2、子类B实例化时会自动调用父类A的默认构造函数,所以如果A的默认的无参数的构造函数为private,则编译器会报错,而如果A没有提供默认的无参数的构造函数,而提供了其他类型的构造函数,编译器同样会报错,因为B找不到A的默认无参数构造函数。所以,我们最好给父类A提供一个无参数的构造函数。3、或者在B的构造函数中显示的调用父类A的有参构造函数。super(parameter)4、即使子类中的构造函数有参数,如果他没有显示调用父类中的构造函数,他仍然会默认调用父类中的默认构造函数