
前提・実現したいこと
こんばんは、Javaについての質問です。
今回はアクセス制御についての問題の解をjavaで作成することになり、途中いろいろと調べながらコードを作成したのですが、提示された問題文の条件通りにいかず、どう進めて良いのか悩んでおります。
お力お貸しいただけますと大変助かります。
下記が問題文となります。
問題文
値段を表す整数型フィールドのpriceを追加し、Clockクラスを改良しなさい。class名は「Clock2」とする。 ただし次の条件を満たすこと。 <条件> ・ priceフィールドは全てのClock2インスタンスで同一の値にしなさい。 ・ priceフィールドを利用できるのはClock2クラスのみ。 ・ priceフィールドの値を取得するメソッドはどのクラスからでも利用可能。 ・ priceフィールドの値を設定するメソッドは同一パッケージからしかできない。 ・ priceフィールドの初期値は1000とする。 また、Clock2クラスとは別にメインクラスを作成し、動作を確認できるようにすること。
改良する「Clock」クラスと、その動作確認のためのメインクラス「ClockTest」クラス
Java
1public class Clock { 2 private int hour; 3 private int minute; 4 private int second; 5 6 //コンストラクタ1 7 public Clock(){ 8 super(); 9 } 10 11 //コンストラクタ2 12 Clock(int hour, int minute, int second){ 13 this.hour = hour; 14 this.minute = minute; 15 this.second = second; 16 } 17 18 19 //SET 20 public boolean setHour(int hour) { 21 if(hour > 0 && hour <= 23){ 22 this.hour = hour; 23 return true; 24 } else { 25 return false; 26 } 27 } 28 29 public boolean setMinute(int minute) { 30 if(minute > 0 && minute <= 59){ 31 this.minute = minute; 32 return true; 33 } else { 34 return false; 35 } 36 } 37 38 public boolean setSecond(int second) { 39 if(second > 0 && second <= 59){ 40 this.second = second; 41 return true; 42 } else { 43 return false; 44 } 45 } 46 47 //GET 48 public int getHour(){ 49 return hour; 50 } 51 52 public int getMinute(){ 53 return minute; 54 } 55 56 public int getSecond(){ 57 return second; 58 } 59 60} 61 62/////////////////動作確認のための別クラス///////////////////////// 63 64 65import java.io.*; 66 67public class ClockTest { 68 public static void main(String[] args) throws IOException { 69 70 71 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 72 Clock clock = new Clock(); 73 74 while(true){ 75 try{ 76 System.out.print("hourの数値を入力してください>" + " "); 77 String str = br.readLine(); 78 boolean result = clock.setHour(Integer.parseInt(str)); 79 if(result) { 80 break; 81 } else { 82 System.err.println("[ERROR] 数値を再入力してください"); 83 } 84 }catch(NumberFormatException e){ 85 System.err.println("[ERROR] 数値を再入力してください"); 86 } 87 } 88 89 while(true){ 90 try{ 91 System.out.print("minuteの数値を入力してください>" + " "); 92 String str = br.readLine(); 93 boolean result = clock.setMinute(Integer.parseInt(str)); 94 if(result) { 95 break; 96 } else { 97 System.err.println("[ERROR] 数値を再入力してください"); 98 } 99 }catch(NumberFormatException e){ 100 System.err.println("[ERROR] 数値を再入力してください"); 101 } 102 } 103 104 while(true){ 105 try{ 106 System.out.print("secondの数値を入力してください>" + " "); 107 String str = br.readLine(); 108 boolean result = clock.setSecond(Integer.parseInt(str)); 109 if(result) { 110 break; 111 } else { 112 System.err.println("[ERROR] 数値を再入力してください"); 113 } 114 }catch(NumberFormatException e){ 115 System.err.println("[ERROR] 数値を再入力してください"); 116 } 117 } 118 119 System.out.println("hour" + " " + clock.getHour()); 120 System.out.println("minute" + " " + clock.getMinute()); 121 System.out.println("second" + " " + clock.getSecond()); 122 } 123} 124 125 126 127 128
作成途中のコード
Java
1package en8_2; 2 3public class Clock2 { 4 5 private int price = 1000; 6 7 //コンストラクタ1 8 public Clock2(){ 9 super(); 10 } 11 12 //コンストラクタ2 13 Clock2(int price){ 14 this.price = price; 15 } 16 17 18 //SET 19 static void setPrice(int price) { 20 this.price = price; 21 } //同一パッケージからのみ 22 23 //GET 24 protected static void getPrice(){ 25 return price; 26 }//どのクラスからでも利用可 27 28} 29 30 31///////////////////////動作確認のためのメインクラス////////////////////// 32 33 34package en8_2; 35import en8_2.Clock2; 36 37public class ClockTest2 { 38 public static void main(String[] args) { 39 40 Clock2 clock = new Clock2(); 41 clock.setPrice(); 42 43 System.out.println(clock.getPrice()); 44 45 } 46} 47 48
作成途中のコード(2018-06-12 追記)
Java
1package en8_2; 2 3public class Clock2 { 4 5 private int price = 1000; 6 7 //コンストラクタ1 8 public Clock2(){ 9 super(); 10 } 11 12 //コンストラクタ2 13 Clock2(int price){ 14 this.price = price; 15 } 16 17 18 //SET 19 public void setPrice(int price) { 20 this.price = price; 21 } 22 //static void?//同一パッケージからのみ 23 24 //GET 25 public int getPrice(){ 26 return price; 27 } 28 //protected static void ?//どのクラスからでも利用可 29 30} 31 32 33///////////////////////動作確認のためのメインクラス////////////////////// 34 35 36package en8_2; 37import en8_2.Clock2; 38 39public class ClockTest2 { 40 public static void main(String[] args) { 41 42 Clock2 clock = new Clock2(); 43 44 clock.setPrice(); 45 46 System.out.println(clock.getPrice()); 47 48 } 49} 50 51
現在発生しているエラー(修正)
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"
回答3件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2018/06/04 16:03
退会済みユーザー
2018/06/12 15:00 編集
2018/06/13 01:06
退会済みユーザー
2018/06/13 16:18