classpath
.javaファイルとJava仮想マシンをコンパイルするときのJavaコンパイラのパスと書き込み方法.classファイルは異なります。
ClassPath環境変数を設定せずに、Javacはフルパス.javaファイルをコンパイルできます。例えば:
Javac D:/myjava/helloworld.java
コンパイル後、同じパスディレクトリにクラスファイルを生成します。
デフォルトのJava仮想マシンは、実行するためにClassPath環境変数のパスからクラスファイルを検索する必要があります。 Java仮想マシンの場合、これはクラスファイルではなくクラスです。クラスパスのみがありますが、ファイルシステムパスはありません。 ClassPath環境変数は、Java仮想マシンにClassPathを検索する環境です。仮想マシンは、ClassPathによって定義されたパスを再帰的に検索しないことに注意してください。
つまり、上記のJavaファイルは正しくコンパイルできますが、実行できません。ただし、classpathが「。; d:/myjava/」に設定されている場合、Java仮想マシンは最初に現在のパスから検索し、次にd:/myjavaからクラスファイルを検索します。
したがって、上記のhelloworld.javaがコンパイルされた後、それは直接実行できます。
Java Helloworld
または、d:/myjavaディレクトリに切り替えて、Java Helloworldを実行します。
しかし、以下は間違った方法です。最終的に、newdir.javaは正しくコンパイルできますが、実行中、newdir.classが現在のディレクトリで利用可能かどうか(d:/myjava)を検索し、newdir.classがd:/myjavaで利用可能かどうかを検索しますが、クラスファイルを検索するためにニューディールを検索することはできません。
d:/cd myjavajavac newdir/newdir.javajava newdir
たとえば、d:/myjava/helloの下には、2つのJavaソースファイルがあり、その内容は次のとおりです。
D:/myjava/hello cat.java dog.javacat.java ========================================================================================================== public class dog {public static void main(string [] args){cat c = new cat(); }}犬のクラスは、別のファイルの猫クラスの新しいオブジェクトを直接新しいオブジェクトにします。コンパイルされていても実行されているかどうかにかかわらず、JavacコンパイラはDog.javaをコンパイルするときにClassPathによって指定されたパスからCat.classを自動的に検索するため、これは成功する可能性があります。これは単なる検索方法であり、このクラスは公開クラスなので、コンピレーションは成功します。
要するに、Javacコンパイラがファイルパスを検索することは明らかです。 Java仮想マシンは、クラスファイルを厳密に言えば、クラス、および検索パスを検索し、環境可変クラスパスによって決定され、シーケンスがあります。
詳細については、以下の「パッケージ」を参照してください。
パッケージ
パッケージはクラスのコレクションです。 Javaソースファイルの最初の行(コメント行または空白行を除く)にパッケージキーワードを書き、パッケージ名を指定すると、クラスファイルをパッケージに入れることができます。
たとえば、d:/myjava/cat.javaファイル:
パッケージcom.longshuai.home; public class cat {public static void main(string [] args){system.out.println( "com.longshuai.home.cat"); }}これは、catクラスをcom.longshuai.homeパッケージに置くことを意味します。パッケージは、パッケージの重複した名前が矛盾するのを防ぐために、逆のドメイン名にちなんで命名する必要があります。もちろん、これは必要ありません。
パッケージディレクティブを使用しないソースファイルの場合、コンピレーション中にデフォルトで「ヌードクラス」と見なされます。
Java管理パッケージメソッドは、パッケージ名に対応するディレクトリレベルで管理されます。たとえば、上記のcom.longshuai.homeパッケージは、com/longshuai/home(windows、backslashの場合)の下に配置する必要があります。
Javacは、コンパイル時にパスからファイルを検索します。たとえば、このcat.javaをcom/longshuai/homeの下に置いてください。実行すると、Java Virtual Machineは、クラスPathからロードされるクラスファイルを検索し、クラスをロードする方法は使用します。さまざまなタイプの名前を接続します。したがって、このファイルをコンパイルしてJava仮想マシンでこのファイルを実行する方法は次のとおりです。
Javac com/longshuai/home/cat.javajava com.longshuai.home.cat
java.utilパッケージやjava.util.jarパッケージなど、ネストされたパッケージ間に関係がないことに注意してください。
パッケージとインポートパッケージのクラスを使用します(インポート)
Javaソースファイルでは、使用するクラスをClassPathパスで検索できない限り、他のファイルのクラスを直接使用できません。 ClassPathではない他のクラスを参照するには、ClassPathに追加するか、パッケージにロードしてからパッケージ内のクラスを参照できます。
パッケージのクラスへの参照は、パッケージ名を指定することで参照できます。例えば:
com.longshuai.home.cat c = new com.longshuai.home.cat();
しかし、明らかにこれは不便です。インポートディレクティブを使用して、Javaソースファイルの最初の数行で使用する必要があるパッケージにクラスをインポートできます(ただし、パッケージコマンドの後)。たとえば、猫のクラスをインポートして、クラスを直接使用できるようにします。
com.longshuai.home.cat; cat c = new Cat();
パッケージをインポートするときは、最後にアスタリスク「*」を使用して、インポートされたすべてのクラスを激しく一致させ、「*」はパッケージ名ではなくクラス名と一致するため、最後に「*」のみを使用できます。したがって、「*」記号は、以下など、他のパッケージのクラスを示すために非エンドで使用することはできません。
com.longshuai.home。*; // com.longshuai.homeパッケージですべてのクラスをインポートするcom.longshuai。*; // com.longshuaiパッケージにすべてのクラスをインポートしますが、com.longshuai.homeのクラスはインポートされません。 //これはそれを書くための間違った方法です
インポートされたパッケージに同じ名前のクラスがある場合、同じ名前のクラスを参照すると競合するエラーが発生します。たとえば、java.utilおよびjava.sqlパッケージには日付クラスがあります。
import java.util。*; import java.sql。*; public class test {public static void main(string [] args){date today = new date(); }}編集:
javac test.javateSt.java:11:エラー:日付への参照が不明確な日付= new Date(); ^クラスjava.sql.date in java.sql and class java.util.date in java.utilの両方の試合test.java:11:エラー:日付への参照は今日の日付= new Date(); ^クラスjava.sql.date in java.utilとクラスjava.utilの両方が2つのエラーに一致します
この時点で、日付クラスを明示的にインポートするか、日付クラスを使用するときにパッケージ名を指定することができます。つまり、次の2つの方法が正しいです。
//メソッド1:Java.util。*;インポートJava.sql。*; Import Java.util.date; //方法2:Java.util。*; Import Java.sql。*; public static void main(string [] args){Java.util.date = new Java.util.date(); }}パッケージでクラスをインポートすることに加えて、パッケージのクラス内の静的メソッドと静的変数もできます。静的キーワードを追加して、インポートするものを指定するだけです。例えば:
static java.lang.system。*; static java.lang.system.outをインポートします;
静的インポート方法の後、プレフィックスは省略できます。たとえば、:
static java.lang.system.out; public class className {public static void main(){out.println( "helloworld"); // system.out.println( "helloworld"); }}JARパッケージへのアーカイブパッケージ
Java仮想マシンは、JARパッケージを直接認識できます。 JARコマンドを使用して、パッケージ名に対応するパスをJARパッケージにアーカイブできます。 JARコマンドを使用するための指示は次のとおりです。
jarの使用量:jar {ctxui} [vfmn0pme] [jar -file] [jar -file] [manifest -file] [entry -point] [-c dir] files ... options:-c create create create create create criste criste crives x extract extract extlact指定されたマニフェストファイル-n新しいファイルを作成した後、pack200正規化-eを実行します-e実行可能JARファイル-0ストアのみにバンドルされたスタンドアロンアプリケーションのアプリケーションエントリポイントを指定します。 zipコンプレッション-pを使用しないでください-pは先行 '/'(絶対パス)と ".."(親ディレクトリ)コンポーネント-mを保持します-mは、エントリのマニフェストファイルを作成しません-Iは指定されたJARファイル生成インデックス情報-c指定されたディレクトリに変更され、ファイルがディレクトリである場合は次のファイルを含みます。マニフェストファイル名、アーカイブファイル名、およびエントリポイント名の指定された順序は、「M」、「F」、および「E」タグと同じです。たとえば、現在のディレクトリにあるパッケージA.ClassとB.Classがtest.jarになります。
jar cvf test.jar a.class b.class
JARパッケージのファイルのリストを確認すると、再帰的に表示されます。
jar -tf test.jarmeta-inf/meta-inf/manifest.mfjiecheng.class
たとえば、comディレクトリをd:/dp.jarにアーカイブします。
JAR CVF D:/DP.JAR COM/追加マニフェストは追加されています:com/(input = 0)(output = 0)(ストレージ0%)追加:com/longshuai/(input = 0)(output = 0)(ストレージ0%)追加:com/longshuai/home/(input = 0)(input = 0)(output = 0)(入力0%)追加:com/home/home/home/home/home (output = 291)(圧縮30%)追加:com/longshuai/home/bird.java(input = 136)(output = 100)(圧縮26%)追加:com/longshuai/home/cat.class(input = 417)(output = 289)(output = 289)(30%で圧縮)追加:com/home/home/cat = 994)(134) 26%)
JARファイルを使用すると、ClassPathのパスをJARファイル名に直接設定できます。これにより、クラスファイルを検索すると、JARファイルから直接検索できます。たとえば、classPathは次のように設定されています。
。; d:/myjava; d:/dp.jar
クラス検索メカニズム
Java仮想マシンでクラスファイルを検索する場合、ClassPath環境変数によって指定されたパスに加えて、最初に2つのデフォルトパスが検索されます。JRE/LIB/LIB/EXT、JRE/LIB/EXTのJARファイルで検索されていると思われるクラス。
たとえば、classPathが「。; d:/myjava; d:/myjar.jar」に設定されている場合、com.longshuai.com.catクラスファイルを検索したい場合:
(a)。 JRE/LIBおよびJRE/LIB/EXTの下でJARファイルを最初に検索します。
(b)。現在のディレクトリにcom/longshuai/com/cat.classがあるかどうかについての検索。
(c).search d:/myjava/cat.classを再び;
(d)d:/myjar.jarファイルにcom.longshuai.com.catクラスがあるかどうかを検索します。
クラスがJavaソースファイルで参照されている場合、コンパイル時間に、次の方法を使用して、クラスが合理的かつ有効かどうかを判断します。
(1)。インポートされたパッケージクラスにクラスが含まれているかどうかを検索します。
(2)。デフォルトでインポートされる暗黙的にインポートされたJava.Langパッケージを検索します。
(3)。このクラスが現在のファイルで定義されているかどうか。
(4)。クラスパスの検索ルール((a) - (d))に従ってクラスがその中にあるかどうかを検索します。
継承
クラスの間に「何が何があるのか」の意味論的論理は、クラスの継承を実現できるようにすることができます。たとえば、猫は動物であり、猫は動物のクラスを継承することがありますが、猫のクラスはサブクラスと呼ばれ、動物のクラスは親クラスと呼ばれます。
サブクラスが親クラスを継承した後、サブクラスには、メンバー変数やメソッドを含む親クラスのすべてのメンバーがあります。実際、メモリでは、新しいサブクラスオブジェクトを使用すると、エリアの一部がヒープに分割され、親クラスから継承された属性を保存します。たとえば、新しい親によって得られたエリアA、新しい子供が取得したエリアB、およびエリアAはエリアBにあります。
子オブジェクトに親のオブジェクトが含まれる理由は、新しい子オブジェクトの場合、子オブジェクトが最初に子オブジェクトを構築するために呼び出され、子オブジェクトの構築を開始するとき、親クラスコンストラクターが最初に子オブジェクトを構築するために呼び出されるためです。言い換えれば、子オブジェクトを形成する前に、親オブジェクトが常に最初に形成され、次に子オブジェクトの属性をゆっくりと補完します。特定のコンテンツについては、「継承中に建設方法のスーパー()を書き直す」を参照してください。
サブクラスには、親クラスのメンバーがいるだけでなく、独自の方法や独自のメンバー変数など、独自の独自のメンバーがいます。サブクラスや親クラスのメンバー名が異なることを理解するのは簡単ですが、それらも同じ名前である可能性があります。親クラスにはEAT()メソッドがあり、チャイルドクラスにはEAT()メソッドがあるなど、サブクラスの親クラスから継承された同じ名前の方法がある場合、これはメソッドの書き換えです(以下を参照)。サブクラスのメンバー変数と親クラスのメンバー変数が同じ名前を持っている場合、それらは互いに独立しています。たとえば、親クラスには名前属性があり、サブクラスは名前属性自体も定義します。
クラスを継承するときは、キーワードを拡張します。継承する場合、Javaは1つの親クラスからの継承のみを許可します。
class person {string name; int age; void eat(){system.out.println( "eating ...");} void sleep(){system.out.println( "sleep ...");}} class Students Extends person {int sustentid;学生(int id、string name、int age){this.name = name; this.age = age; this.studentid = id; } void Study(){System.out.println( "Studing ...");}} public class Ensenty {public static void main(string [] args){student s1 = new sudent(1、 "malongshuai"、23); System.out.println(s1.studentid+"、"+s1.name+"、"+s1.age); s1.eat(); s1.sleep(); s1.study(); }}Java ClassPath ClassPathとパッケージに基づいた上記の例の説明は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。