Java中static变量能继承吗

  

Java中的static变量是类级别的变量,即使类还没有实例化,它也已经存在了。因此,它的值对于类中定义的所有方法和对象实例是相同的。那么,Java中的static变量能否被继承呢?答案是可以。

当一个子类继承一个父类时,它包含了父类的所有非私有成员变量和方法。这些变量和方法可以被直接访问,但是对于static变量,Java有一些额外的规则需要遵循。下面通过两个示例来详细讲解这些规则。

示例1:静态变量不会被覆盖

在这个示例中,我们定义了一个父类 Parent,它有一个静态变量 count 和一个方法 showCount(),用于输出 count 的值。然后,我们定义了一个子类 Child 继承 Parent 类,同时在 Child 类中也定义了一个 count 静态变量。我们在 main 方法中依次创建 ParentChild 的对象,并分别调用它们的 showCount() 方法,观察输出结果。

class Parent {
    public static int count = 1;
    public void showCount() {
        System.out.println("Parent's count is " + count);
    }
}

class Child extends Parent {
    public static int count = 2;
}

public class Main {
    public static void main(String[] args) {
        Parent p = new Parent();
        p.showCount();

        Child c = new Child();
        c.showCount();
    }
}

输出结果:

Parent's count is 1
Parent's count is 1

可以看到,无论是从父类对象还是子类对象中调用 showCount() 方法,输出的都是父类中定义的 count 的值,而不会是子类中定义的值。

这是因为子类和父类中的静态变量实际上是两个不同的变量,它们在内存中占据不同的空间。因此子类中的静态变量并不能覆盖父类中的静态变量。

示例2:静态变量可以被继承

在这个示例中,我们定义了一个父类 Parent,它有一个 name 实例变量和一个静态变量 count,同时定义了一个构造器和一个方法 showName(),用于输出 namecount 的值。然后,我们定义了一个子类 Child,它继承了 Parent 类,并在其中定义了一个构造器。在 main 方法中,我们用不同的构造器创建了一个 Parent 对象和一个 Child 对象,并分别调用了它们的 showName() 方法输出结果。

class Parent {
    public static int count = 1;
    public String name;
    public Parent(String name) {
        this.name = name;
    }
    public void showName() {
        System.out.println("Parent's name is " + name + ", count is " + count);
    }
}

class Child extends Parent {
    public Child(String name) {
        super(name);
    }
}

public class Main {
    public static void main(String[] args) {
        Parent p = new Parent("parent");
        p.showName();

        Child c = new Child("child");
        c.showName();
    }
}

输出结果:

Parent's name is parent, count is 1
Parent's name is child, count is 1

可以看到,无论是从父类对象还是子类对象中调用 showName() 方法,输出的都是正确的 name 值和继承自父类中的 count 值。这是因为子类继承了父类中的静态变量,并且可以直接访问和修改它们的值,而不需要重新定义。

综上 ,Java中的static变量能够被继承,但在子类中重新定义的静态变量,并不能覆盖父类中的静态变量。

相关文章