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

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

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

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

Q&A

3回答

378閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/06/04 15:45

編集2018/06/13 16:11

前提・実現したいこと

こんばんは、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"

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

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

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

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

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

guest

回答3

0

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

text

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

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

text

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

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

text

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

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

text

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

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

投稿2018/06/04 16:00

mather

総合スコア6753

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

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

mather

2018/06/04 16:03

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

退会済みユーザー

2018/06/12 15:00 編集

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

2018/06/13 01:06

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

退会済みユーザー

2018/06/13 16:18

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

0

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

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

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

java

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

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

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

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

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

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

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

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

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

すでにできていますね。

テストについて

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

投稿2018/06/22 02:39

mather

総合スコア6753

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

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

0

text

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

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

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

java

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

投稿2018/06/18 04:29

yuusuko

総合スコア145

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

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

退会済みユーザー

退会済みユーザー

2018/06/20 16:52

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

2018/06/20 16:57

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

2018/06/20 23:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問