class Animal
{
public String name;
Animal(String name)
{
this.name=name;
}
public void evey()
{
System.out.print("叫声......");
}
}class Cat extends  Animal
{
String fulColor;
Cat(String name,String fulColor)
{
super(name);
//this.name=name;//为什么不能这样访问,在passcall语言是允许这样访问,子类继承了父类的所有成员,
                                 //那Cat这个类也应有了name成员变量,就应该可以这样访问啊,请各位发表看法
this.fulColor=fulColor;
}
public void evey()
{
System.out.println("猫叫声......");
}
}

解决方案 »

  1.   

    super调用父类的构造方法,参数是name
    这是语法
      

  2.   

    java中规定:
    子类的所有构造方法都必须调用父类的一个构造方法 
    如果不显示制定调用父类的哪个构造方法,就默认调用父类的无参构造方法 
      

  3.   

    //this.name=name;//为什么不能这样访问,在passcall语言是允许这样访问,子类继承了父类的所有成员, 
                                    //那Cat这个类也应有了name成员变量,就应该可以这样访问啊,请各位发表看法 
    this指的当前类,super才是指父类
      

  4.   

    楼主好固执,4楼明明已经回答你的问题了,你自己不会懂脑子想想么?你的基类中没有无参的构造方法,而派生类必须调用基类的构造方法,这时如果你不显式地使用super(...),编译器怎么知道你在调用基类的构造方法?你如果实在不想用super(name),就用super(null)也行啊;要么你必须在基类中加一个无参的构造方法。
      

  5.   

    答:由于:
    1)你父类Animal中的public String name;是定义成public的
    2)你自己的类Cat中没有定义自己的String name
    所以:this.name=name;这样访问是完全可以的(不知楼主为何说不可以?)另外:
    (A)通常规范的做法是:由于name是属于父类的,因此:父类中的成员应该由父类自己来初始化,不应该由子类来直接做。这也就是为什么:要求在子类的构造器中调用super(...)或super()的原因
    (B)若自己的类Cat中也定义自己的String name,则:this.name=name就是对自己的name进行初始化了(即:自己的name隐藏了父类中的name了)
      

  6.   


    这里this指代Cat,对Cat的继承而来的name变量进行赋值,super()是调用父类的构造函数,必须放在子类构造函数中的第一句位置,因为搂主对父类构造函数进行了重写,所以这里必须显示申明这个函数传入参数数据,否则报错。
      

  7.   

    顶7楼,我的MyEclipse也没有报错
      

  8.   

    是可以的
    但是如果你改为这样,估计就不可啦
    //super(name);//把这句屏蔽掉
    this.name=name;
      

  9.   

    这是个构造顺序的问题,在构造一个子类的时候,应该先构造父类的部分,楼主所说的this.name = name 却是在子类构造器中无法调用,因为当时的父类尚未构造完成,尚未构造的原因就是你没有默认的父类构造器,然而你又不想调用父类带参数的构造器,所以在子类的构造器中这种写法是错误的;不信的话 你可以在任何非构造器的方法(不能为静态)里写那句调用都是对的,因为那时整个子类对象已经构造完成了。 
      

  10.   

    你用的什么环境?我的eclipse行的,version 3.2.2