【发布时间】:2011-11-05 10:33:57
【问题描述】:
按照惯例,Java 中的静态方法只能访问静态字段或其他静态方法。然而,下面的简单代码 sn-p 似乎违反了约定。让我们考虑以下 Java 中的简单代码 sn-p。
class Super
{
protected static int x;
protected static int y;
public Super(int x, int y)
{
Super.x=x;
Super.y=y;
}
public static int sum()
{
return(x+y);
}
}
final class Sub extends Super
{
public static int temp=100;
public Sub(int x, int y)
{
super(x, y);
}
public void concreateMethod()
{
System.out.println("\nInstance variable x = "+x);
System.out.println("Instance variable y = "+y);
}
}
final public class Main
{
public static void main(String[] args)
{
Sub s=new Sub(10, 5);
System.out.println("\nAssociating with object x = "+s.x);
System.out.println("Associating with object y = "+s.y);
System.out.println("\nAssociating with class name x = "+Sub.x);
System.out.println("Associating with class name y = "+Sub.y);
System.out.println("\nSummation (Associating with object) = "+s.sum());
System.out.println("Summation (Associating with class name) = "+Sub.sum());
System.out.println("\nAssociating with class name temp = "+Sub.temp);
System.out.println("Associating with object temp = = "+s.temp);
System.out.println("\nConcreate method called.");
s.concreateMethod();
}
}
上面的代码使用相应的语句产生以下输出。
与对象 x = 10 关联
关联对象 y = 5
与类名 x = 10 关联
关联类名 y = 5
求和(与对象关联)= 15
求和(与类名关联)= 15
与类名 temp = 100 关联
关联对象 temp = = 100
调用了 Concreate 方法。
实例变量 x = 10
实例变量 y = 5
静态字段 s 和 x 正在使用 Sub 类的对象通过 main() 方法中的以下语句访问,尽管它们被声明为 static在超类Super中。
Sub s=new Sub(10, 5);
System.out.println("\nAssociating with object x = "+s.x);
System.out.println("Associating with object y = "+s.y);
下面的说法当然不用怀疑。
System.out.println("\nAssociating with class name x = "+Sub.x);
System.out.println("Associating with class name y = "+Sub.y);
由于 x 和 y 是静态的,所以当然可以通过这种方式访问它们。
同样是方法调用,注意以下语句。
Sub s=new Sub(10, 5);
System.out.println("\nSummation (Associating with object) = "+s.sum());
System.out.println("Summation (Associating with class name) = "+Sub.sum());
两种方式,static 方法 sum() 都使用类 Super 的对象和类名 Sub强>。
在 Sub 类中声明的静态字段 temp 再次类似情况
System.out.println("\nAssociating with class name temp = "+Sub.temp);
System.out.println("Associating with object temp = = "+s.temp);
静态字段 temp 正在以两种方式访问。
为什么会出现这种情况?
【问题讨论】:
-
这里发生了什么?您没有足够仔细地阅读自己的代码。这里唯一的谜团是这个问题的原因。
标签: java inheritance static