急急急...掉用父类静态成员时遇见的问题!!!!

来源:百度知道 编辑:UC知道 时间:2024/06/30 01:00:57
子类Studen3中的Person1.howMany(); 为什么不能写成super.howMany(); 既然 父类名+成员 可以调用父类被覆盖的静态成员 为什么子类中的super.set(name,age);又不能写成Person1.set(name,age);呢?
public class Student3 extends Person1
{
public static void howMany()
{
Person1.howMany();
System.out.print("Student3.count="+count+" ");
}
public void set(String name,int age,String spec)
{
super.set(name,age);
this.setSpeciality(spec);
}

Student3的父类Person1也含有这个方法 及子类覆盖了父类的这两个方法
{
public static void howMany()
{
...
}
public void set(String name,int age,String spec)
{
...
}
}

第二个很好理解因为set方法不是静态方法,只有静态方法可以通过类名调用。
对于第一个问题理解起来可能有些难度。
首先你要了解static的机制。static是不依赖于当前类的对象存在的,有点像C中的全局函数。
如果你在一个class中定义了一个static变量或者方法,那么这个变量或者方法并不是在你实例化该类时才会生成的,而应该是你在定义static之后马上就会存在的。
this关键字的意思是返回本类实例的一个引用.使用static方法时由于不存在this(按上述理解),所以不能通过向对象发送消息的方式来完成。
super也是同解。
你可以在本类的外部使用对象引用调用static方法,这在java中是可行的,但是这种做法并不提倡。你可以在IDE中尝试,用对象引用调用static方法,IDE会立刻给你警告:"应该采用静态方式调用",即〈classname.静态方法名〉的形式。
另:用对象引用调用静态方法,在C#中已经被禁止。