在继承类重写方法中使用基类方法值

时间:2013-11-18 05:13:18

标签: java inheritance

基类;

import java.util.Random;

public class Animal
{

    public void move()
    {
        int value = 0;
        System.out.println("Move");
        Random rand = new Random(); 
        value = rand.nextInt(2)+1;

    }

}

继承类;

public class Cat extends Animal
{

    public void moveCat()
    {
        super.move();
        System.out.println("Move Cat");

    }

    public static void main(String[] args)
    {
        Cat test = new Cat();
        test.moveCat();
    }
}

我试图使用基类动物方法的值移动覆盖方法moveCat。为什么我不能在Cat的moveCat中使用值“value”。

例如;

public void moveDoodle()
{
    super.move();
    System.out.println("Move Doodle");
    if(value == 1)
    {
        System.out.println("Value from base");
    }

}

如果我从基本方法中获取内容,为什么我也不能使用这些值。如果不可能,我应该做什么,以获得我需要的值。

3 个答案:

答案 0 :(得分:2)

那是因为value位于基类(move())类的方法Animal的本地范围内,这就是为什么它不被继承。只会继承实例变量(前提是它们不是private)。因此,您需要为value提供一个实例变量,以便能够在基类(Animal)类中继承它。

int value = 0;
public void move()
{
    // int value = 0;
    System.out.println("Move");
    Random rand = new Random(); 
    value = rand.nextInt(2)+1;
}

注意:我可以看到你继承了Animal类但没有覆盖任何方法,这与问题标题中的建议相反。

答案 1 :(得分:0)

因为value是方法move()的局部变量。局部变量不会被继承。将变量创建为实例变量。 顺便说一句,如果您尝试覆盖到move()方法,则需要保留相同的方法签名。

import java.util.Random;

public class Animal {
    int value = 0;

    public void move() {

        System.out.println("Move");
        Random rand = new Random();
        value = rand.nextInt(2) + 1;

    }

}

你的猫班

public class Cat extends Animal {
    public void moveCat() {
        super.move();
        System.out.println("Move Cat");

    }

    public static void main(String[] args) {
        Cat test = new Cat();
        test.moveCat();
        System.out.println(test.value);
    }

}

答案 2 :(得分:0)

通过实施,value变量属于本地范围。它只能在move方法中访问,外部世界不知道这一点。

您需要在实例范围内声明此变量,以便在类级别访问它。您还需要为此声明访问修饰符,以便继承类了解它。

以下内容可行。

protected int value = 0;

public void move()
{
    System.out.println("Move");
    Random rand = new Random(); 
    value = rand.nextInt(2)+1;
}