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

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

ただいまの
回答率

90.34%

  • Java

    14469questions

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

java:アクセス制御について

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 326
退会済みユーザー

退会済みユーザー

 前提・実現したいこと

こんばんは、Javaについての質問です。

今回はアクセス制御についての問題の解をjavaで作成することになり、途中いろいろと調べながらコードを作成したのですが、提示された問題文の条件通りにいかず、どう進めて良いのか悩んでおります。
お力お貸しいただけますと大変助かります。
下記が問題文となります。

 問題文

値段を表す整数型フィールドのpriceを追加し、Clockクラスを改良しなさい。class名は「Clock2」とする。
ただし次の条件を満たすこと。
<条件>
・ priceフィールドは全てのClock2インスタンスで同一の値にしなさい。
・ priceフィールドを利用できるのはClock2クラスのみ。
・ priceフィールドの値を取得するメソッドはどのクラスからでも利用可能。
・ priceフィールドの値を設定するメソッドは同一パッケージからしかできない。
・ priceフィールドの初期値は1000とする。

また、Clock2クラスとは別にメインクラスを作成し、動作を確認できるようにすること。 

 改良する「Clock」クラスと、その動作確認のためのメインクラス「ClockTest」クラス

public class Clock {
        private int hour;
        private int minute;
        private int second;

    //コンストラクタ1
     public Clock(){
         super();
        }

     //コンストラクタ2
        Clock(int hour, int minute, int second){
                this.hour = hour;
                this.minute = minute;
                this.second = second;
        }


        //SET
        public boolean setHour(int hour) {
         if(hour > 0 && hour <= 23){
             this.hour = hour;
             return true;
         } else {
             return false;
         }
    }

    public boolean setMinute(int minute) {
         if(minute > 0 && minute <= 59){
             this.minute = minute;
             return true;
         } else {
             return false;
         }
    }

    public boolean setSecond(int second) {
         if(second > 0 && second <= 59){
             this.second = second;
             return true;
         } else {
             return false;
         }
    }

        //GET
        public int getHour(){
            return hour;
        }

        public int getMinute(){
            return minute;
        }

        public int getSecond(){
            return second;
        }

}

/////////////////動作確認のための別クラス/////////////////////////


import java.io.*;

public class ClockTest {
    public static void main(String[] args) throws IOException {


        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        Clock clock = new Clock();

        while(true){
        try{
            System.out.print("hourの数値を入力してください>" + " ");
            String str = br.readLine();
            boolean result = clock.setHour(Integer.parseInt(str));
            if(result) {
            break;
            } else {
                System.err.println("[ERROR] 数値を再入力してください");
            }
            }catch(NumberFormatException e){
                System.err.println("[ERROR] 数値を再入力してください");
        }
    }

        while(true){
        try{
            System.out.print("minuteの数値を入力してください>" + " ");
            String str = br.readLine();
            boolean result = clock.setMinute(Integer.parseInt(str));
            if(result) {
            break;
            } else {
                System.err.println("[ERROR] 数値を再入力してください");
            }
            }catch(NumberFormatException e){
                System.err.println("[ERROR] 数値を再入力してください");
        }
    }

        while(true){
        try{
            System.out.print("secondの数値を入力してください>" + " ");
            String str = br.readLine();
            boolean result = clock.setSecond(Integer.parseInt(str));
            if(result) {
            break;
            } else {
                System.err.println("[ERROR] 数値を再入力してください");
            }
            }catch(NumberFormatException e){
                System.err.println("[ERROR] 数値を再入力してください");
        }
    }

        System.out.println("hour" + " " + clock.getHour());
        System.out.println("minute" + " " + clock.getMinute());
        System.out.println("second" + " " + clock.getSecond());
    }
}

 作成途中のコード

package en8_2;

public class Clock2 {

        private int price = 1000;

    //コンストラクタ1
     public Clock2(){
         super();
    }

     //コンストラクタ2
        Clock2(int price){
              this.price = price;
        }


    //SET
    static void setPrice(int price) {
             this.price = price;
    } //同一パッケージからのみ

    //GET
    protected static void getPrice(){
        return price;
    }//どのクラスからでも利用可

}


///////////////////////動作確認のためのメインクラス//////////////////////


package en8_2;
import en8_2.Clock2;

public class ClockTest2 {
    public static void main(String[] args) {

        Clock2 clock = new Clock2();
        clock.setPrice();

        System.out.println(clock.getPrice());

    }
}

 作成途中のコード(2018-06-12 追記)

package en8_2;

public class Clock2 {

        private int price = 1000;

       //コンストラクタ1
         public Clock2(){
         super();
    }

       //コンストラクタ2
        Clock2(int price){
              this.price = price;
        }


       //SET
        public void setPrice(int price) {
              this.price = price;
         }
    //static void?//同一パッケージからのみ

    //GET
    public int getPrice(){
        return price;
    }
    //protected static void ?//どのクラスからでも利用可

}


///////////////////////動作確認のためのメインクラス//////////////////////


package en8_2;
import en8_2.Clock2;

public class ClockTest2 {
    public static void main(String[] args) {

        Clock2 clock = new Clock2();

        clock.setPrice();

        System.out.println(clock.getPrice());

    }
}

 現在発生しているエラー(修正)

 en8_2\Clock2.java:20: エラー: staticでない変数 thisをstaticコンテキストから参照することはできません
             this.price = price;
             ^
en8_2\Clock2.java:25: エラー: 不適合な型: 予期しない戻り値
        return price;
               ^
en8_2\ClockTest2.java:8: エラー: クラス Clock2のメソッド setPriceは指定された型に適用できません。
        clock.setPrice();
             ^
  期待値: int
  検出値: 引数がありません
  理由: 実引数リストと仮引数リストの長さが異なります

エラー3個

/////////////////////////////////////////////////////////////////////

エラー(2018-06-12 追記)

ClockTest2.java:9: エラー: クラス Clock2のメソッド setPriceは指定された型に適用できません。
        clock.setPrice();
             ^
  期待値: int
  検出値: 引数がありません
  理由: 実引数リストと仮引数リストの長さが異なります
エラー1

 やりたいこと

アクセス制御の問題です。今回は修飾子private, protected, public, 修飾子なし, staticなどを利用してこの問題を解決するのかと考え、Clock2クラスとそのメインクラスを作成したのですが、現状コンパイルが通らず…。
Clockクラスの外部から値の設定や取得ができる、という点を残して改良すれば良いそうなのでpriceのみでClock2クラスは作成しております。
修飾子の個々の使い方は理解できるのですが、全ての条件を満たすようにするとなるとどう記述したものか分からず詰まっております。
お手数おかけしますが、お助けいただけますと幸いです。
よろしくお願いいたします。

追記:エラー文と作成途中のコードが古いデータのものを貼ってしまっていたので、現段階のものに修正いたしました。

 やりたいこと(2018-06-12 追記)

大変遅くなりましたが、まずはご指摘いただいた通りpublic型に修正しました。
ただ現状、ClockTest2クラスに引数が足りていないというエラーが表示される状況です(上記項目 ”現在発生しているエラー(修正)” 参照)。
clock.setPrice();の()にint型の引数を与えると正常に動作する…のですが、問題文に沿うようにここから改訂していくにはどうすれば良いのでしょうか。
お力お貸し頂けますと幸いです、よろしくお願いいたします。

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

Java
java version "1.8.0_161"

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+3

アクセス修飾子の前に、まずはこれまで学んできたであろう部分をきちんと復習したほうが良いようです。
コンパイルエラーの内容をよく読んでみましょう。

en8_2\Clock2.java:20: エラー: staticでない変数 thisをstaticコンテキストから参照することはできません
             this.price = price;
             ^

static メソッドの中では this は使えません。

en8_2\Clock2.java:25: エラー: 不適合な型: 予期しない戻り値
        return price;
               ^

返り値が void なのに int を返そうとしています。

en8_2\ClockTest2.java:8: エラー: クラス Clock2のメソッド setPriceは指定された型に適用できません。
        clock.setPrice();
             ^
  期待値: int
  検出値: 引数がありません
  理由: 実引数リストと仮引数リストの長さが異なります

setPrice には引数があるはずなのに、何も値が入っていません。

en8_2\ClockTest2.java:10: エラー: シンボルを見つけられません
        System.out.println(clock.getHour());
                                ^
  シンボル:   メソッド getHour()
  場所: タイプClock2の変数 clock

getHour がどこにも定義されていません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/05 01:03

    アクセス修飾子の話は一旦おいておいて、まずは全部publicでコンパイルが通るまでやってみてください。
    そこまでは自力で行ってもらわないとアクセス修飾子の話にたどり着きませんよ。

    キャンセル

  • 2018/06/12 23:58 編集

    ご回答ありがとうございます。
    また、返信が遅くなり大変申し訳ございません。
    ご指摘いただきました通り、一旦アクセス修飾子のことは忘れてpublicで書き直してみました。
    今まで起こっていたエラーは引数のエラーを残して概ねなくなりました。
    ただ、ここからどう問題文に沿わせて解答していけば良いのか(引数のエラーの対応についても)しばらく自力でいろいろと考えてみたのですが、やはり検討がつかず現在も困っています。
    大変恐縮ですが今一度ご教授願えませんでしょうか?
    お手数おかけしますがよろしくお願いいたします。

    キャンセル

  • 2018/06/13 10:06

    えーと、どれが最新のコードなのか「2018-06-12 追記」などで示してもらわないと何を指摘していいかわかりません。
    なお、読みやすさのためにインデントもできるだけ整理しましょう。

    キャンセル

  • 2018/06/14 01:18

    なるべく質問した内容は残しておくべきかと考え、削除せず追記の形をとったまではよかったものの、情報をまとめきれず結果として読み難いページになってしまい申し訳ありません。
    ご指摘いただいた追記に関しまして、修正してみました。少しは分かりやすくなりましたでしょうか?まだまだ不慣れなことも相まってお手数おかけし恐縮ですが、何卒よろしくお願いいたします。

    キャンセル

+1

具体的に調べればすぐ答えは出てくると思うのですが、解決されていないようなので再回答します。

priceフィールドは全てのClock2インスタンスで同一の値にしなさい。

次のような挙動を期待しているんだと思います。

Clock2 a = new Clock2();
Clock2 b = new Clock2(); // aとは別のインスタンス
a.setPrice(2000);
System.out.println(b.getPrice() == 2000); // bのpriceも値が変更されている

複数のインスタンスを作成したときに同じ値となるためには、単純なメンバー変数ではいけません。
static を使ってください。

priceフィールドを利用できるのはClock2クラスのみ。

Clock2 クラスのみなので、 private ですね。

priceフィールドの値を取得するメソッドはどのクラスからでも利用可能。

getPrice メソッドが public でないといけないですね。これはできてます。

priceフィールドの値を設定するメソッドは同一パッケージからしかできない。

「同一パッケージのみ」なので、 public では駄目ですね。 protected や private でもありません。

priceフィールドの初期値は1000とする。

すでにできていますね。

 テストについて

もし余裕があれば、JUnitなどを使って例外発生も期待値にしてテストを書くことをおすすめします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

ClockTest2.java:9: エラー: クラス Clock2のメソッド setPriceは指定された型に適用できません。
        clock.setPrice();

上記エラーについてですが、Clock2.setPriceメソッドは引数として、int型を渡してあげる定義となっています。
そのため、メソッドを参照する際に、引数として値が与えられていないため、エラーとなっています。

下記ClockTest2クラスのsetPriceメソッド参照

            //↓ここ
public void setPrice(int price) {
    this.price = price;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/21 01:52

    こんばんは、質問にご回答いただきありがとうございます。
    Clock2クラスのsetPriceメソッドに引数が与えられていないためにエラーが起こっているとのことで、改善するには引数を与えてあげればよいのだというところまで理解いたしました。
    ただ、いろいろと試行錯誤してみたのですが、引数をこのsetPriceメソッドにどう与えてあげればよいのか悩んでおります。問題文の
    ・priceフィールドの初期値は1000とする。
    にそって考えると、おそらく初期値である1000を呼べる引数を設定するのかと考えたのですが、そこからうまく進まず…
    お手数おかけいたしますが、もう少しだけご教授願えませんでしょうか。
    何卒よろしくお願いいたします。

    キャンセル

  • 2018/06/21 01:57

    初期値はあくまで初期値なのだから、適当な値を与えればいいのでは?

    キャンセル

  • 2018/06/21 08:43

    priceフィールドの初期値は「private int price = 1000;」で設定されています。
    なので、「setPrice」を実行せずに「getPrice」を実行したとき、「1000」が返却されます。

    キャンセル

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

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

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

  • Java

    14469questions

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