class FatherClass{
public int value;
public void f(){
value=100;
System.out.println("FatherClass.value= "+value);
}
}
class ChildClass extends FatherClass{
public int value;
public void f(){
super.f();
System.out.println("ChildClass.value= "+value);
System.out.println(value);
System.out.println(super.value);
}
}
public class TestInherit{
public static void main(String[] args){
ChildClass cc=new ChildClass();
cc.f();
}
}
这个程序可以编译运行,但是我有个疑问,FatherClass和ChildClass二个类都没申明构造函数,那么new一个cc对象时,子类的构造的过程中必须调用其基类的构造方法,若子类构造方法中没有显式调用基类构造方法,而基类中又没有无参的构造方法,则编译出错,为什么这个程序可以编译啊?

解决方案 »

  1.   

    在java中 如果你一个构造方法都不写的话, 它会自动生成一个无参构造方法.但是如果你显示声明了一个有参构造方法而没有无参构造方法的时候.编译器是不能帮你生成隐式无参构造方法的.所以,如果想一个类同时有 有参和无参构造方法 时 应该显示的声明两种构造方法.回答完毕..
      

  2.   

    还有个问题子类ChildClass有个成员变量value,基类FatherClass也有个成员变量value,实例后对象里有二个成员变量value?那怎么区分?
      

  3.   

    你new的是哪个类   调用的就是哪个类的成员变量    方法也是一样的
      

  4.   

    我new的是子类,子类包含基类,二个value都可以用cc.value调用吧?那调用时怎么区分?
      

  5.   

    楼主所举的例子,子类和基类都没有申明构造函数.java会自动为子类和基类添加一个构造函数,这两个默认的构造函数就是没有参数的函数.子类因为继承了基类,并且没有显式调用基类的构造函数,但是子类的默认构造函数会自动调用基类的默认构造函数,所以这个程序才能正常运行.
      

  6.   


    cc.value调用的是子类的value.因为子类重新定义的value.即覆盖了基类的value.
      

  7.   

    给你段代码,跑一下,你就知道了
    package test;public class Sub extends Super{
    int a = 1;
    public Sub(){
    System.out.println("Csub");
    a = 0;
    }
    public void setA(int a) {
    System.out.println("setsub");
    this.a = a;
    }
    public static void main(String[] args) {
    Sub sub = new Sub();
    System.out.println(sub.a);
    System.out.println(sub.getA());

    Super sub1 = new Sub();
    System.out.println(sub1.a);
    System.out.println(sub1.getA());
    }
    }
    class Super{
    int a = 8;
    public Super(){
    System.out.println("Csupper");
    a  = 9;
    setA(2);
    }
    public int getA() {
    System.out.println("getsupper");
    return a;
    }
    public void setA(int a) {
    System.out.println("setsupper");
    this.a = a;
    }
    }
      

  8.   

    当new一个对象时  默认的是首先调用基类的无参构造函数  如果基类没有无参数的构造函数  则必须显示的调用基类的有参数的构造函数    所以并不一定要“显式声明无参构造函数”