classpath
طريقة المسار والكتابة لمرجم Java عند تجميع ملفات .java والأجهزة الافتراضية Java تنفذ ملفات .class مختلفة.
دون تعيين أي متغيرات بيئة ClassPath ، يمكن لـ Javac تجميع ملفات .java الكاملة. على سبيل المثال:
Javac D: /Myjava/helloworld.java
بعد التجميع ، قم بإنشاء ملفات الفصل في نفس دليل المسار.
يحتاج الجهاز الافتراضي Java الافتراضي إلى البحث عن ملفات الفصل من مسار متغير بيئة ClassPath لتنفيذها. بالنسبة لجهاز Java Virtual Machine ، هذا ليس ملف فئة ، ولكنه فئة. لديها فقط classpaths ، ولكن لا توجد مسارات نظام الملفات. متغير بيئة ClassPath هو البيئة التي توفر Search ClassPath لأجهزة Java الظاهرية. لاحظ أن الجهاز الظاهري لا يبحث بشكل متكرر عن المسارات المحددة بواسطة ClassPath.
وهذا يعني ، يمكن تجميع ملف Java أعلاه بشكل صحيح ، ولكن لا يمكن تنفيذه. ولكن إذا تم تعيين classpath على ".
لذلك بعد تجميع HelloWorld.java أعلاه ، يمكن تنفيذها مباشرة:
جافا هيلوورلد
أو قم بالتبديل إلى دليل D:/myjava وتنفيذ Java HelloWorld.
لكن ما يلي هو الطريقة الخاطئة. في النهاية ، على الرغم من أنه يمكن تجميع Newdir.java بشكل صحيح ، أثناء التنفيذ ، فإنه سيبحث عما إذا كان NewDir.class متاحًا في الدليل الحالي (D:/myjava) ، ثم البحث عن ما إذا كان NewDir.Class متاحًا في D:/myjava ، ولكنه لن يعيد التكرار إلى Subdistory Newdir للبحث عن ملفات الفئة.
D:/CD myjavajavac newdir/newdir.javajava newdir
على سبيل المثال ، تحت d:/myjava/hello ، هناك ملفان مصدر Java ، ومحتوياتهما على النحو التالي:
D:/myjava/hello cat.java dog.javacat.java ========================================================================================================================================== الكلب العام {public static void main (string [] args) {cat c = new cat () ؛ }}فئة الكلاب مباشرة كائنات جديدة لفئة القط في ملف آخر. سواء تم تجميعه أو تشغيله ، يمكن أن يكون هذا ناجحًا ، لأن برنامج التحويل البرمجي Javac سيبحث تلقائيًا عن cat.class من المسار المحدد بواسطة classpath عند تجميع dog.java. هذه مجرد طريقة للبحث ، وهذه الفئة هي فئة عامة ، وبالتالي فإن التجميع ناجح.
باختصار ، يجب أن يكون من الواضح أن برنامج التحويل البرمجي Javac يبحث عن مسارات الملفات ، والتي لا علاقة لها بـ ClassPath المتغير للبيئة. يبحث جهاز Java Virtual عن ملفات الفصول الدراسية ، والمعنى الدقيق للكلمة ، والفئات ، ومسار البحث يتم تحديده بواسطة ClassPath المتغير البيئي وله تسلسل.
لمزيد من أوصاف classpath ، راجع "الحزمة" أدناه.
طَرد
الحزم هي مجموعات من الفصول. اكتب الكلمة الرئيسية الحزمة على السطر الأول من ملف مصدر Java (باستثناء خطوط التعليق أو الأسطر الفارغة) وقم بإعطاء اسم الحزمة ، يمكنك وضع ملف الفصل في الحزمة.
على سبيل المثال ، ملف d: /myjava/cat.java:
package com.longshuai.home ؛ public class cat {public static void main (string [] args) {system.out.println ("com.longshuai.home.cat") ؛ }}هذا يعني وضع فئة القط في حزمة com.longshuai.home. يجب تسمية الحزم على اسم المجال العكسي لمنع حزمة الأسماء المكررة من التعارض ، بالطبع ، هذا ليس ضروريًا.
بالنسبة للملفات المصدر التي لا تستخدم توجيهات الحزمة ، سيتم اعتبار الفئات الموجودة داخلها "فئات عارية" افتراضيًا أثناء التجميع.
تتم إدارة طريقة حزمة إدارة Java على مستوى الدليل المقابل لاسم الحزمة. على سبيل المثال ، يجب وضع حزمة com.longshuai.home أعلاه تحت com/longshuai/home (إذا كانت النوافذ ، backslash) ، أي com/longshuai/home/cat.class.
يبحث Javac عن الملفات من المسارات في وقت الترجمة. على سبيل المثال ، ضع هذا cat.java تحت com/longshuai/home. عند التنفيذ ، يبحث جهاز Java Virtual عن ملف الفئة الذي سيتم تحميله من ClassPath ، والطريقة لتحميل الفصل هو استخدام ". لتوصيل أنواع مختلفة من الأسماء. لذلك ، فإن طرق تجميع هذا الملف وتنفيذ هذا الملف بواسطة الجهاز الظاهري Java هي:
Javac com/longshuai/home/cat.javajava com.longshuai.home.cat
لاحظ أنه لا توجد علاقة بين الحزم المتداخلة ، مثل Java.Util Package و Java.Util.jar لا تملك أي تبعيات.
استخدم الفئات في الحزمة والاستيراد (استيراد)
في ملف مصدر Java ، لا يمكن استخدام فئات في ملفات أخرى مباشرة ، ما لم يكن يمكن البحث في الفئة التي تريد استخدامها بواسطة مسار ClassPath. للرجوع إلى فئات أخرى ليست ClassPath ، يمكنك فقط إضافتها إلى ClassPath أو تحميلها في الحزم ثم الرجوع إلى الفئات الموجودة في الحزمة.
يمكن الرجوع إلى المراجع إلى الفصل في الحزمة من خلال تحديد اسم الحزمة. على سبيل المثال:
com.longshuai.home.cat c = new com.longshuai.home.cat () ؛
ولكن من الواضح أن هذا غير مريح. يمكنك استخدام توجيه الاستيراد لاستيراد الفئات الموجودة في الحزمة التي تحتاج إلى استخدامها في الأسطر القليلة الأولى من ملف Java Source (ولكن بعد أمر الحزمة). على سبيل المثال ، استيراد فئة Cat ، بحيث يمكنك استخدام الفصل مباشرة:
استيراد com.longshuai.home.cat ؛ cat c = new cat () ؛
عند استيراد الحزم ، يمكنك استخدام النجمة "*" في النهاية لتطابق جميع الفئات المستوردة بشكل كبير ، واستخدام فقط "*" في النهاية ، لأن "*" يطابق اسم الفصل ، وليس اسم الحزمة. لذلك ، لا يمكن استخدام الرمز "*" في غير الإشارة إلى فئات في حزم أخرى ، مثل:
استيراد com.longshuai.home.*؛ // استيراد جميع الفئات في حزمة com.longshuai.home استيراد com.longshuai.*؛ // استيراد جميع الفئات في حزمة com.longshuai ، ولكن لن يتم استيراد الفصول في com.longshuai.home ، // على الرغم من وجود تعشيش بين المستويات ، فإن هذه الحزم لا تحتوي على علاقة com.*.*؛ // هذه هي الطريقة الخاطئة لكتابتها
إذا كان هناك فئة تحمل نفس الاسم في الحزمة المستوردة ، فسيحدث خطأ متضارب عند الإشارة إلى الفصل بنفس الاسم. على سبيل المثال ، هناك فئات تاريخ في حزم java.util و java.sql.
استيراد java.util.*؛ استيراد java.sql.*؛ اختبار الفئة العامة {public static void main (string [] args) {date today = new date () ؛ }}التجميع:
javac test.javatest.java:11: خطأ: المرجع إلى التاريخ غير واضح اليوم = تاريخ جديد () ؛ ^ الفئة java.sql.date في java.sql و class java.util.date في java.util على حد سواء match test.java:11: خطأ: المرجع إلى التاريخ هو تاريخ غير واضح اليوم = تاريخ جديد () ؛ ^ الفئة java.sql.date في java.util و class java.util كلاهما تطابق 2 أخطاء
في هذا الوقت ، يمكنك استيراد فئة التاريخ صراحة ، أو تحديد اسم الحزمة عند استخدام فئة التاريخ. وهذا يعني أن الطريقتين التاليتين صحيتين:
// الطريقة 1: استيراد java.util.*؛ استيراد java.sql.*؛ استيراد java.util.date ؛ // الطريقة 2: استيراد java.util.*؛ استيراد java.sql. }}
بالإضافة إلى استيراد الفئات في الحزم ، يمكنك أيضًا أن تكون أساليب ثابتة ومتغيرات ثابتة في الفئات في الحزم. فقط أضف الكلمة الرئيسية الثابتة وحدد ما يجب استيراده. على سبيل المثال:
استيراد java.lang.system.*؛ استيراد java.lang.system
بعد طرق الاستيراد الثابتة ، يمكن حذف البادئة ، على سبيل المثال:
استيراد java.lang.system.out ؛ الطبقة العامة classname {public static void main () {out.println ("HelloWorld") ؛ // تعادل system.out.println ("helloworld") ؛ }}حزمة أرشيف في حزمة جرة
يمكن لجهاز Java Virtual التعرف مباشرة على حزمة JAR. يمكنك أرشفة المسار المقابل لاسم الحزمة في حزمة JAR باستخدام أمر JAR. تعليمات استخدام الأمر جرة هي كما يلي:
استخدام الجرة: jar {ctxui} [vfmn0pme] [Jar -file] [ملفات التوصيف] [نقطة الدخول] [-c dir] ملفات ... خيارات: -c إنشاء ملف جديد -قم بإدراج دليل Archive -f في ملف Archive - ملف واضح -n بعد إنشاء ملف جديد ، قم بإجراء تطبيع Pack200 -e حدد نقطة إدخال التطبيق للتطبيق المستقل المجمع إلى ملف جرة قابل للتنفيذ -0 فقط ؛ لا تستخدم أي ضغط مضغوط -P الاحتفاظ بالبرائدة "/" (المسار المطلق) و ".." .. (الدليل الأصل) -لا يقوم بإنشاء ملف البيان للإدخالات -I هو معلومات فهرس ملفات جرة محددة -C -تغيير إلى الدليل المحدد ويحتوي على الملفات التالية إذا كان هناك ملف ، يتم معالجته بشكل متكرر. الترتيب المحدد لاسم ملف البيان ، واسم ملف الأرشيف ، واسم نقطة الإدخال هو نفس علامات "M" و "F" و "E".على سبيل المثال ، حزمة A.Class و B.Class في الدليل الحالي في Test.jar:
jar cvf test.jar A.Class B.Class
تحقق من قائمة الملفات الموجودة في حزمة الجرة وسيتم عرضها بشكل متكرر:
jar -tf test.jarmeta-inf/meta-inf/manceest.mfjiecheng.class
على سبيل المثال ، أرشيف دليل com في d: /dp.jar.
تتم إضافة jar cvf d: /dp.jar com/massest المضافة: com/(input = 0) (الإخراج = 0) (التخزين 0 ٪) إضافة: com/longshuai/(الإدخال = 0) (الإخراج = 0) (التخزين 0 ٪) إضافة: com/longshuai/home/input = 0) (outport = 0) (تخزين 0 ٪) (الإخراج = 291) (مضغوط 30 ٪) أضيفت: com/longshuai/home/bird.java (إدخال = 136) (الإخراج = 100) (مضغوط 26 ٪) أضيفت: com/longshuai/home/cat.class (المدخلات = 417) (الإخراج = 289) (مضغوط بنسبة 30 ٪) إضافة: com/longshuai/hom
باستخدام ملف JAR ، يمكنك تعيين مسار ClassPath مباشرة على اسم ملف JAR ، بحيث عند البحث عن ملفات الفصل ، ستبحث مباشرة من ملف JAR. على سبيل المثال ، تم تعيين classpath على:
.;d:/myjava;d:/dp.jar
آلية البحث الفصل
عند البحث عن ملفات الفصل في الأجهزة الافتراضية Java ، بالإضافة إلى المسار المحدد بواسطة متغير بيئة ClassPath ، سيتم البحث في مسارين افتراضيان أولاً: JRE/LIB و JRE/LIB/EXT ، يبدو أنهما تم البحث في ملف JRE/LIB/EXT.
على سبيل المثال ، عندما يتم تعيين classpath على ".
(أ). ابحث أولاً عن ملفات JAR تحت JRE/LIB و JRE/LIB/EXT ؛
(ب). البحث فيما إذا كان هناك com/longshuai/com/cat.class في الدليل الحالي ؛
(C) .Search D: /Myjava/cat.class مرة أخرى ؛
(د). البحث عما إذا كان هناك فئة com.longshuai.com.cat في ملف d: /myjar.jar.
إذا تمت الإشارة إلى فئة في ملف مصدر Java ، في وقت الترجمة ، سيتم استخدام الطرق التالية لتحديد ما إذا كانت الفصل معقولة وصالحة:
(1). ابحث عما إذا كانت فئة الحزمة المستوردة تحتوي على الفصل.
(2). ابحث عن حزمة java.lang المستوردة ضمنيًا ، والتي يتم استيرادها افتراضيًا.
(3). ما إذا كان يتم تعريف هذه الفئة في الملف الحالي.
(4). ابحث عن ما إذا كان الفصل موجودًا وفقًا لقواعد البحث في ClassPath ((A)-(D)).
ورث
يمكن أن ينعكس المنطق الدلالي لـ "ما هو" بين الفصول الدراسية ، بحيث يمكن تحقيق ميراث الطبقات. على سبيل المثال ، القطة هي حيوان ، ثم يمكن للقط أن يرث فئة حيوانية ، بينما تسمى فئة القط فئة فرعية ويسمى فئة الحيوانات فئة الوالدين.
بعد أن ترث الفئة الفرعية فئة الأصل ، تحتوي الفئة الفرعية على جميع أعضاء فئة الأصل ، بما في ذلك متغيرات وأساليب الأعضاء. في الواقع ، في الذاكرة ، عند استخدام كائنات فئة فرعية جديدة ، يتم تقسيم جزء من المنطقة إلى كومة لتخزين سمات الموروثة من الفئة الأصل. على سبيل المثال ، المنطقة A التي حصل عليها الوالد الجديد ، والمنطقة B التي حصل عليها طفل جديد ، والمنطقة A موجودة في المنطقة B.
السبب في أن الكائن الطفل يحتوي على كائن الأصل هو أنه عندما يتم استدعاء الكائن الطفل الجديد أولاً لإنشاء كائن الطفل ، وعند البدء في بناء كائن الطفل ، يتم استدعاء مُنشئ الفئة الأصل أولاً لبناء الكائن الأصل. بمعنى آخر ، قبل تشكيل كائن طفل ، يتم تشكيل الكائن الأصل دائمًا أولاً ، ثم يكمل ببطء السمات في الكائن الطفل. للحصول على محتوى محدد ، راجع "إعادة كتابة Super () لطريقة البناء أثناء الميراث".
ليس لدى الفئة الفرعية أعضاء في فئة الوالدين فحسب ، بل تحتوي أيضًا على أعضاء فريدين خاصين بها ، مثل أساليبها الخاصة ومتغيرات الأعضاء الخاصة بها. من السهل أن نفهم أن أسماء الأعضاء في الفئات الفرعية والفئات الوالدين مختلفة ، لكنها قد تكون أيضًا بنفس الاسم. إذا كانت هناك طرق تحمل نفس الاسم الموروثة من الفئة الأصل في الفئة الفرعية ، مثل الفئة الأصل لديها طريقة EAT () ، كما أن فئة الطفل لديها طريقة EAT () ، فقد يكون هذا إعادة كتابة للطريقة (انظر أدناه). إذا كانت المتغيرات الأعضاء في الفئة الفرعية ومتغيرات الأعضاء في الفئة الأصل لها نفس الاسم ، فهي مستقلة عن بعضها البعض . على سبيل المثال ، تحتوي الفئة الأصل على سمة اسم ، وتعرّف الفئة الفرعية أيضًا سمة الاسم نفسها ، والتي يُسمح بها لأنه يمكن استدعاؤها باستخدام هذا و Super على التوالي.
استخدام تمديد الكلمة الرئيسية عند وراثة الفصول. عند الوراثة ، تسمح Java فقط بالميراث من فئة الوالدين.
فئة شخص {اسم السلسلة ؛ عمري void eat () {system.out.println ("EATE ...") ؛} void sleep () {system.out.println ("sleep ...") ؛}} يمتد طالب الفصل {int studentId ؛ الطالب (int id ، اسم السلسلة ، int age) {this.name = name ؛ this.age = العمر ؛ this.studentId = id ؛ } دراسة باطلة () {system.out.println ("studing ...") ؛}} وراثة الفئة العامة {public static void main (string [] args) {student s1 = new student (1 ، "malongshuai" ، 23) ؛ System.out.println (s1.studentId+"،"+s1.name+"،"+s1.age) ؛ s1.eat () ؛ s1.sleep () ؛ s1.study () ؛ }}المثال أعلاه على أساس Java ClassPath ClassPath والحزمة هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.