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("猫叫声......");
}
}
{
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("猫叫声......");
}
}
这是语法
子类的所有构造方法都必须调用父类的一个构造方法
如果不显示制定调用父类的哪个构造方法,就默认调用父类的无参构造方法
//那Cat这个类也应有了name成员变量,就应该可以这样访问啊,请各位发表看法
this指的当前类,super才是指父类
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了)
这里this指代Cat,对Cat的继承而来的name变量进行赋值,super()是调用父类的构造函数,必须放在子类构造函数中的第一句位置,因为搂主对父类构造函数进行了重写,所以这里必须显示申明这个函数传入参数数据,否则报错。
但是如果你改为这样,估计就不可啦
//super(name);//把这句屏蔽掉
this.name=name;