2013-11-18 2 views
0

Базовый класс;Использование метода базового класса Значение в унаследованных классах переопределенный метод

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; 

    } 

} 

Inherited Class;

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. Почему я не могу использовать значение «значение» в moveCat из Cat.

Для примера;

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

} 

Если я собираю содержимое из базового метода, почему я не могу использовать значения. Если это не возможно, что я должен делать вместо этого, чтобы получить нужные мне значения.

ответ

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 класс, но не перекрываться любой метод, в отличие от того, что было предложено в названии вопроса.

+0

И для удобочитаемости кода, квалифицируйте все ссылки с помощью 'this.' –

+0

Отлично, я сделал его переменной класса и использует this.value = значение внутри метода. – user2998504

+0

@ user2998504 - Внутри какого метода? Я не совсем понял. – SudoRahul

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; 

    } 

} 

Ваш класс Cat

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); 
    } 

} 
+0

Я изменил имя метода не подписи. – user2998504

+0

Я обновил свой код, чтобы получить доступ к значению в классе Cat. –

0

С вашей реализацией переменная value имеет локальную область. Он доступен только в рамках метода move, и внешний мир об этом не знает.

Вам нужно будет объявить эту переменную в области экземпляра, чтобы сделать ее доступной на уровне класса. Вам также необходимо объявить модификатор доступа для этого, чтобы узнающий об этом класс наследования.

Следующие будут работать.

protected int value = 0; 

public void move() 
{ 
    System.out.println("Move"); 
    Random rand = new Random(); 
    value = rand.nextInt(2)+1; 
} 
Смежные вопросы