1

楽しみのために作成しているテキストベースのゲームのコンストラクターを作成しようとしていますが、CharacterコンストラクターにとをString取得させることができませんint。使用する場合、必要なのは。だけcharです。

public class Character {

public int attack, rangedAttack, manaAttack, defense, rangedDefense, manaDefense, strength, agility, intelligence ,race;
String name;

public Character(String Name, int Race) {
    name = Name;
    race = Race; 
};

ここでコンストラクターを使おうとしています。

public class QuestOfVallock{

public static void main(String[] args){
       Character self = new Character();
}
4

6 に答える 6

3

Stringとintをパラメーターとして受け取るコンストラクターを定義したので、次のように呼び出す必要があります。

Character self = new Character("Bobby the mighty elf", 1);

クラスで別のコンストラクターを定義しない場合を除いて、パラメーターを定義しない場合、パラメーターなしでコンストラクターを呼び出すことはできません。

また:

  • Character呼び出されたクラスは、パッケージjava.lang内の重要なクラスの名前であるため、定義しないでください。
  • 変数(パラメーターまたはメンバー変数)には、より適切な命名規則を使用してください。大文字にするのではなく、キャメルケースを使用してください。
  • 変数をプライベートにして、getter / setterを使用して変数にアクセスすることにより、変数をカプセル化することをお勧めします。それらが一定である場合(オブジェクトの存続期間中に変更されない場合)、それらを「パブリックファイナル」にするか、セッターではなくゲッターのみを定義することを検討できます。
于 2013-02-12T02:05:37.030 に答える
2

このようなパラメーターを使用して独自のコンストラクターを定義する場合

public Character(String Name, int Race) {
    name = Name;
    race = Race; 
}

Javaはデフォルトのコンストラクターを配置せず、未定義です。自分で実装する必要があります。

編集1:

Javaのパラメータでさえ変数の名前付けはキャメルケースにする必要があります

編集2:

時々、パラメーター名(変数名)がインスタンス変数でも同じであるセッターメソッドまたはコンストラクターを定義します。例を見てください

public class Person
{
   private String name; // <-- 

   public Person(String name) // <--
   {

   }

   public void setName(String name)
   {

   }
}

あなたがこのような割り当てをするとき

public Person(String name)
{
   name = name;  
}

まあそれは紛らわしいです。Javaは、変数の割り当てに影響がないことを警告します。また、 name(インスタンス)に新しい値が割り当てられたと思われる場合もあります。

問題を解決するにはthis.<variable name>

public Person(String name)
{
   this.name = name;  
}
于 2013-02-12T02:04:30.500 に答える
2

java.lang.Characterとの名前空間の衝突のように見えます。

あいまいさを避けるためにパッケージを宣言するか、Characterクラスの名前を別の名前に変更してみてください。

package mygame;
public class Character {

    public int attack, rangedAttack, manaAttack, defense, rangedDefense, manaDefense, strength, agility, intelligence ,race;
    String name;

    public Character(String name, int race) {
        this.name = name;
        this.race = race; 
    }
}

次に、次のようにCharacterクラスをインスタンス化します。

mygame.Character self = new mygame.Character("John Doe", 1);

更新:他の人が指摘しているように、1つ以上のコンストラクターが定義されている場合、Javaはデフォルトのコンストラクター(パラメーターのないコンストラクター)を作成しません。しかし、私はまだパッケージが進むべき道であるという私の答えを支持しています。デフォルトパッケージの使用は推奨されておらず、開発を開始する小さなアプリケーションにのみ存在します。Javaのデフォルトパッケージの使用は悪い習慣ですか?を参照してください。

于 2013-02-12T02:04:49.213 に答える
1

また、注意してください...

public class Character {

    public int attack, rangedAttack, manaAttack, defense, rangedDefense, manaDefense, strength, agility, intelligence ,race;
    String name;

    public Character(String Name, int Race) {
        name = Name;
        race = Race; 
    } //<-- shouldn't have semicolon here...
} //<-- should match the braces for the class...
于 2013-02-12T02:09:02.053 に答える
0

パラメーターを使用してコンストラクターを定義すると、明示的に宣言するまで、デフォルトのコンストラクターは使用できなくなります。

したがって、このコンストラクターを追加する必要があります。

public Character(){ /* do something */ }

または、正しいコンストラクターを呼び出します。Javaには引数のデフォルト値がないことを忘れないでください。

于 2013-02-12T02:04:21.913 に答える
0

プリミティブデータ型のラッパークラスであるという名前のクラスがパッケージにあるため、最初
に名前を避けてください。 このクラスは自動ボクシングの変換に使用されます。詳細はこちらCharacterjava.langCharacterchar
java.lang.Character

次に
、そのクラスの名前をに変更するChampionと、確実に機能します。:)

第三
に、引数に適切なパラメータを渡していない。括弧を空白のままにした場合、コンストラクターにはパラメーターが必要です

それはどのようなものか

public class Character {//<-- avoid this name

public int attack, rangedAttack, manaAttack, defense, rangedDefense, manaDefense, strength, agility, intelligence ,race;
String name;

public Character(String Name, int Race) {
    name = Name;
    race = Race; 
};//<-- Y U PUT SEMICOLON ?  

public class QuestOfVallock{

public static void main(String[] args){
       Character self = new Character(); //<-- Y U NO GIVE HIM PARAMETERS ?
}    

それはどうあるべきか

public class Champion { //<-- Java-approved name

public int attack, rangedAttack, manaAttack, defense, rangedDefense, manaDefense, strength, agility, intelligence ,race;
String name;

public Character(String Name, int Race) {
    name = Name;
    race = Race; 
}//<-- No semicolon
}//<-- Closing brace for class

public class QuestOfVallock{

public static void main(String[] args){
       Champion self = new Champion("Little Java Child",1001); //<-- Unique race
}
}//<-- closing brace for class



私が提案するのはRaceinterface

public interface RaceConstants {
    int ELF = 1;
    int JAVA_CHILD = 1001;
    int DWARF = 2;
}  

だからあなたmain()はこのように見えます:

public static void main(String[] args){
       Champion self = new Champion("Little Java Child",RaceConstants.JAVA_CHILD; //<-- Unique race
}
于 2013-02-12T02:05:22.060 に答える