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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

3169閲覧

javaでのクラス継承がわかりません

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2015/11/29 12:42

IntOperatorクラスを下に書いています。
このクラスを継承し、合計を計算するメソッドcalcを実装させたいです。

例として、最小値=1、最大値=5の場合、
1+2+3+4+5=15のように、
IntOperatorクラスのcalcメソッドとして合計を表示させたいです。
どのようにすればよいでしょうか?

public class IntOperator {

/** 生成した整数配列 */ protected int[] intArray; /** 配列の最大値 */ private int max; /** 配列の最小値 */ private int min; /** デフォルトコンストラクタ */ private IntOperator() { } /** * 配列の範囲を指定したコンストラクタ * * @param min 配列の最小値 * @param max 配列の最大値 */ private IntOperator(int min, int max) { this.max = max; this.min = min; } /** 指定された範囲の配列生成 */ protected void makeArray() { for (int i = min; i < max; i++) { intArray[i] = i; } } /** 計算用メソッド */ double calc() { return 0; }

}

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

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

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

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

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

swordone

2015/11/29 13:58

このIntOperatorは、与えられたものであって変更ができないものですか?変更できないとすると、このクラスを継承させる意味がほとんどない状態なのですが…
guest

回答1

0

ベストアンサー

まずJavaでの配列は静的配列となるので、

java

1/* 略 */ 2 protected void makeArray() { 3 //この一行を追加 4 intArray = new int[max]; 5 // 6 for (int i = min; i < max; i++) { 7 intArray[i] = i; 8 } 9 } 10/* 略 */

このように配列を宣言するか、

java

1 import java.util.ArrayList; 2 3 public class IntOperator { 4 5 /** 生成した整数配列 */ 6 protected ArrayList<Integer> intArray = new ArrayList<Integer>(); 7 /** 配列の最大値 */ 8 private int max; 9 /** 配列の最小値 */ 10 private int min; 11 12 /** デフォルトコンストラクタ */ 13 private IntOperator() { 14 } 15 16 /** 17 * 配列の範囲を指定したコンストラクタ 18 * 19 * @param min 配列の最小値 20 * @param max 配列の最大値 21 */ 22 private IntOperator(int min, int max) { 23 this.max = max; 24 this.min = min; 25 } 26 27 /** 指定された範囲の配列生成 */ 28 protected void makeArray() { 29 for (int i = min; i < max; i++) { 30 intArray.add(i, i); 31 } 32 } 33 34 /** 計算用メソッド */ 35 protected double calc() { 36 return 0; 37 } 38}

こうやって動的配列を使うかですね…

ちなみに、calcはprotectedにしておく必要があります。

protectedで、継承した子クラスからの参照が可能になります。
オーバーライドされたくない場合は、「final」修飾子を付ければ良いです。

肝心の継承ですが、
前者の配列を使うことを前提で書きますね。

java

1 public class SumCalc extends IntOperator{ //extendsで継承 2 3 @Override 4 public double calc() { 5 int sum = 0; 6 for (int i = min; i < max; i++) { //min から max まで足す 7 sum += intArray[i]; 8 } 9 return sum; // 値を返す 10 } 11 12 } 13

あと、double(64bit浮動小数点数)である必要はないですね…
intArrayがint(整数値)のなので。

全く筋違いの回答でしたらすみません…
推測するに、javascriptかなんかをやっていたのではないでしょうか…?

あと、任意のminからmaxまでの合計値は、

java

1 /** 2 * 3 * 任意の整数minからmaxまでの合計値 4 * 5 */ 6 public int sum(int min, int max){ 7 return (int)((max * (max + 1) - min * ( min + 1)) / 2); 8 } 9

もっとスマートにできるかもしれませんが、
これが自分のなかで一番だと思います。

拙い説明失礼しました。

投稿2015/11/29 13:29

luma

総合スコア183

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

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

退会済みユーザー

退会済みユーザー

2015/11/29 13:53

ご丁寧解説ありがとうございます。 試してみたところ、以下の問題ができました。 どのように解決すればいいでしょうか? ・SumCalcについて、 暗黙的スーパー・コンストラクター IntOperator() は、デフォルト・コンストラクターについては不可視です。明示的コンストラクターを定義する必要があります と表示されます。 ・max、minについて、 フィールド IntOperator.min は不可視です と表示されます。 ・intArrayについて、 式の型は配列型で ArrayList<Integer> に解決済みのものである必要があります と表示されます。
luma

2015/11/29 14:04 編集

すみません、説明不足でした… privateの変数、メソッドは、 継承したクラスからも参照できません(内部クラスでない限り)。 なので、全部protectedにする必要があります。 使用目的がわからないので、何とも言えませんが、 この場合、IntOperatorのコンストラクタはpublicであるのが適当だと思います。 --- public class IntOperator { /** 生成した整数配列 */ protected int[] intArray; /** 配列の最大値 */ protected int max; /** 配列の最小値 */ protected int min; /** デフォルトコンストラクタ */ public IntOperator() { } /** * 配列の範囲を指定したコンストラクタ * * @param min 配列の最小値 * @param max 配列の最大値 */ public IntOperator(int min, int max) { this.max = max; this.min = min; } /** 指定された範囲の配列生成 */ protected void makeArray() { //この一行を追加 intArray = new int[max]; // for (int i = min; i < max; i++) { intArray[i] = i; } } /** 計算用メソッド */ double calc() { return 0; } } --- public class SumCalc extends IntOperator{ //extendsで継承 public SumCalc() { super(); } @Override public double calc() { int sum = 0; for (int i = min; i < max; i++) { //min から max まで足す sum += intArray[i]; } return sum; // 値を返す } } --- こんなかんじですかね… ちょっと訂正しました。
退会済みユーザー

退会済みユーザー

2015/11/29 14:17

解決できました。ありがとうございます。 最後に、sumを表示させたいです。
luma

2015/11/29 14:25

SumCalcに public SumCalc(int min, int max) { super(min, max); } を、 IntOperatorに public static void main(String[] args) { IntOperator intOperator1 = new IntOperator(10,20); intOperator1.makeArray(); System.out.println("スーパークラスで計算"); System.out.println(intOperator1.calc()); //そのまま0が出力される IntOperator intOperator2 = new SumCalc(10,20); intOperator2.makeArray(); System.out.println("サブクラスで計算"); System.out.println(intOperator2.calc()); //10から20までの合計値が出力される } を追加してみてください。 double値で出力されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問