- 締切済み
import と extends について
ちょっとした疑問なんですが、 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class test extends HttpServlet{ HttpServletクラスを継承していて、 上ではjavax.servlet.http.*;をインポートしていますが、HttpServletクラスは、javax.servlet.http.HttpServletですよね? importでクラスを使うのと、extendsでクラスを扱うのとはどう違うのでしょうか? その違いがわかなくてどうも納得いきません。 どなたか教えていただけないでしょうか? よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- okure_donchan
- ベストアンサー率54% (25/46)
No.1の補足ですが kintaro987さんはimportとextendが一緒だと思われているませんか? importっていうのはNo.1で書きましたが使用クラスの宣言ですので、importで宣言されたクラスを使用するにはインスタンス生成しなければなりません。 extend(継承)ですが親クラスのメソッドをインスタンス生成無しで使用できる(厳密には違いますがわかりやすく言うと)ということですね。 java.io.FileWriter fw = new java.io.FileWriter("C:\test.text"); のことですがimportでjava.ioパッケージを指定しないときの方法ですね。 ///importあり/////////////////////////////////////////// import java.io.*; public class Sample1{ … public void fileWrite{ FileWriter fw = new FileWriter("C:\test.text"); } } ///importなし//////////////////////////////////////////// public class Sample1{ … public void fileWrite{ java.io.FileWriter fw = new java.io.FileWriter("C:\test.text"); } } 上と下が一緒の意味ってことで。
- ranx
- ベストアンサー率24% (357/1463)
「ちょっとした疑問」と言われていますが、Javaの根幹に関わることですね。 それが分かっていないというのは、他人事ながら少々心配です。 まず、importはそのクラス(種類)を使いますよという宣言です。例えば import myclass.Kanrengaisha; class Eigyoubuin { ・・・ } となっていたら、Eigyoubuinという種類に関するアクションに関して、 myclass.Kanrengaishaという種類を使いますということです。 ここでKanrengaishaクラスと言ったら、それは、myclass.Kanrengaishaクラスを意味します。 ただし、Eigyoubuinという種類とKanrengaishaという種類はあくまで別物ですので、 Eigyoubuinという種類ではKanrengaishaという種類に属する道具(メソッド)をそのまま使うことはできません。 Kanrengaishaという種類の人(インスタンス)にお願いしてやってもらうことになります。 これに対し、extendsはクラス(種類)を拡張することを意味します。 class Eigyoubuin extends Shain { ・・・ } となっていたら、Eigyoubuinという種類はShainという種類を拡張したものです。 言い換えると、Shainの一種なのです。 ですので、Shainという種類に属する道具(メソッド)は、許可されていれば(private宣言されていなければ) そのまま使うことができます。 ・・・あまり分かりやすい例えじゃなかったかな。
- okure_donchan
- ベストアンサー率54% (25/46)
importとextendはまったく別物です。 importではクラスを使うのではなくパッケージ(クラス)指定の際に使用します。 この場合のHttpServletをextendしている際に import javax.servlet.http.*;の記述がないとすると public class test extends javax.servlet.http.HttpServlet というように[パッケージ名.クラス名]という指定をしなければなりません。 またインポートの記述がないとクラスを使用する際にパッケージ名の指定までしなければいけません。 例:java.io.FileWriter fw = new java.io.FileWriter("C:\test.text"); java.langパッケージは省略可能です。(StringとかObjectクラスですね。)
補足
どうもありがとうございます。 すみません、okure_donchanの例で、 java.io.FileWriter fw = new java.io.FileWriter("C:\test.text"); とありますが、ioパッケージは継承しないでimportだけで、FilWriterと使えるのはなぜでしょう? HttpServletの話でいけば継承しないとインポートだけではjava.io.FileWriterとなってしまうということになりますよね? こんなバカな私ですが、もう一度教えていただければ幸いです。よろしくお願いします。