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

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

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

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

Q&A

5回答

2857閲覧

コンストラクタを使って....

aikosu

総合スコア12

Java

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

0グッド

0クリップ

投稿2017/09/02 11:05

編集2022/01/12 10:55

■円の面積と円周の長さを出力したい

・クラスを作成しコンストラクタで半径と円周率を設定
・半径と円周率に数字以外が入力された場合NG
・半径と円周率二数値以外が入力された場合メッセージ出力
・円周率が入力されなかった場合、クラス定数を代入
・円周の値は小数第2位までの出力

コンストラクタを設定するメリットは?

package en12;

public class Circle {
private double pi, radius;
final double PI = 3.14;

public Circle(double radius) { this.pi=3.14; } public double getPi() { return pi; } public void setPi(double pi) { this.pi = pi; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public Circle(double radius, double pi) { super(); this.radius = radius; this.pi = pi; } void area() { double s = radius * radius * pi; double l = radius * 2 * pi; System.out.print(s); System.out.println(l); }

}

package en12;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ex0512 {

public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { System.out.print("半径>"); String str = br.readLine(); double r = Integer.parseInt(str); try { System.out.print("円周率>"); String str1 = br.readLine(); double p = Integer.parseInt(str1); Circle B = new Circle(r, p); Circle C = new Circle(r); System.out.println("面積:"+(r*r*p)); } catch (NumberFormatException e) { System.out.println("円周は数値を入力してください"); } } catch (NumberFormatException e) { System.out.println("半径は数値を入力してください"); } }

}

わからない...
あと円周率入力の際小数を入力した場合で例外処理が行われてしまいます.......

円周率>5.0

でもOKにしたいのですが....

■円周で何も入力しなかった場合
3,14が適用されるコードって......

メインで円周率を入力し無かった場合
円周率に3.14が代入されるようにするには
どうすればよいですか?

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

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

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

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

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

guest

回答5

0

変更不可能(immutable)なオブジェクトとして作成する場合は、コンストラクタ以外で半径や円周率を設定することができません。immutableなオブジェクトの利点や欠点は長くなるので省きますが、そのようなオブジェクトを作るクラスの設計としては、コンストラクタで全て設定することはなんら不思議ではない、むしろ、そうせざるを得ないことです。

設計としては、円クラスを用意して、そのクラスから円オブジェクトを作成し、その性質(半径以外にも、円周の長さや面積など)を取り出すというものだと思います。この方法は**オブジェクト指向で設計する場合は何ら不思議なものではありません。**オブジェクト指向とは、あるデータのまとまりを一つにまとめた一つのオブジェクトにすることで、そこからプロパティを得たり、関連するオブジェクトを生成する、何らかの動作を起こすものです。二つ以上の常に揃って連携するデータをなんらかのクラスでまとめて扱っていない場合、オブジェクト指向の考え方で作られていない設計と言えます。必要であるかどうかの問題ではありません。

投稿2017/09/03 00:43

raccy

総合スコア21733

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

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

0

何らかの課題と思われるので、お題の「円」ではなくRPGなどのキャラクターを例に説明します。
コンストラクタを設定するメリットは

  • 初期化するパラメータの入力を強制できる

次のようなクラスを考えると

java

1class Chara { 2 int hp; 3 4 public static void main(String[] args) { 5 Chara c = new Chara(); 6 } 7} 8```このようにしてインスタンス生成はできることはできますが、hpが0の状態で生成されることになり、いきなり倒れます。インスタンス生成後にフィールドの値を設定する必要が生じるので、使う側がその初期化を忘れると意図しない動作の原因になります。コンストラクタを設定した場合、 9```java 10class Chara { 11 int hp; 12 13 Chara(int hp) { 14 this.hp = hp; 15 } 16 17 public static void main(String[] args) { 18 // Chara c = new Chara(); コンパイルエラー! 19 Chara c = new Chara(10); 20 } 21} 22```hpの初期値を引数を持ったコンストラクタを作成すると、引数なしのコンストラクタが(このままだと)存在しない状態になります。引数なしのコンストラクタを使おうとするとコンパイルエラーとなるため、ミスに早い段階で気づくことができます。Charaクラスを使うためにhpの初期値を入力することを強制されるため、意図しない状態でのCharaインスタンスの運用を減らすことができます。 23- finalフィールドの初期値・デフォルト値設定 24前の方の回答で不変オブジェクトの話が出ていますがそれ関係で、クラスのフィールドの中で「一度設定したら変更したくない」というものも設定する必要がある場合があります。Charaのhpは変動するのが前提なので例としては適しませんが、仮にhpをfinalにしたとします。 25```java 26class Chara { 27 final int hp; 28 29 Chara(int hp) { 30 this.hp = hp; 31 } 32 33 public static void main(String[] args) { 34 Chara c = new Chara(10); 35 } 36} 37```これでも使えることは使えるのですが、ここで「初期値入力がない場合にhpは5としておきたい」という要求があったとします。この時、finalのフィールド宣言時に`final int hp = 5;`のようにしてしまうと、今度はコンストラクタでの値の設定ができなくなってしまいます(コンパイルエラー)38そのため、引数なしのコンストラクタを用意し、あたかも初期値に5を与えてコンストラクタを使用したようにできます。 39```java 40class Chara { 41 final int hp; 42 43 Chara(int hp) { 44 this.hp = hp; 45 } 46 47 Chara() { 48 this(5); 49 } 50 51 public static void main(String[] args) { 52 Chara c = new Chara(10); 53 } 54}

Integerは「整数」という意味です。小数は扱えません。doubleにしたいならDouble.parseDouble()を使ってください。

投稿2017/09/03 02:06

編集2017/09/03 07:36
swordone

総合スコア20649

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

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

aikosu

2017/09/03 07:14

package en12; public class Circle { private double pi, radius; final double PI = 3.14; public Circle(double radius) { this.pi=3.14; } public double getPi() { return pi; } public void setPi(double pi) { this.pi = pi; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public Circle(double radius, double pi) { super(); this.radius = radius; this.pi = pi; } void area() { double s = radius * radius * pi; double l = radius * 2 * pi; System.out.print(s); System.out.println(l); } }
aikosu

2017/09/03 07:16

まだ途中なのですが.... 円周率を入力しなかった場合、3.14が自動で使用になるコードがわかりません.....
swordone

2017/09/03 07:20

円周率を入力しなかった場合、piには定数PIを入れればいいだけの話です。 あと、コンストラクタはコンストラクタで場所をまとめましょう。
guest

0

引数付きコンストラクタを敢えて作る理由としては、
・一度作成したクラスの(コンストラクタで指定した)属性を変更させたくない
場合です。
今回の例で言えば、円の半径と円周率は、作ったが最後固定される、というのを保証するための方法の一つです。
※ゲッターしかない属性に対して初期値を与えるためにコンストラクタを使う

ただし、これが課題だとすると、そもそもJavaのコンストラクタなのですから、数値型でパラメータを定義すれば、数値以外を受け取る、という事自体があり得ません。従って NG を表示するも何もない(そもそもコンパイルが通らない)です。

投稿2017/09/02 16:25

tacsheaven

総合スコア13703

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

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

0

そもそもクラスを作る必要がない、という点では完全に同意です。
その上で、もし無理矢理クラスを作るなら、以下の点で違いはあると思います。

コンストラクタがない
正確には、引数のないコンストラクタを用いる場合。
流れ) インスタンスを生成、半径を設定、円周を取得
問題点) 半径を設定する前に円周が取得されようとした場合どうする?

コンストラクタがある
正確には、適宜引数を取るコンストラクタを用いる場合。
流れ) インスタンスを生成(同時に半径を設定)、円周を取得

投稿2017/09/02 12:59

編集2017/09/02 15:42
LouiS0616

総合スコア35658

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

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

0

コンストラクタどころか専用クラスを定義する必要性すらありません。普通にエントリポイントのためのクラスがひとつあれば実現できます。

多分、課題の情報が欠けています。そもそも円周率を都度都度入力する必要性がわかりません。しかも定数を用意しておくならば、なおさら用途不明です。

投稿2017/09/02 11:17

HogeAnimalLover

総合スコア4830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問