質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    13836questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

メソッドを呼び出すときにvoidが付く時と付かない時の違い

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 328

stynjoe

score 7

プログラミング初心者です
スッキリわかるJavaという参考書で、
オブジェクト指向に基づきRPGをテーマにクラスを作成する内容なんですが、Heroという名前のクラスに、

void sleep() { ...

というのが出てきました。
見慣れないので困惑していると、どうやらメソッドの書き始めの文らしいのですが、public static void main(String[] args) とどう違うのですか?
sleepがメソッド名で、引数は無しで・・っていうのはわかるのですが、なぜvoidだけなのでしょうか?
そもそもメソッドを呼び出すときは

public class Main {
   public static void main(String[]args){
      System.out.println("メソッドを呼び出します");
      hello();
      System.out.println("メソッドの呼び出しが終わりました");
   }

public static void hello(){
      System.out.println("Aさんこんにちは");
   }
}

のhello();のようにメソッド名(引数)で呼び出せたはずなのに、なぜここではvoidが必要なのでしょうか?

ちなみにHeroクラスはこのようになっています。

`public class Hero {
    String name;
    int hp;
    void sleep() {
        this.hp = 100;
        System.out.println(this.name + "は、眠って回復した!");
   }
void sit(int sec) {
    this.hp += sec;
    System.out.println(this.name + "は、" + sec + "秒座った!");
    System.out.println("HPが" + sec + "ポイント回復した");
   }
void slip() {
    this.hp -= 5;
    System.out.println(this.name + "は転んだ!");
    System.out.println("5のダメージ!");            
   }
void run() {
    System.out.println(this.name + "は逃げだした!");
    System.out.println("GAME OVER");
    System.out.println("HPは" + this.hp + "でした");

   }
}
``

初心者なので質問が下手かもしれませんが、ご教授お願いいたします。


エラーメッセージ

###該当のソースコード

ここに言語を入力
ここにご自身が実行したソースコードを書いてください
```

試したこと

課題に対してアプローチしたことを記載してください

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

メソッドの定義メソッドの呼び出しは全く別です。

public class Main {
    Main() {
        // これは、メソッドの呼び出し
        sayHello();
    }

    // これは、メソッドの定義
    void sayHello() {
        System.out.println("Hello World!");
    }

    public static void main(String[] args) {
        new Main();
    }
}

定義しただけで呼び出さなければ何も起こりません。
定義されていないものを呼び出そうとするとエラーになります。

mainは定義しただけで実行されているように見えますが、それはエントリーポイントだからです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/25 17:33

    なんとなくわかったような気がします、、、。
    答えてくださったのにうんうん悩んで放置するのも申し訳ないので、回答を締め切らせていただきます。
    ありがとうございました。

    キャンセル

  • 2017/10/25 17:40 編集

    メソッドを定義することは、『手順書』を書くことだとイメージするといいかもしれません。
    『定義しただけで呼び出さなければ何も起こりません。』
    →手順書を書いても、誰も実行しないならなにも起きない。
    『定義されていないものを呼び出そうとするとエラーになります。』
    →手順書がないのに、「ちょっとsayHelloやって」と言われてもどうしようもない。

    キャンセル

0

メソッドの定義と呼び出しに関してはLouiS0616さんの言うとおりです.

メソッドを定義することで,そのメソッドの中身をあたかもそこに書いたかのように解釈されます.
また,voidについてですが,これは戻り値(つまりメソッドの処理完了時に元のメソッドに渡す値)が無いよという意味です.処理によって得られた値を,直接元のメソッドに返したい場合には,voidではなく,それぞれに応じてintやdouble等を書くことになります.

public static void mainも同様に,メソッドの定義ですが,mainは特別で,エントリーポイントと呼ばれ,プログラム実行時に最初に呼び出されるという決まりがあります.しかし,mainもメソッドなので,戻り値という概念が存在し,それが無いためvoidと書かれます.

voidよりも前に書かれている,publicやstaticは修飾子とよばれ,その修飾子に応じた挙動をするようになります.しかし,voidとは異なり,publicやstaticは必須ではなく,無くてもメソッドを定義する最小構成は満たせます.staticはこのクラスのインスタンス(実体)全てで共通のメソッド(即ち,実体ごとではなく,同じ物を全てで共有している)であるという修飾子,publicはアクセス修飾子とよばれ,そのメソッドやメンバにアクセスを許可するレベルを付与します.(publicの場合はどこからでもOKという意味です)
修飾子はなくても実装が可能であると書きましたが,厳密には書かなければいけない場合もあります.(例えば,エントリポイントであるmainはプログラムでただひとつでなければいけないのでstaticを外すことはできません)

また,一部省略されている修飾子もあります.例えば,アクセス修飾子は書かれない場合,private(クラスの外からはアクセスできなくなる)が暗黙に書かれていると解釈されます.
ですので,Heroクラスのsit,slip,runといったメソッドは,暗黙に以下のように書かれているのと同じ実装になります.

private void sit(){
 ...
}

private void slip(){
 ...
}

private void run(){
 ...
}

このコードをprivateをpublicに変えれば,クラスの外からも呼び出せるようになりますし,staticを付与した場合,仮にhero1, hero2というインスタンスがあったとしても,全て共通で処理されてしまいます.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/24 23:10

    アクセス修飾子を指定しない場合とprivateと指定したときの挙動はことなります。
    privateを指定した場合は同一クラス内からしか参照できませんが、デフォルトの場合は同一パッケージ内からアクセスできます。

    キャンセル

  • 2017/10/24 23:40

    よく見たらJavaでしたね・・・・

    キャンセル

  • 2017/10/25 17:33

    takano20771さんもすごく丁寧にありがとうございました。
    publicやstaticはまだ自分の参考書では先の章になるので、ちょっと急ぎ過ぎましたかね。
    要は参照できる範囲を指定できるということでしょうか。参考書の先の方のページにも似たようなことが書いてありました。また質問することがあれば、その時はよろしくお願いします。

    キャンセル

  • 2017/10/25 17:35

    そのような認識で問題ないかと思います.内部的な細かい挙動や解釈については,必要になってから調べれば良いかと思います.

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13836questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。