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

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

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

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

Q&A

解決済

5回答

14461閲覧

importとextends(imprements)の違い

earnest_gay

総合スコア615

Java

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

0グッド

0クリップ

投稿2016/11/18 16:26

編集2016/11/18 16:31

最近JAVAにも手を出し始めた者です。

importとextends(imprements)は全く同じとまで言いませんが似たようなものだと思ってました。
自分の理解用に検証してみましたがそれは違うというところがありましたら指摘お願いします。


<疑問その1>
import指定すればクラスのメンバ使えるならextendsやimprementsしなくていいじゃん?

<検証その1>
メンバがprotectedとprivateだったらエラーになった。
importだけではpublicしか使えずメンバを隠蔽できない。
なので隠蔽するにはextendsやimprementsをしてメンバには外部からアクセスするしかない。

importの使いどころとしてはCfgSet.javaみたいな感じで
設定値などを羅列してるだけで隠蔽とか関係なしにその初期値を使いたいだけならimportすればいいと思う。


<疑問その2>
importしなくてもextendsすればメンバ使えるからimport指定しなくてもいいじゃん?

<検証その2>
無意識に親クラス作ってて気付かなかったが、
その親クラスが同じパッケージに属してるなら
自動的に認識してくれるので明示的にimportする必要はない。

が、明示的にimportしておいた方が良いだろう。
なぜしておいた方が良いかは知らん。

Importしてないと
Extendsの時も
インスタンス生成時も変数代入時の型にも省略せずに型宣言しないといけないので非常に手間。

というかクラス作った時に勝手に書かれてる。


<疑問その3>
extendsしなくてimportだけすればいいじゃん?

<検証その3>
検証1の通り、隠蔽できん。


<まとめ>
別パッケージのクラスをextendsするならimportもしとく。
しないなら正式パッケージ名称を入力する。

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

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

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

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

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

yohhoy

2016/11/18 16:47

Java入門書の類を読まれたことはありますか?基礎知識のない状態で、適当に試した内容から解釈するのは危険です。
guest

回答5

0

ベストアンサー

**完全な勘違いです。**importとextends,implementsは全く違う話です。

そもそもJavaファイルにおいて、クラス名や型名を宣言する際、本来は**パッケージ名からの完全な名前(完全限定名)**で書かなければなりません、例えばListを宣言する際、ArrayListのインスタンスの生成の際も、

java

1java.util.List<java.lang.String> list = new java.util.ArrayList<java.lang.String>();

の様に書かなければいけません。ただし、同じパッケージのクラスおよびjava.langパッケージに属するクラス(上記のStringクラスも該当)はパッケージ名を省略できます。
importは、そのJavaファイルにおいて、importしたクラスについてはパッケージ名を省略して書くという宣言なのです。いわば、ソーズコード簡略化の宣言です。

extendsやimplementsは、あるクラスを継承・インタフェースを実装し、その機能を拡張したクラスと言う意味です。
上記のListとArrayListもimplementsの関係になっており、ArrayListはListを実装し、Listが持つべきメソッドをすべて実装しているため、List型の変数に代入することができるようになっているのです。
こちらはいわばクラスの構造の問題です。

上記の通り、importとextends,implementsは全く別の話で、同じ俎上に上がること自体、おかしいのです。

###質問者の検証について
全般的に「隠蔽」を勘違いしているように見受けられます。
extendsのときにメンバを隠蔽できないと言うのは、親クラスでpublicで宣言しているメソッドをprivateとかprotectedとかにしようとしたのでしょうか?それでは継承のメリットが台無しになります。
検証2についてはオンデマンドインポート(import java.util.*;のような形)したのでしょうか?
検証でどういうことしているのか推測しかできないので実際にコードを上げてもらいたいですね。

投稿2016/11/18 16:31

編集2016/11/18 17:09
swordone

総合スコア20651

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

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

earnest_gay

2016/11/18 17:19

>>extendsのときにメンバを隠蔽できないと言うのは、親クラスでpublicで宣言しているメソッドをprivateとかprotectedとかにしようとしたのでしょうか? extendsすらしてないです! importだけでの結果です。 extendsしてないのでprivateもprotectedも使えなかったということです! 検証2は追加のimportは何もしないで起動してみました。
swordone

2016/11/18 17:21

ごめんなさい、全く意味がわからないです。何をprivateだのprotectedだのにしたのか、あなたの文面から全く見えてきません。
earnest_gay

2016/11/18 17:30

importは継承とは関係ないことはわかってるのですが extendsせずにimportだけの場合、どういう風にアクセスできるのかの検証でした。 逆にimportせずにextendsだけの場合、何がアクセスできるのかの検証でした。 さらにいうとどんなエラーが起きるのかの検証でもありました。
swordone

2016/11/18 17:32

だから、あなたのその説明ではどういうコードを書いて検証したかが全くわからないのです。 とりあえずそのコードを質問に追記して載せて下さい。
swordone

2016/11/18 18:40

コード書く気が無いなら私が言えることは1つだけ 「もう一回はじめから勉強し直してこい」
guest

0

①importする またはパッケージ名からの完全な名前で宣言しなければ使えない機能

java

1import java.util.Scanner;//importしている 何のためか? 2 3class LP { 4 5public static void main(String [] test){ 6 7Scanner st=new Scanner(System.in);//ここと 8 9int c=st.nextInt();//ここでScannerの機能を使うため 10 11System.out.println(c); 12 13} 14 15}

②extends しなければ使えない機能(Runnableをimplementsしてもできるが、この場合もimportではない)

java

1public class SS2{ 2 3public static void main(String[] args){ 4 5Aa a=new Aa(); 6Bb b=new Bb(); 7 8a.start();//スレッドを用いている部分 下で Threadをextendsする事で使用可能になる 9b.start();//スレッドを用いている部分 下で Threadをextendsする事で使用可能になる 10 11 12} 13 14 15} 16 17 18 19class Aa extends Thread{//スレッド機能を用いるためThreadをextendsしている 20 21public void run(){ 22 23for(int i=0;i<10;i++){ 24 25System.out.println(i); 26 27try{ 28Thread.sleep(1000); 29}catch(Exception e){} 30 31} 32 33 34} 35 36} 37 38class Bb extends Thread{//スレッド機能を用いるためThreadをextendsしている 39public void run(){ 40 41for(int i=0;i<10;i++){ 42 43System.out.println(i); 44try{ 45Thread.sleep(300); 46}catch(Exception e){} 47 48} 49 50} 51}

①の機能を使うためにはimportが必要でextendsだけを(どこかに)使用しても使えないし、
②の機能を使うためにはextends(またはRunnableのimplements)が必要でimportだけを(どこかに)使用しても使えない

これらから分かるようにimportとextendsは全く別の機能であり
それぞれを用いてできる事も別のものになるため
どちらかを用いないと実現できない機能について、使用する時に「しなくていい」事はないように思えます。

投稿2016/11/19 03:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

まず根本的にimportとextendsは別物です。
staticな関数を"使用"したい時はimport、そのクラスの状態を引き継ぐ時にはextendsという感じでいいかと思います。
また、変数の前に付けるpublicはどのクラスからも使用可能、privateは自身のクラスのみから使用可能という意味です。
importはあるクラスの関数を使用することを表すだけで、そのクラスそのものにはならないのでprivateな変数は利用できません。
あと、privateな変数を使うだけならやたらextendsを多用するよりgetterやsetterを用意した方がいいと思います。

投稿2016/11/19 01:48

Kakky7s

総合スコア122

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

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

swordone

2016/11/19 02:05

staticな関数を使用って。また勘違いを生みますよ…
guest

0

importの有無、継承有無、パッケージの在り処、アクセス修飾子。

これらの一部の組み合わせでエラーになるかならないかの観察から「アクセスできるかどうか」について考えたことを述べておられるのですが、その観察結果と導かれた結論に整合性が乏しいように(私には)感じられます。

プログラマーの頭の中には「簡便性」「頑強性」「確実性」等々色々な興味の観点がありますが、「アクセスできるかどうか」と聞いた場合に連想するのは「隠蔽」「可視性」「カプセル化」といった概念であり「頑強性」「確実性」についての観点として捉えます。一方でimportによる完全名の省略は「簡便性」として捉えています。つまりこれらは別の観点のもので同列に論じられて似ているかどうかと言われたとき頓珍漢な印象が残るのです。

投稿2016/11/18 21:00

KSwordOfHaste

総合スコア18394

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

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

0


類似しているところが全く思い浮かばないのですね。

usingは文法上における表記機能(パッケージ名省略)、extendsはオブジェクト指向プログラミングの機能(クラスの継承)のはず。もっとも「運用上において類似した使い方がある」というならば可能性があります(私が存じないだけで実在することなどいくらでもあります)ので教えてください。

投稿2016/11/18 17:02

HogeAnimalLover

総合スコア4830

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

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

earnest_gay

2016/11/18 17:21

似てるというのは継承とかの話は抜きにして、 メンバが使えるか使えないかという基準で似てると言ったのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問