- ベストアンサー
Javaのパッケージについて
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>>> classの宣言のところでimplementsと書かず このクラスが自分Aのメソッドとして、hasNext()を使う場合は、当然、 implements が必要となります。 しかしながら、implements しなくても、インタフェースは利用できます。 ------------------------------------------------------------ たとえば、java.util.Iterator は、publicです。 public interface Iterator したがって、importしていれば、 import java.util.*; 次のような利用は可能となります。 for (Iterator i = map.iterator(); i.hasNext();) { ------------------------------------------------------------ このhasNext()は、クラスAのメソッドではありません。 このようにIteratorには public が付いているので、Iterator は、他のパッケージからも見えることになります。 恐らくこういった状態で、 「Iteratorインタフェースを使ったプログラム」 を見ているのではないでしょうか。
その他の回答 (2)
- auty
- ベストアンサー率58% (284/486)
・ 例えば最もよく使われるArrayListについて追って見ましょう。 ArrayList -----> AbstractList 継承 ArrayListは、AbstractListを継承しています。 そのArrayListのソースコードは、 ------------------------------------------------------------ public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { ------------------------------------------------------------ そこで、AbstractListを見てみます。 ------------------------------------------------------------ public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { public Iterator<E> iterator() { return new Itr(); } private class Itr implements Iterator<E> { public boolean hasNext() { return cursor != size(); } public E next() { checkForComodification(); try { E next = get(cursor); lastRet = cursor++; return next; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } } } ------------------------------------------------------------ このように、AbstractListの内部クラスとしてのクラスItr が Iteratorを実装しています。 ・ ソースコードを辿るのは、eclipse等のIDE(統合開発環境)では、[F3] キーで 簡単に出来ます。 ・ スーパークラスやインタフェースの変数に代入するやり方は、テクニックとしても重要でよく使われます。
お礼
こんばんは。 また詳しい解説ありがとうございます! 実際に自分でもソースコード見てみました。 内部クラスなど、複雑に感じましたが、勉強して行こうと思います。 ありがとうございました。
- BleuLune
- ベストアンサー率57% (15/26)
当然、インタフェースもクラスと一緒にパッケージにて管理できます。 それより >Iteratorインタフェースを使ったプログラムを見ていますが、classの宣言のところでimplementsと書かずにhasNext()メソッドを使っているので、気になりました。 上記内容の意味が全く分かりません。 文言どおりならコンパイルできるはずがないと思いますが、コンパイルエラーはでていないのでしょうか?
補足
>Iteratorインタフェースを使ったプログラムを見ていますが、classの宣言のところでimplementsと書かずにhasNext()メソッドを使っているので、気になりました。 autyさんの解説によると、 Iteratorを実装している内部クラスのメソッドとして使っているようです。
関連するQ&A
- javaのpackageのMainとは?
古い本の初心者プログラムでは、 class Hello{ public static void main(String[] args){ System.out.println("Hello!"); } } だけなんですが、統合環境の Intellij IDEAですと、 package com.company; public class Main { public static void main(String[] args) { // write your code here } } となっていて、mainメソッドを含むクラスのMainを含むpackageが必要になっています。どうしてクラスMainは他のpackageで宣言されてないとならないのですか?
- ベストアンサー
- Java
- Javaのプログラムについての質問です。
Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。 注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。 以下は極最初期のソースになります。 import java.util.List; public interface Interface{ int size(); boolean add(); boolean remove(); void clear(); get(); set(); } public class LocalList implements Interface{ class Main implements LocalList { public static void main(String[] args) { } } Listインターフェースについてネットで調べてはいるのですが、具体的な解決方法が見えてきません。 どなたか参考ソースや考え方などを教えていただけないでしょうか。よろしくお願い致します。
- 締切済み
- SE・インフラ・Webエンジニア
- javaのインターフェースと動的制御について教えてください!
javaのインタフェースと動的制御についての課題を出されたのですが、以下のようなものです ・起動させるクラス名はmain実行時にコマンドライン引数として渡す ・動的に呼び出されるクラスは2つ作成し、クラスその(1)現在の時間、 クラスその(2)クラス名を出力させる。 ・想定している構成として、メインクラス、インターフェース、動的ク ラス二つの計4クラスとする。 という問題で今のところ作成したクラスが以下のようなものです、インターフェースクラスと動的クラス二つはなんとかできて、このまま変化させずに置きたいです。メインクラスの見当がつきません、できたらメインクラスのアドバイスをどうかお願いします。ちなみに私はエクリプスをしようしています。 インターフェースクラス package Kadai1221; public interface Interface001 { void kurasu(); } 動的クラス二つ 一つめ package Kadai1221; import java.util.Calendar; public class Jikan implements Interface001 { public void kurasu() { Calendar now = Calendar.getInstance(); int zikan; int hun; int byou; zikan = now.get(Calendar.HOUR_OF_DAY); hun = now.get(Calendar.MINUTE); byou = now.get(Calendar.SECOND); System.out.println(zikan + "時" + hun + "分" + byou + "秒"); } } 二つ目 package Kadai1221; public class Kurasumei implements Interface001 { public void kurasu() { System.out.println("Kurasumei"); } } メインクラス package Kadai1221; public class Kadaimain { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ } } どうかよろしくお願いします。
- 締切済み
- Java
- 定数の使用について
こんばんは。 ふと疑問に思ったので、質問させていただきます。 Aと言うクラス(Class)があったとします。 Bと言うインターフェイス(Interface)があったとします。 このBのインターフェイスに「AORINGO」と言う定数が宣言 されています。 「AORINGO」を使用したい場合、Bと言うインターフェイスの パッケージをインポート(import)すれば、B.AORINGOと言うように、 「インターフェイス名」+「定数名」でアクセスできますよね。 また、AクラスにBのインターフェイスをインプリメント(implements) すればそのまま定数名だけ(AORINGO)で使用できますよね。 これって何が違うのでしょうか?? 定数名だけで使える方が、楽な気がするのでインプリメントしちゃうのが いい感じがするのですが。。。 そもそもインポート(import)すると、そのクラスが呼ばれた時にインポート されているパッケージが読み込まれるのでしょうか?? インプリメント(implements)することによるメリット、デメリット等、 動き的な所がいまいち、理解できていません。 また、インポートする際に、アスタリスク(*)で宣言すると、そのパッケージ を指す事になると思いますが,単一のパッケージだけを指定する方が良いのでしょうか?? その辺のメリット、デメリット等も教えていただけると助かります。 よろしくお願い致します。 #わかりにくい文章となって、すいません。。
- ベストアンサー
- Java
- 同一パッケージ内の継承について
同一パッケージ内で継承したクラス Test2.java をコンパイルすると「シンボルを見つけられません シンボル:クラス Test1」とエラーになります。 --------Test1.java------- package test; public class Test1{ メソッド } ------------------------- --------Test2.java------- package test; public class Test2 extends Test1{ メソッド } ------------------------- Test1.java,Test2.javaとも同一フォルダ(D:\java\test)にあります。 ちなみにカレントディレクトリをD:\java\testにして javac Test2.java でコンパイルしようとしています。 同一パッケージ内のクラスを継承するというのはおかしなことなんでしょうか?また、コンパイルの仕方もあわせてご教示願えれば助かります。 よろしくお願いします。
- ベストアンサー
- Java
- java のメソッドの使い方について
現在のjavaの勉強しております。 そこでフィールドについてどうしてもわからないことがあったので質問させていただきます。 他クラスのメソッドを利用したい時、通常インスタンス化を行いますが、下記のようにフィールドに宣言しても、他クラスのメソッドを利用できることに疑問を感じました。 public class Test{ public String show(){ ~~ return null; } } //Testクラスのshowメソッドを呼び出します public class Test2{ private Test test_; public String triaezu(){ String str = test_.show(); ~~ … このようにフィールドにもつ呼び出しとインスタンス化をして呼び出す方式とは一体何が違うのでしょうか? プログラムの先輩方、基礎的なことすぎて申し訳ないのですが、どうかご教授ください。
- ベストアンサー
- Java
- 「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」
「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」は正しい? はじめまして。Javaのインタフェースに関する質問です。 私はこれまで、インタフェースを使うときは、インタフェースを実装してクラスを宣言し、そのクラス、またはサブクラスでインタフェースがもつすべての抽象メソッドを定義する、と理解していました。 しかし、下の例をみてください。抽象メソッドの定義を、インタフェースの実装の以前で与えています。問題無くコンパイルでき、実行できます。実行結果も以下の通りです。 インタフェースの抽象メソッドへの定義の与え方やその実行のされ方は、メソッドのオーバーライドと同様と思っていましたので、下記のコードでは「クラスBが抽象クラスではありません」や、「インタフェースの抽象メソッドがオーバーライドされていません」などの文法エラーがでると思っていました。 そこで、質問です。 インタフェースが持つ抽象メソッドの定義を与える場所について、または、これに関する説明のあるページなど、何かご存知でしたら教えてください。 ★コード★ interface X{ void show(); } class A{ public void show(){ System.out.println("A"); } } class B extends A implements X{ } public class Main{ public static void main(String[] args){ X x=new B(); x.show(); } } ★実行結果★ >java Main A ★Java環境★ java 1.6.0_21 javac 1.6.0_16
- ベストアンサー
- Java
- Javaアソシエイツの練習問題について
以下の問題文について、なぜ答えがそうなのか疑問が解決できないので投稿させていただきます。どなたか教えてください。 【問題文】 以下の空欄に入れてコンパイルしたとき、コンパイルエラーとなるものはどれか? import java.util.*; ( 空欄 ) class Sample() 【選択肢】 A.interface Inter{} B.class MyClass{} C.package exam; D.import java.io.*; 【回答】 C <解説> パッケージ宣言はソースファイルの先頭に1つだけ記述できるが、 複数宣言するとエラーとなる。 問題文にパッケージ宣言はないと思うのですが。。。 よろしくお願いします。
- ベストアンサー
- Java
- イテレータパターンの理解度チェック
デザインパターンのイテレータパターンを勉強していて、自分の理解が正しいか気になるので質問です。以下、私の理解しているつもりのことです。正しいか否か、間違っている場合はその部分について解説を願いたいです! ・Concrete Collectionはデータの保持と管理しているクラスで、メソッドiteratorでIteretor型のオブジェクトさえ返せば、あとは使うConcrete Iteratorを用途にあわせて自由に選べたり、いろいろいじれる(?) ・Concrete Itteratorは走査方法で、昇順のそれや、降順のそれ、とびとびのそれなど事前に作っておいて、Concrete Collectionでどれを使うか選べる。それらの各クラスは完成されてて、不用意にさわってはいけない(?) ・Iterator Interfaceは、いろんな方法がある「走査」の代表のようなもので、Concrete Collectionのiteratorメソッドで返すのはどんなConcrete ItteratorでもこのIterator Interfaceの型にしておけば、Mainクラスなどから使う時、内部の余計なことを気にせずに使える。 ・Collection(Agrigate) Interfaceが何のためにあるか理解できません。どう役に立っているのか分かりません。 ・これは私の経験不足ですが、Interfaceについてあまり利用価値が分かりません。実際、どんな時Interfaceあって良かったと実感されますか? ・Iteratorパターンは、大容量をテキストを一文ずつ取り出すときなど、大きな量の配列などを一気に読むと重いので全部取り出さず使う分だけ取り出したりバックグラウンドで順次読んだりという時に使う。 ・Iteratorパターンを、実際どんな時に使われましたか?また、こういうときに使うべきという具体的な例を挙げてください。 宜しくお願いします。
- ベストアンサー
- Java
補足
autyさん、こんばんは。ご回答ありがとうございます。 なるほど、インタフェースもパッケージ化できるのですね。 もう一つ、質問になるのですが、インタフェースはメソッドの定義のみで、処理は書かないものだと思いますが、 これだとhasNext()やnext()の処理はどこに書いてあるのでしょうか? すいません、分からないことだらけで。。