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

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

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

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

Q&A

解決済

2回答

989閲覧

抽象クラスと実装したクラス

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2021/03/19 06:29

配布するプログラムは、抽象クラスComputerと、それを実装した、PersonalComputer、 TabletPC、およびSmartPhoneクラスを操作するプログラムである。以下に記述されている、 ①Computerクラス、②PersonalComputerクラス、③work10_1.javaを参考にして、☆TalbetPCクラス、および★SmartPhoneクラスを完成させ、期待する実行結果と同じものが得られるようにしなさい。

java①

1package java10; 2 3// コンピュータの抽象クラス 4public abstract class Computer { 5 // コンピュータのタイプ 6 private String type; 7 // コンストラクタ 8 public Computer(String type){ 9 this.type = type; 10 } 11 // 入力処理 12 public abstract void input(); 13 // 出力処理 14 public abstract void output(); 15 // 通信処理 16 public void communication(){ 17 System.out.println("インターネットで通信"); 18 } 19 // タイプの出力 20 public void showType(){ 21 System.out.println("コンピュータの種類:" + type); 22 } 23}

java②

1package java10; 2 3public class PersonalComputer extends Computer{ 4 // コンストラクタ 5 public PersonalComputer(){ 6 super("パーソナルコンピュータ"); 7 } 8 // 入力処理 9 public void input(){ 10 System.out.println("キーボード・マウスで入力"); 11 } 12 // 出力処理 13 public void output(){ 14 System.out.println("ディスプレイに出力"); 15 } 16} 17

java③

1package java10; 2 3public class work10_1 { 4 5 public static void main(String[] args) { 6 Computer[] cp = new Computer[3]; 7 cp[0] = new PersonalComputer(); // パーソナルコンピュータ 8 cp[1] = new TabletPC(); // タブレットPC 9 cp[2] = new SmartPhone(); // スマートフォン 10 for(Computer c:cp){ 11 c.showType(); 12 c.input(); 13 c.output(); 14 c.communication(); 15 System.out.println("--------------------------------------"); 16 } 17 18 } 19} 20

参考にするコードは上記です。

コンピュータの種類:パーソナルコンピュータ
キーボード・マウスで入力
ディスプレイに出力
インターネットで通信

コンピュータの種類:タブレットPC
タッチパネルディスプレイをタップして操作
タッチパネルディスプレイに出力
インターネットで通信

コンピュータの種類:スマートフォン
タッチパネルディスプレイをタップして操作
タッチパネルディスプレイに出力
インターネットと電話回線で通信

期待される実行結果は上記です。

どういう風に書けば良いのか全く分からないです。
ヒントだけでも大丈夫なので教えていただきたいです。

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

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

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

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

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

K_3578

2021/03/19 06:31

どこかの課題か何かですかね・・・?
退会済みユーザー

退会済みユーザー

2021/03/19 06:34

そうです。。 難しくて、調べても分からなかったので。。
K_3578

2021/03/19 06:36

学校の課題とかだとteratailでは非推奨の質問になるんですが・・・ とりあえず、まず自分でどういう風に調べてみましたか?
dodox86

2021/03/19 06:38

課題固有のことなぞ、WEBでググって調べても分からないと思います。問題自体が理解できないのであれば、それまでのJavaの学習内容が足りないか、理解が足りないか、なのですが。
退会済みユーザー

退会済みユーザー

2021/03/19 06:41

そうですね。理解が足りてないと思います。 問題の意味があまり分からないのでどういう風に時進めていくのかが分からないです。
K_3578

2021/03/19 06:44

全く分からないのならばまず単語で区切って調べてみたらどうでしょう。 例えば「抽象クラス」とか。
BeatStar

2021/03/19 07:10

キーワードは『オブジェクト指向』、『ポリモーフィズム』、『抽象クラス』(あるいはabstract)、 『継承』。 このあたりですかね。
K_3578

2021/03/19 07:15

まぁどちらにせよ、dodox86さんのコメント通り基礎段階で学習した内容を覚えていない、若しくは 学習していないのどちらかなので私からは学習をやり直すことを強くお勧めします。 基礎が頭に入っていれば後はどう使うかだけなので、ここで質問して回答を募らずとも済みますし、 私みたいなのに苦言を呈されることもありません。
K_3578

2021/03/22 03:33

私は本質問を解決したならクローズしてください。と言いましたが得られた回答を元に解決したならば何かしらその回答者様にフィードバックを残すのが至極当然かと思いますが。
guest

回答2

0

現状、work10_1 クラスは

☆TalbetPCクラス、および★SmartPhoneクラス

が、存在しないためコンパイルエラーになります。当然実行できません。
つまり課題の内容は、

  • work10_1をコンパイルできるようにする
  • 実行結果を期待の通りにする

ということです。

java

1package java10; 2 3public class work10_1 { 4 5 public static void main(String[] args) { 6 //Computer[] cp = new Computer[3]; 7 Computer[] cp = new Computer[1]; // これに修正 8 cp[0] = new PersonalComputer(); // パーソナルコンピュータ 9 //cp[1] = new TabletPC(); // タブレットPC 10 //cp[2] = new SmartPhone(); // スマートフォン 11 for(Computer c:cp){ 12 c.showType(); 13 c.input(); 14 c.output(); 15 c.communication(); 16 System.out.println("--------------------------------------"); 17 } 18 19 } 20}

上記のように修正すれば、期待する結果の三分の一が完了しているはずです。
あとは、TabletPCとSmartPhoneを作成してください。
作成したら、work10_1を修正してTabletPC、SmartPhoneを利用するようして再コンパイルします。

いわゆるHello Worldで表示される文字を貴方の名前にしてくださいレベルの難易度かと思います。

投稿2021/03/19 07:11

momon-ga

総合スコア4820

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

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

0

ベストアンサー

まず、オブジェクト指向に関しては、よい子のC++(オブジェクト指向完全理解)を参考にした方がよさそうです。

上記URLのサイトはC++での説明ですが、Javaでも発想自体は同じです。
単にinterfaceが言語レベルで用意されている・されていないとか、
書き方が違うとかそれ系です。

そのサイトによると、『データ(= フィールド) と処理(= メソッド) をひとまとめにしたオブジェクト』なるものを中心に見る発想がオブジェクト指向らしいです。

Java

1package java10; 2 3// コンピュータの抽象クラス 4public abstract class Computer { 5 // コンピュータのタイプ 6 private String type; 7 // コンストラクタ 8 public Computer(String type){ 9 this.type = type; 10 } 11 // 入力処理 12 public abstract void input(); 13 // 出力処理 14 public abstract void output(); 15 // 通信処理 16 public void communication(){ 17 System.out.println("インターネットで通信"); 18 } 19 // タイプの出力 20 public void showType(){ 21 System.out.println("コンピュータの種類:" + type); 22 } 23}

を例にとると、 type (コンピュータのタイプ) がフィールドとして保持されています。

それに対しての output (出力) とかが処理として用意されています。

そして、継承(interfaceの場合は実装)をしたら、『親が持っているメンバは絶対に持っている』と見なせます。
だって、実装すべきですから。

abstract (抽象クラス)は そのinterface の『強制実装』を限定的にしたものです。
再実装しないなら親で用意されている処理をデフォルトの動きとして指定する感じです。

これによって、

// 疑似コード 親 オブジェクト = new 子(...);

と言う風にすれば、『親が持っているメンバはすべて、子が持っている』ので、
オブジェクトがどのクラスで生成されたかなんて考えなくても使えるようにしています。

これがポリモーフィズム……だと思います。

Additionクラス(足し算), Subtractionクラス(引き算), ... と言う風に四則計算用のクラスを用意するとします。

これがユーザ入力( 標準入力 ) によって "+" が入力されたら足し算クラスを、"-"が入力されたら引き算クラスを…のようにするとしたら、

Java

1Addition obj1; 2Subtraction obj2; 3Multiple obj3; // 掛け算クラス 4// ... 割り算クラスも 5 6// ユーザ入力によって生成するオブジェクトを決める 7if( user == "+" ){ 8 obj1 = new Addition( a ); 9}else if( user == "-" ){ 10 obj2 = new Subtraction( a ); 11}... 12 13 14// 実際に動かす 15if( user == "+" ){ 16 System.out.println( obj1.calc( b ) ); 17}else if( user == "-" ){ 18 System.out.println( obj2.calc( b ) ); 19}...

のように、使うたびにif分で分岐させないといけません。

でもこれをCalculator インターフェースを用意して、Additionクラスらはこのインターフェースを実装しているものとして定義していたら、

Java

1Calculator obj; 2 3// ユーザ入力によって生成するオブジェクトを決める 4if( user == "+" ){ 5 obj = new Addition( a ); 6}else if( user == "-" ){ 7 obj = new Subtraction( a ); 8}... 9 10 11// 実際に動かす 12System.out.println( obj.calc( b ) );

と出来ます。

生成時は仕方ないですが、実際に動かしたりする場合は、『親であるインターフェースにあるものは必ず持っている』ものとしているので、obj.calc( b ) のようにして、

『オブジェクトに任せる』ことが出来ます。

まあ、上記サンプルはあくまで例なので、実際にはこんな設計はしませんが。

abstract はinterface の『強制実装』の範囲を狭めたものです。

再実装しなければ親で定義されたものが動きます。

投稿2021/03/19 07:35

BeatStar

総合スコア4958

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問