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

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

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

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

Q&A

3回答

392閲覧

java インターフェースについて

han115

総合スコア7

Java

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

0グッド

0クリップ

投稿2018/06/18 00:18

とある書籍で
実装者目線では、インターフェースは「クラスに対するアクセスを制限する制約」といえます。
インターフェースを実装したクラスでは、インターフェースで定義したメソッド以外にpublicメソッドを作成したとしても、外部から(型を明確にしない限りは)呼び出すことを防げます。とありました。

インターフェースについて、理解が少し乏しいのですが
インタフェースは、似たようなクラスに実装すべきメソッドや定数をまとめておく。くらいの認知です。

「クラスに対するアクセスを制限する制約」とはずばりどういう事でしょうか?
また 外部から(型を明確にしない限りは)呼び出すことを防げます。 という意味も少しわかりません。

ご教授お願いします。

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

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

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

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

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

guest

回答3

0

インタフェースは、似たようなクラスに実装すべきメソッドや定数をまとめておく。くらいの認知です。

この根本の認知がおかしいので、議論が進みません。

Javaのインターフェースの重要な特徴として、インターフェースを型にした変数を宣言できるということがあります。

java

1List<String> strList = new ArrayList<String>();

上のようなコードを見たことがあるかと思いますが、strListは、インターフェースであるListを変数の型としています。このようなインターフェース型の変数については、

  • 同じインターフェースを実装したクラスであれば、なんでも代入できる
  • 呼べるメソッドは、インターフェースにあるものだけ

というような使い方となります。このままでは、ArrayListにしかないメソッドは呼べません。

投稿2018/06/18 00:39

maisumakun

総合スコア145123

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

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

0

もう遅いでしょうが、目に入ってしまったので答えます。

Java

1public interface Animal { 2 /** 吠える */ 3 void bark(); 4} 5 6public class Dog implements Animal { 7 @Override 8 public void bark() { System.out.println("ワン"); } 9 public void sleep() { System.out.println("zzz..."); } 10} 11 12public class Egachan implements Animal { 13 @Override 14 public void bark() { System.out.println("ウォ~"); } 15 public void bark2() { System.out.println("がっぺむかつく"); } 16}

ってな感じで定義があったとします。呼び出し側は…

Java

1public void main(String[] args) { 2 Animal[] animals = new Animal[] { new Dog(), new Egachan() }; 3 for(Animal animal : animals) { 4 animal.bark(); // ←これはどちらもOK 5 if(animal instanceof Egachan) { 6 ((Egachan)animal).bark2(); // ←これは「外部から型を明確にしない限りは…」の例 7 } 8 } 9}

「クラスに対するアクセスを制限する制約」とは上記を例にとると、DogもEgachanもAnimal型で扱っている限り、bark()メソッドしか呼び出せません。sleep()もbark2()もアクセスできないことから「アクセスを制限する制約」との意味でしょう。
「外部から型を明確にしない限り…」は上記例にあるよう、キャストして実装クラスを明らかにした場合のことでしょう。

もしインターフェースについてご興味があれば、以下の書籍をオススメします。
【「先輩、Javaのインターフェースって何ですか?」の答えに窮した時に読む本】

投稿2020/02/14 14:54

Mirko_Mug_Cup

総合スコア53

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

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

0

インタフェースは実装のためよりも設計のためのものです。クラスに約束事を決めることで作業者間の意思疎通の円滑化ができますし、約束に関係ない具体的な実装を流動的に調整できます。

実装の立場からは制約にも見えます。約束事を守らないとコンパイル時に弾かれます。

投稿2018/06/18 03:21

HogeAnimalLover

総合スコア4830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問