2016-07-28 8 views
1

2つのサブクラスから値を取得するのに問題があります。 他の2つのクラスからメインプログラムに値を返すにはどうすればよいですか?クラスには階層があり、Cat.javaにはAnimal.Javaが継承されています。私はAnimalクラスから値を取得できますが、拡張Catクラスからは値を取得できません。私は間違って何をしていますか?クラス上での値の拡張と戻り

メインプログラム

import java.util.*; 

    public class animalProject { 

    private static Scanner input = new Scanner(System.in); 

    public static void main(String[] args) { 

    System.out.println("Welcome to create your very own animal."); 
    System.out.println("Start by typing a name for your animal: "); 
    String name = input.next();  

    Animal newAnimal = new Animal(name, 0); 

    System.out.println("New Animal created"); 

    System.out.println("Set state of your animal: [1] Alive. [2] Dead. "); 
    int status = input.nextInt(); 
    newAnimal.animalState(status); 

    System.out.println("Print name of your animal? [1] Yes [2] No "); 
    int answer = input.nextInt(); 
    if (answer == 1) { 
     newAnimal.getName(); 
    } 

    System.out.println("Check status of your animal? [1] Yes [2] No"); 
    answer = input.nextInt(); 
    if (answer == 1) { 
     newAnimal.checkState(); 
    } 

    System.out.println("Set lifes for your cat: "); 
    int life = input.nextInt(); 
    // set lifes to lifesBefore(). in Cat.Java 

    System.out.println("Remove lifes from cat?: [1] Yes [2] No"); 
    while (true) { 
     life = input.nextInt(); { 
     // call the method to decrease lifes from Cat.Java 
     } 
     if (life == 2){ 
      break; 
     } 
    } 

    System.out.println("Check cats lifes? [1] Yes [2] No"); 
    answer = input.nextInt(); 
    if (answer == 1) { 
     // return lifes from Cat.java 
    } 

Animal.Java

public class Animal{ 

protected String name; 
protected int status; 


public Animal(String animalName, int animalStatus){ 
    name = amimalName; 
    state = animalStatus; 
} 

public void getName() { 
    System.out.println(name); 
} 

public void setName() { 
    this.name = name; 
} 

public void animalState(int status) { 
    if (status == 1) { 
     state = 1; // dead 
    } 
    else if (status == 2) { 
     state = 2; // alive 
    } 
    else { 
      System.out.println("Error with setting state.. program closing.."); 
      System.exit(1); 
     }  
} 

public void checkState() { 
    if (state == 1) { 
     System.out.println("Animal is dead "); 
    } 
    else if (state == 2) { 
     System.out.println("Animal is alive");   
    } 
    else { 
      System.out.println("Unkown input.. program closing.."); 
      System.exit(1); 
    } 
} 
} 

Cat.Java

public class Cat extends Animal { 

private int catLifes; 

public Cat(String animalName int animalStatus, int lifes) { 
     super(animalName, animalStatus); 
     catLifes = lifes; 
    } 

public void lifesBefore(){ 
    this.catLifes = lifes; 
} 


public void decreaseLifes() { 

    for (int i = 0 ; i < catLifes; i++) { 
     catLifes--; 
    } 
    System.out.println("Cat ran out of lifes and is now dead! "); 
    // set animals state to dead in Animal.Java 
} 

public int catsLifesAfter(){ 
    return this.catLifes; 
} 
} 
+1

オブジェクトは「動物型」から作成します。猫が欲しい場合は、このタイプのオブジェクトを作成する必要があります。 'Animal myCat = new Cat(" Kitty "、2,9)' – Blobonat

+4

のようにすることもできます。また、インスタンス化できないようにAnimal abstractを作成することは理にかなっています。次に、これらのメソッドにアクセスできるCatオブジェクトを作成する必要があります。私が言うことができるから、これはあなたがやろうとしていたようですね? – James

+0

親クラス参照は、子クラスオブジェクトを保持するために使用できます。しかし、子クラス固有のメソッドにアクセスするには、それぞれの子クラス – JavaHopper

答えて

0

Cat extends Animalは、すべてCatAnimalであることを意味しますが、すべてAnimalCatではありません。

new Animal(name, 0)を使って動物を作成したので、Animalオブジェクトがありますが、Catはありません。それは海洋生物でもあります。

Animal newAnimal = new Cat(name, 0,9)を使用しても、Catの方法にアクセスすることはできません。あなたが作成したAnimalCatですが、Animal newAnimalを使用したときは、newAnimalと言っています。Animalです。

だからあなたはあなたが最初からCatを使用しているいずれかを言うかもしれない:

Cat newAnimal = new Cat(name, 0,9); 

が、その後、あなたが探検したい相続の機能のほとんどを失うことになります。代わりに、タイプチェックを使用して後でキャストすることもできます:

if(newAnimal instanceof Cat) { 
    Cat aCat = (Cat)newAnimal; 
    /*...*/ 
    aCat.lifesBefore() 
    /*...*/ 
} 
+0

私のコードを変更しましたが、まだ動作しません –

関連する問題