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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

2回答

17319閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

2クリップ

投稿2017/10/24 11:43

プログラミング初心者です
スッキリわかる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/ツール等のバージョンなど)
より詳細な情報

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

Java

1public class Main { 2 Main() { 3 // これは、メソッドの呼び出し 4 sayHello(); 5 } 6 7 // これは、メソッドの定義 8 void sayHello() { 9 System.out.println("Hello World!"); 10 } 11 12 public static void main(String[] args) { 13 new Main(); 14 } 15}

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

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

投稿2017/10/24 11:53

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/25 08:33

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

2017/10/25 08:40 編集

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

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 13:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/10/24 14:10

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

退会済みユーザー

2017/10/24 14:40

よく見たらJavaでしたね・・・・
退会済みユーザー

退会済みユーザー

2017/10/25 08:33

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

退会済みユーザー

2017/10/25 08:35

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問