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

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

ただいまの
回答率

88.91%

アクセサメソッドの具体的な入力方法がわかりません

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 232

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
短期間学んだことの応用で簡単なjavaプログラムを作っています。
普通に実行すれば問題ないごくごく簡単なプログラムです。
そこでファイル2にprivate修飾子を付けてもファイル3が実行できるように
アクセサメソッドを実装してみたのですが、以下のエラーメッセージが発生しました。
どこかにgetRを付ければ良いと考えているのですが、
どうすればエラーがなくなるでしょうか?
教えてください。

発生している問題・エラーメッセージ

C:\Users\hidea\Desktop\p000\pack01> javac SolidCalculation.java
SolidCalculation.java:5: エラー: シンボルを見つけられません
Solid so1 = new Sphere( getR(30.0) );
^
シンボル:   メソッド getR(double)
場所: クラス SolidCalculation
エラー1個

該当のソースコード

(ファイル1)
abstract class Solid {
abstract public double getVolume();    
}

(ファイル2)
class Sphere extends Solid {
final double pi = 3.14; 
double r;
private Sphere(double r) { 
this.r = r;
}
public double getR() { 
return this.r;
}
public void setR(double r) { 
this.r = r;
}
public double getVolume() {
return (4.0 / 3.0) * pi * Math.pow(r,3.0) ;
}
}

(ファイル3)
class SolidCalculation{          
public static void main( String [] args ){                                                                 
Solid so1 = new Sphere( getR(30.0) );
Solid so2 = new Rectangular( 10.0, 20.0, 30.0 );

System.out.println( "Sphere = "+ so1.getVolume() );
System.out.println( "Rectangular = "+ so2.getVolume() );
System.out.println( "Total = "+ ( so1.getVolume() + so2.getVolume() ) );                   
}
}

試したこと

ファイル2にgetterメソッドとsetterメソッドを設定し、
ファイル3で呼び出そうとgetRを入れて四苦八苦して色々試したのですが、
全て同じようなエラーが出て上手くいきません。

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

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

0

いろいろおかしいです。

  • getR()は引数を取りませんので、getR(30.0)は意味をなしません。
  • getR()インスタンスメソッドですので、インスタンスがなければ呼び出せません。

単に、Solid so1 = new Sphere(30.0);とすればよかったのではないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/23 18:36

    どこかにアクセス制限を付けて、アクセサメソッドでクリアするという課題を与えられているのです。
    スキル不足でご指摘いただいていることが殆ど理解出来ません。
    「staticメソッドとしてインスタンス作成ルートを用意する」とは具体的にどういうコードをどこに書けば良いのでしょか?

    キャンセル

  • 2020/07/23 18:37

    > どこかにアクセス制限を付けて、アクセサメソッドでクリアするという課題を与えられているのです。

    それでしたら、privateにすべき箇所はコンストラクタではありません(アクセサメソッドでprivateコンストラクタの制約を回避することはできません)。

    キャンセル

  • 2020/07/24 05:53

    この出題の意図は「カプセル化」だと思われます。カプセル化の説明か、学習が先にあったはずですが、... 。

    キャンセル

0

まずJavaにおいては1ファイル1クラス(内部クラスは除く)なので、ここで回答してくださる方々には「ファイル1」などの記載は不要です。

ただコードが見づらいので、質問内でコードを記載する際は「、、、」(コードの挿入というのが編集画面ヘッダにあります。)を追加してください。
以下のような感じです。

// 抽象クラス
abstract class Solid {
    abstract public double getVolume();    
}
// privateアクセサメソッドを実装したいクラス
class Sphere extends Solid {
    final double pi = 3.14; 
    double r;
    private Sphere(double r) { 
        this.r = r;
    }
    public double getR() { 
        return this.r;
    }
    public void setR(double r) { 
        this.r = r;
    }
    public double getVolume() {
        return (4.0 / 3.0) * pi * Math.pow(r,3.0) ;
    }
}
// main実装クラス
class SolidCalculation{          
    public static void main( String [] args ){                                                                 
        Solid so1 = new Sphere( getR(30.0) );
        Solid so2 = new Rectangular( 10.0, 20.0, 30.0 );

        System.out.println( "Sphere = "+ so1.getVolume() );
        System.out.println( "Rectangular = "+ so2.getVolume() );
        System.out.println( "Total = "+ ( so1.getVolume() + so2.getVolume() ) );                   
    }
}

ここでまず質問者様がお求めになっているSphereクラスにprivateアクセサメソッドを追加したいとのことですが、現状だと不可能です。
privateがついたメソッドは、そのクラス内のメソッドからしか使用できません。 (調べたところリフレクションという方法もあるそうですが、基本学習内容ではないため省略します。)

例を書きます。(複数クラスをまとめて記述します。)

class Sample {
    private String value = "サンプル";

    // publicメソッド
    public String getValuePublic() {
        return this.value;
    }

    // privateメソッド
    private String getValuePrivate() {
        return this.value;
    }

    // publicメソッド内でprivateメソッドを実行
    public String getValueBridge() {
        return getValuePrivate();
    }
}

class MainClass {
    public static void main(String[] args) {
        Sample smp = new Sample();

        System.out.println(smp.getValuePublic()); // 正常

        System.out.println(smp.getValuePrivate()); // エラー

        System.out.println(smp.getValueBridge()); // 正常
    }
}

アクセサメソッドのサンプルです。
学習に役立ててください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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