我有一个代码,我希望输出与实际输出不同。由于静态变量是基于引用的,我希望输出为“超类”,但我得到的是“子类”..代码:
class TestClass {
public static void main(String args[] ) throws Exception {
A b = new B(); // Since the reference is A, "superclass" should be the output
b.test();
}
}
abstract class A{
static String a = "superclass";
abstract void test();
}
class B extends A{
static String a = "subclass";
void test(){
System.out.println(a); // Output subclass
}
}
请告诉我我错在哪里..
答案 0 :(得分:2)
静态变量不会在java中继承。 varibale static String a
是静态的,它将它与一个类相关联。 Java继承不适用于static
个变量。
如果您绝对需要超类变量,可以使用:
System.out.println(super.a);
以下是您可能希望看到的继承:
abstract class A {
String a = "superclass";
abstract void test();
}
class B extends A {
void test() {
System.out.println(a); // Output superclass
}
}
我删除了static
标识符并删除了子类的变量a
的实现。如果你运行它,你将获得superclass
作为输出。
答案 1 :(得分:0)
A b = new B();
首先,静态变量不是在Java中继承的。这意味着当您将对象创建为新的B()时,即使该类扩展了A类,它也不会保留String的定义。
static String a = "subclass";
其次,即使是这种情况,您也可以立即覆盖此类B开头的String a的值。您特别将其设置为"子类"在打印它的值之前,当然你已经用这个新的值覆盖原始值。
最后,尝试用更多种类的东西来命名是个好主意。对于您或回答您问题的人来说,A类和字符串a对于可读性没有多大帮助。
答案 2 :(得分:0)
public abstract class A
{ static int a = 1; }
public class B extends A
{ static int a = 2; public A() { } }
public static void main(String argv[])
{
A var1 = new B();
System.out.println(var1.a)
// Re-cast the variable to type "class B"
// This is the SAME VARIABLE
// It is occupying the SAME MEMORY SPACE
// This println will produce the same output...
System.out.println(((B) var1).a)
}