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

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

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

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

受付中

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

削除済ユーザー
削除済ユーザー

総合スコア0

Java

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

3回答

0評価

0クリップ

17閲覧

投稿2018/06/04 15:45

編集2022/01/12 10:55

前提・実現したいこと

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

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

問題文

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

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

Java

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()); } }

作成途中のコード

Java

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()); } }

作成途中のコード(修正,追記)

Java

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

やりたいこと

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

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

やりたいこと(追記)

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

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

Java
java version "1.8.0_161"

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Java

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