جاوا
(به انگلیسی: Java) یک زبان برنامهنویسی شئگراست که شرکت سان مایکروسیستمز آن را ابداع کردهاست. زبان جاوا شبیه به ++Cاست اما مدل شیءگرایی آسانتری دارد و از قابلیتهای سطح پایین کمتری پشتیبانی میکند. یکی از قابلیتهای اصلی جاوا این است کهمدیریت حافظه را بطور خودکار انجام میدهد. ضریب اطمینان عملکرد برنامههای نوشتهشده به این زبان بالا است و وابسته به سیستمعاملخاصی نیست، به عبارت دیگر میتوان آن را روی هر رایانه با هر نوع سیستمعاملی اجرا کرد. برنامههای جاوا به صورت کدهای بیتی همگردانی(کامپایل) میشوند. که مانند کد ماشین هستند و به ویژه وابسته به سیستمعامل خاصی نمیباشند.
تاریخچه
در مقایسه با زبانهای دیگر، همچون ++C یا بیسیک یا فورترن، جاوا زبان نسبتاً جدیدتری است. شرکت سان مایکروسیستمز در سال ۱۹۹۱ یک پروژه تحقیقاتی به نام گرین (Green) را آغاز کرد. هدف این پروژه ایجاد زبانی جدید شبیه به ++C بود که نویسنده اصلی آن، جیمز گاسلینگ، آن را بلوط (Oak) نامید. اما بعدها به دلیل برخی مشکلات حقوقی از میان لیستی از کلمات تصادفی نام آن به جاوا تغییر کرد.
پروژه گرین به دلیل مشکلات بازاریابی در شرف لغو شدن بود تا اینکه گسترش وب در سال ۱۹۹۳ باعث نمایش تواناییهای وافر جاوا در این عرصه گشت. اینگونه بود که شرکت سان مایکروسیستمز در مه ۱۹۹۵ جاوا را رسماً به بازار عرضه کرد.
جاوا یک زبان برنامهنویسی است که در ابتدا توسط شرکت sun Microsystems ایجاد شدهاست و در سال 1995 به عنوان مولفه اصلی java platform منتشر شد.این زبان قسمتهای بسیاری از گرامر خود را از C و ++C گرفته اما دارای مدل شیگرایی سادهای است و امکانات سطح پایین کمی دارد. کاربرد جاوا در کامپایل به صورت بایت کد است که قابلیت اجرا روی تمامی ماشینهای شبیهسازی جاوا را داشته باشد صرف نظر از معماری و خصوصیات آن کامپیوتر. اجرای اصلی کامپایلرهای جاوا، ماشینهای پیادهسازی و کتابخانههای آن توسط این شرکت از سال 1995 منتشر شد. در 2007 may این شرکت، نرمافزار رایگان این زبان را فراهم کرد. دیگران هم کاربردهای دیگری از این زبان را منتشر کردند مثل کامپایلر [[]GNU]] برای جاوا.
James Gosling پروژه زبان برنامهنویسی جاوا را در 1991 june آغاز کرد. این زبان در ابتدا Oak، سپس Green و در آخر هم جاوا نامیده شد. gosling قصد داشت یک ماشین مجازی و یک ماشینی به کار برد که شبیه C و ++C باشد. این شرکت نسخهٔ اول جاوا را تحت عنوان Java1.0 در سال 1995 منتشر ساخت. مرورگرهای اصلی وب، به هم پیوستند تا به طور مطمئن ]]java [[applet را بدون صفحات وب اجرا کنند و به این صورت جاوا خیلی زود معروف و محبوب شد. با پیدایش java2، نسخهٔ جدید توانست ترکیبهای جدیدی را برای نوعهای مختلف پلت فرمها ایجاد کند. به عنوان مثال J2EE، باهدف کاربرد برای تشکیلات اقتصادی، و نسخهٔ J2ME برای موبایل منتشر شد. در سال 2006 با هدف بازاریابی، این شرکت نسخهٔ جدید J2 را با نامهای JavaEE ،JavaME و JavaSE منتشر کرد. در سال 1997 شرکت سان میکروسیستمز،ISO/IEC JTC1 standards body و Ecma International را به فرمول جاوا تغییر داد. شرکت sun بسیاری از کاربردهای جاوایش را بدون هیچ هزینهای فراهم آورد. شرکت sun با فروش مجوز برای بعضی از کاربردهای خاصش مثل Java Enterprise System درآمدی را بدست آورد. اولین تمایزی که بین SDK و JRE داد شامل فقدان کامپایلر برای JRE و سرفایلها بود. در 13 نوامبر 2006 شرکت sun نرمافزار جاوا را به صورت رایگان و با مجوز عمومی برای همه منتشر کرد. جاوا یک پلتفرم نرمافزاری است.
اهداف اولیه
- این زبان باید ساده، شیگرا و مشهور باشد.
- مطمئن و بدون خطا باشد.
- وابسته به معماری کامپیوتر نبوده و قابل انتقال باشد.
- باید با کارایی بالا اجرا شود.
- باید به صورت پویا و نخکشیشده باشد.
برنامههای جاوا و اپلتها
جاوا برای نوشتن انواع برنامههای کاربردی مناسب است. با جاوا میتوان انواع برنامههای زیر را نوشت:
- برنامههای تحت وب
- برنامهنویسی سیستمهای کوچک مانند موبایل، پاکت پیسی و ...
- برنامههای کاربردی بزرگ (Enterprise)
- برنامههای رومیزی (Desktop)
- و غیره.
قابلیت خاصی در جاوا وجود دارد بنام اپلت. اپلتها امکانات فراوانی برای نوشتن برنامههای تحت وب در اختیار برنامهنویسان قرار میدهند که دیگر زبانهای برنامهنویسی فاقد آن هستند. البته وجود ماشین مجازی جاوا برای اجرای اپلت لازم است. اپلتها نظیر فناوریActivex شرکت مایکروسافت هستند که برنامهنویسان را قادر میسازد تا امکاناتی را به مرورگر کاربر بیافزایند.البته تفاوت این دو در امنیت میباشد به گونهای که اپلتها بدلیل اینکه در محیطی به نام جعبه شنی اجرا میشوند امن هستند ولی Activexها فاقد چنین امنیتی هستند.
- : هر چقدر زبانهای .net قوی باشند تنها بر روی پلت فرم ویندوز اجرا میشوند و برخی ویندوز را سیستمعامل غیر قابل اعتمادی در برنامه نویسی Enterprise میدانند. ولی جاوا از این نظر انتخابی خوب است.
- : جاوا بر روی پلتفرمهای گوناگونی قابل اجرا است، از ATM و ماشین رختشویی گرفته تا سرورهای سولاریس با قابلیت پشتیبانی از 1024 cpu برای پردازش.
- : جاوا فقط یک زبان نیست و انجمنهایی متشکل از بزرگان صنایع و برنامهنویسان زیادی مشغول به توسعه و ایجاد استانداردهای جدید و به روز هستند.
خط مشی جاوا
یکی از ویژگیهای جاوا قابل حمل بودن آن است. یعنی برنامهٔ نوشته شده به زبان جاوا باید به طور مشابهی در کامپیوترهای مختلف با سختافزارهای متفاوت اجرا شود. و باید این توانایی را داشته باشد که برنامه یک بار نوشته شود، یک بار کامپایل شود و در همه کامپیوترها اجرا گردد. به این صورت که کد کامپایل شدهٔ جاوا را ذخیره میکند، اما نه بهصورت کد ماشین بلکه بهصورت بایت کد جاوا. دستورالعملها شبیه کد ماشین هستند، اما با ماشینهای مجازی که به طور خاص برای سختافزارهای مختلف نوشته شدهاند، اجرا میشوند. در نهایت کاربر از JRE نصب شده روی ماشین خود یا مرورگر وب استفاده میکند. کتابخانههای استاندارد یک راه عمومی برای دسترسی به ویژگیهای خاص فراهم میکنند. مانند گرافیک، نخکشی و شبکه. در بعضی از نسخههای JVM بایت کدها میتوانند قبل و در زمان اجرای برنامه به کدهای محلی کامپایل شوند. فایدهٔ اصلی استفاده از بایت کد، قسمت کردن است. اما ترجمهٔ کلی یعنی برنامههای ترجمه شده تقریباً همیشه کندتر از برنامههای کامپایل شدهٔ محلی اجرا میشوند. این شکاف میتواند با چند تکنیک خوشبینانه که در کاربردهای JVM قبلی معرفی شد، کم شود. یکی از این تکنیکها JIT است که بایت کد جاوا را به کد محلی ترجمه کرده و سپس آن را پنهان میکند. در نتیجه برنامه خیلی سریعتر نسبت به کدهای ترجمه شدهٔ خالص شروع و اجرا میشود. بیشتر VMهای پیشرفته، بهصورت کامپایل مجدد پویا، در آنالیز VM، رفتار برنامهٔ اجرا شده و کامپایل مجدد انتخاب شده و بهینهسازی قسمتهای برنامه، استفاده میشوند. کامپایل مجدد پویا میتواند کامپایل ایستا را بهینهسازی کند. زیرا میتواند قسمت hot spot برنامه و گاهی حلقههای داخلی که ممکن است زمان اجرای برنامه را افزایش دهند را تشخیص دهد. کامپایل JIT و کامپایل مجدد پویا به برنامههای جاوا اجازه میدهد که سرعت اجرای کدهای محلی بدون از دست دادن قابلیت انتقال افزایش پیدا کند.
تکنیک بعدی به عنوان کامپایل ایستا شناخته شده است. که کامپایل مستقیم به کدهای محلی است مانند بسیاری از کامپایلرهای قدیمی. کامپایلر ایستای جاوا، بایت کدها را به کدهای شی محلی ترجمه میکند.
کارایی جاوا نسبت به نسخههای اولیه بیشتر شد. در تعدادی از تستها نشان داده شد که کارایی کامپایلرJIT کاملاََ مشابه کامپایلر محلی شد.عملکرد کامپایلرها لزوماَ کارایی کدهای کامپایل شده را نشان نمیدهند.یکی از پیشرفتهای بی نظیر در در زمان اجرای ماشین این بود که خطاها ماشین را دچار اشکال نمیکردند.علاوه بر این در زمان اجرای ماشینی مانند جاوا وسایلی وجود دارد که به زمان اجرای ماشین متصل شده و هر زمانی که یک استثنا رخ میدهد،اطلاعات اشکال زدایی که در حافظه وجود دارد ،ثبت میکنند.
پیاده سازی
شرکت سان میکروسیستم مجوز رسمی برای پلت فرم استاندارد جاوا را به Microsoft Windows, Linux , و Solaris. داده است. همچنین محیطهای دیگری برای دیگر پلت فرمها فراهم آورده است. علامت تجاری مجوز شرکت سان میکروسیستم طوری بود که با همهٔ پیاده سازیها سازگار باشد.به علت اختلاف قانونی که با ماکروسافت پیدا کرد، زمانی که شرکت سان ادعا کرد که پیاده سازی ماکروسافت از RMI یا JNI پشتیبانی نکرده و ویژگیهای خاصی را برای خودش اضافه کردهاست. شرکت سان در سال 1997 پیگیری قانونی کرد و در سال 2001 در توافقی 20 میلیون دلاری برنده شد. در نتیجه کمی بعدماکروسافت جاوا را به ویندوز فرستاد. در نسخهٔ اخیر ویندوز، مرورگر اینترنت نمیتواند از جاوا پلت فرم پشتیبانی کند. شرکت سان و دیگران یک سیستم اجرای جاوای رایگان برای آنها و نسخههای دیگر ویندوز فراهم آوردند.
اداره خودکار حافظه
جاوا از حافظهٔ بازیافتی خودکار برای ادارهٔ حافظه در چرخهٔ زندگی یک شی استفاده میکند. برنامهنویس زمانی که اشیا به وجود میآیند، این حافظه را تعیین میکند. و در زمان اجرا نیز، زمانی که این اشیا در استفادهٔ زیاد طولانی نباشند، برنامه نویس مسئول بازگرداندن این حافظه است. زمانی که مرجعی برای شیهای باقیمانده نیست، شیهای غیر قابل دسترس برای آزاد شدن به صورت خودکار توسط بازیافت حافظه،انتخاب میشوند. اگر برنامهنویس مقداری از حافظه را برای شیهایی که زیاد طولانی نیستند، نگه دارد، چیزهایی شبیه سوراخ حافظه اتفاق میافتند.
یکی از عقایدی که پشت سر مدل ادارهٔ حافظهٔ خودکار جاوا وجود دارد، این است که برنامهنویس هزینهٔ اجرای ادارهٔ دستی حافظه را نادیده میگیرد. در بعضی از زبانها حافظه لازم برای ایجاد یک شی، به صورت ضمنی و بدون شرط، به پشته تخصیص داده میشود. و یا بهطور صریح اختصاص داده شده و از heap بازگردانده میشود. در هر کدام از این راهها، مسئولیت ادارهٔ اقامت حافظه با برنامهنویس است. اگر برنامه شی را برنگرداند، سوراخ حافظه اتفاق میافتد. اگر برنامه تلاش کند به حافظهای را که هماکنون بازگردانده شده، دستیابی پیدا کند یا برگرداند، نتیجه تعریف شده نیست و ممکن است برنامه بیثبات شده و یا تخریب شود. این ممکن است با استفاده از اشارهگر مدتی باقی بماند، اما سرباری و پیچیدگی برنامه زیاد میشود. بازیافت حافظه اجازه دارد در هر زمانی اتفاق بیفتد. بهطوری که این زمانی اتفاق میافتد که برنامه بیکار باشد. اگر حافظهٔ خالی کافی برای تخصیص شی جدید در heap وجود نداشته باشد، ممکن است برنامه برای چند دقیقه متوقف شود. در جایی که زمان پاسخ یا اجرا مهم باشد، ادارهٔ حافظه و منابع اشیا استفاده میشوند.
جاوا از نوع اشارهگر ریاضی C و ++C پشتیبانی نمیکند. در جایی که آدرس اشیا و اعداد صحیح میتوانند به جای هم استفاده شوند. همانند ++C و بعضی زبانهای شیگرای دیگر، متغیرهای نوعهای اولیهٔ جاوا شیگرا نبودند. مقدار نوعهای اولیه، مستقیماً در فیلدها ذخیره میشوند. در فیلدها (برای اشیا) و در پشته (برای توابع)، بیشتر از heap استفاده میشود. این یک تصمیم هوشیارانه توسط طراح جاوا برای اجرا است. به همین دلیل جاوا یک زبان شیگرای خالص به حساب نمیآید.
گرامر
گرامر جاوا خیلی بزرگتر از ++C است. مثل ++C که ترکیب ساختارها و برنامههای شیگرا میباشد، نیست. بلکه زبان جاوا یک زبان شیگرای خالص است. همهٔ کدهایی که داخل کلاس نوشته میشود و همهٔ چیزهایی که داخل شی است، با استثنائات نوع دادهٔ اصلی، که به صورت کلاس نیستند، برای اجرا. جاوا بسیاری از ویژگیها را پشتیبانی میکند. از کلاسها برای سادهتر کردن زبان و جلوگیری از رخداد خطا.
نمونههایی از برنامههای جاوا
در زیر نمونهای از برنامهای که در جاوا نوشته شدهاست آورده شده است. البته برای کامپایل کردن این برنامه بایستی JDK بر روی سیستم مورد نظر نصب شده باشد.
public class Test{ public static void main(String[] args) { System.out.println("HelloWorld!"); } }
برای اجرای برنامه بالا، ابتدا باید یک فایل به نام Test.java ساخته شود و سپس کامپایل شود:
$ javac Test.java
سپس یک فایل خروجی به نام Test.class دریافت میشود. بعد با استفاده از دستور زیر برنامه قابل اجرا است:
$ java Test
[ویرایش]مثالها
برنامه Hello world به این صورت در زبان جاوا میتواند نوشته شود:
// HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
بر طبق قرارداد فایل هل بعد از کلاسهای عمومی نام گذاری میشوند.سپس باید پسوند java را به این صورت اضافه کرد: Hello world.java .این فایل اول باید با استفاده از کامپایلر جاوا به بایت کد کامپایل شود.در نتیجه فایل Hello world.class ایجاد میشود.این فایل قابل اجرا است.فایل جاوا ممکن است فقط یک کلاس عمومی داشته باشد.اما میتواند شامل چندین کلاس با دستیابی عمومی کمتر باشد.
کلاسی که به صورت خصوصی تعریف میشود ممکن است در فایل .java ذخیره شود.کامپایلر برای هر کلاسی که در فایل اصلی تعریف میشود یک کلاس فایل تولید میکند.که نام این کلاس فایل همنام کلاس است با پسوند .class
کلمه کلیدی public (عمومی) برای قسمت هایی که میتوانند از کدهای کلاسهای دیگر صدا زده بشوند،به کار برده میشود. کلمهٔ کلیدی static (ایستا) در جلوی یک تابع ،یک تابع ایستا را که فقط وابسته به کلاس است و نه قابل استفاده برای نمونههایی از کلاس،نشان میدهد.فقط تابعهای ایستا میتوانند توسط اشیا بدون مرجع صدا زده شوند.دادههای ایستا به متغیر هایی که ایستا نیستند،نمی توانند دسترسی داشته باشند.
کلمهٔ کلیدی void (تهی) نشان میدهد که تابع main هیچ مقداری را بر نمی گرداند.اگر برنامهٔ جاوا بخواهد با خطا از برنامه خارج شود،باید system.exit() صدا زده شود. کلمهٔ main یک کلمهٔ کلیدی در زبان جاوا نیست.این نام واقعی تابعی است که جاوا برای فرستادن کنترل به برنامه ،صدا میزند.برنامه جاوا ممکن است شامل چندین کلاس باشد که هر کدام دارای تابع main هستند.
تابع main باید آرایهای از اشیا رشتهای را بپذیرد.تابع main میتواند از آرگومانهای متغیر به شکل public static void main(string…args) استفاده کند که به تابع main اجازه میدهد اعدادی دلخواه از اشیا رشتهای را فراخوانی کند. پارامترstring[]args آرایهای از اشیا رشته ایست که شامل تمام آرگومان هایی که به کلاس فرستاده میشود،است.
چاپ کردن،قسمتی از کتابخانهٔ استاندارد جاوا است.کلاس سیستم یک فیلد استاتیک عمومی به نام out تعریف کرده است.شی out یک نمونه از کلاس printstream است و شامل تعداد زیادی تابع برای چاپ کردن اطلاعات در خروجی استاندارد است.همچنین شامل println(string) برای اضافه کردن یک خط جدید برای رشتهٔ فرستاده شده اضافه میکند.
توزیعهای جاوا
منظور از توزیع جاوا پیادهسازیهای مختلفی است که برای کامپایلر جاوا و همچنین مجموعه کتابخانههای استاندارد زبان جاوا (JDK) وجود دارد. در حال حاضر چهار توزیعکنندهٔ عمده جاوا وجود دارند:
- توزیع کننده اصلی جاوا و مبدع آن میباشد. در اکثر موارد هنگامی که گفته میشود جاوا منظور توزیع سان میباشد.
- این توزیع از سوی موسسه نرمافزارهای آزاد منتشر شده و تقریبا تمامی کتابخانه استاندارد زبان جاوا در آن بدون بهرهگیری از توزیع شرکت سان از اول پیادهسازی شده است. یک کامپایلر به نام GNU Compiler for Java نیز برای کامپایل کردن کدهای جاوا توسط این موسسه ایجاد شدهاست. فلسفه انتخاب نام Classpath برای این پروژه رها کردن تکنولوژی جاوا از وابستگی به علامت تجاری جاوا است بطوریکه هیچ وابستگی یا محدودیتی برای استفاده آن از لحاظ قوانین حقوقی ایجاد نشود و از طرفی به خاطر وجود متغیر محیطی classpath در تمامی محیطهای احرایی برنامههای جاوا، این نام به نوعی تکنولوژی جاوا را برای خواننده القا میکند. کامپایلر GNU توانایی ایجاد کد اجرایی (در مقابل بایت کد توزیع سان) را داراست. لازم به ذکر است که در حال حاضر شرکت سان تقریبا تمامی کدهای JDK را تحت مجوز نرمافزارهای آزاد به صورت متن باز منتشر کرده است و قول انتشار قسمت بسیار کوچکی از این مجموعه را که بهدلیل استفاده از کدهای شرکتهای ثانویه نتوانسته به صورت متن باز منتشر نماید در آینده نزدیک با بازنویسی این کدها داده است.
- این در حقیقت یک توزیع جاوا نیست. بلکه زبانی مشابه میباشد که توسط مایکروسافت و در چارچوب .net ارائه شدهاست. انتظار اینکه در سیستمعاملی غیر از ویندوز هم اجرا شود را نداشته باشید.
- این نیز یک زبان مجزا نیست. بلکه یک برنامه الحاقی میباشد که امکان برنامه نویسی Aspect Oriented را به جاوا میافزاید. این برنامه توسط بنیاد برنامهنویسی جلوهگرا و به صورت کدباز ارائه شدهاست.
کلاسهای خاص
[ویرایش]Applet (برنامههای کاربردی کوچک)
اپلت جاواها برنامههایی هستند که برای کاربردهایی نظیر نمایش در صفحات وب، ایجاد شدهاند. واژهٔ import باعث میشود کامپایلر جاوا کلاسهای javaapplet.Applet وjava.awt.Graphics را به کامپایل برنامه اضافه کند. کلاس Hello کلاس Applet را توسعه میدهد. کلاس اپلت چارچوبی برای کاربردهای گروهی برای نمایش و کنترل چرخهٔ زندگی اپلت، درست میکند. کلاس اپلت یک تابع پنجرهای مجرد است که برنامههای کوچکی با قابلیت نشان دادن واسط گرافیکی برای کاربر را فراهم میکند. کلاس Hello تابع موروثی print(Graphics) را از سوپر کلاس container باطل میکند، برای اینکه کدی که اپلت را نمایش میدهد، فراهم کند. تابع paint شیهای گرافیکی را که شامل زمینههای گرافیکی هستند را می فرستد تا برای نمایش اپلتها استفاده شوند. تابع paint برای نمایش "Hello world!" تابع drawstring(string,int,int) را صدا میزند.
[ویرایش]Servlet
تکنولوژی servlet جاوا گسترس وب را به آسانی فراهم میکند.و شامل مکانیزم هایی برای توسعهٔ تابعی سرور وب و برایدسترسی به سیستمهای تجاری موجود است.servlet قسمتی از javaEE است که به درخواستهای مشتری پاسخ میدهد.
// Hello.java import java.io.*; import javax.servlet.*; public class Hello extends GenericServlet { public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); final PrintWriter pw = response.getWriter(); pw.println("Hello, world!"); pw.close(); } }
واژهٔ import کامپایلر جاوا را هدایت میکند که تمام کلاسهای عمومی و واسطها را از بستههای java.io وjava.servlet را در کامپایل وارد کند.
کلاس Hello کلاس Genericservlet را توسعه میدهد. کلاس Genericservlet واسطی برای سرور فراهم میکند تا درخواست را به servlet بفرستد و چرخهٔ زندگی servlet را کنترل کند.
[ویرایش]JSP
صفحهٔ سرور جاوا قسمتی از سرور javaEE است که پاسخ تولید میکند.نوعاَ صفحات HTML به درخواستهای HTTP از مشتری.JSPها کد جاوا در صفحهٔ HTML را با استفاده از حائل <%and%> اضافه میکنند.JSP به javaservlet کامپایل میشود.
[ویرایش]Swing
Swing کتابخانهٔ واسط گرافیکی کاربر است برای پلت فرم javaSE. ابزاری مشابه پنجره، GTK و motif توسط شرکت sun فراهم شدهاند. این مثال کاربرد swing یک پنجرهٔ واحد همراه با Hello world را ایجاد میکند.
// Hello.java (Java SE 5) import java.awt.BorderLayout; import javax.swing.*; public class Hello extends JFrame { public Hello() { super("hello"); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setLayout(new BorderLayout()); add(new JLabel("Hello, world!")); pack(); } public static void main(String[] args) { new Hello().setVisible(true); } }
اولین جملهٔ import کامپایلر جاوا را هدایت میکندتا کلاس Borderlayout را از بستهٔ java.awt در جاوا به کامپایل اضافه کند. و import دوم همهٔ کلاسهای عمومی و واسط آنها را از بستهٔ javax.swing اضافه میکند. کلاس Hello کلاس Jframe را توسعه میدهد.کلاس Jframe یک پنجره با میلهٔ عنوان و کنترل بستن است.
زمانی که برنامه آغاز میشود،تابع main با JVM صدا زده میشود.این یک نمونهٔ جدید از کلاس Hello را ایجاد کرده و با صدا زدن تابع setvisible(boolean) با مقدار true نمایش داده میشود.
[ویرایش]Generics
قبل از کلاسهای عمومی برای هر متغیر باید یک نوع خاص تعریف میکردیم.به عنوان مثال برای کلاسهای ظرف این امر مشکل بود زیرا را آسانی برای ایجاد یک container وجود نداشت که نوعهای خاصی از اشیا را بپذیرد.کلاسهای عمومی اجازه میدهند نوع زمان کامپایل ،بدون نیاز به ایجاد تعداد زیادی از container ،چک شود.همه آنها کدهای مشابهی دارند.
کتابخانههای کلاس
کتابخانههای جاوا که به صورت بایت کد از کد اصلی کامپایل شده اند،برای پشتیبانی از بعضی از کاربردهای جاوا،توسطJRE منتشر شده است. مثال هایی از این کتابخانهها عبارتند از:
- کتابخانههای مرکزی که شامل:
- کتابخانههایی که برای ساختار داده کاربرد دارند.مثل لیست ها،درخت ها،مجموعه ها،مترجم ها.
- کتابخانهٔ پرداز XML (تجزیه،تغییر شکل،اعتبار)
- کتابخانههای موضعی و بینالمللی
- کتابخانههای انتگرال گیری که امکان تایپ کردن توسط سیستمهای بیرونی را میدهند.
- JDBC برای دستیابی به داده ها
- JNDI برای مراجعه و کشف کردن
- CORBA & RMI برای توسعهٔ کاربرد توزیع کردن
- کتابخانههای واسط کاربر
- AWT (توابع پنجرهای مجرد)که قسمت هایی از GUI را فراهم میکنند.
- کتابخانههای swing که در AWT ساخته شده اند اما کاربرد هایی از AWT widgetry را فراهم میکنند.
- APLها برای ضبط صدا،پردازش و بازنواختی
- کاربردهای وابستهٔ پلت فرم ماشینهای مجازی جاوا
- Plugins که توانایی اجرا شدن در مرورگرهای وب را به اپلت میدهد.
- java web start
- دادن مجوز و مستند سازی
ویرایش
شرکت سان میکروسیستم، 4 نوع ویرایش از کاربردهای مختلف جاوا را ارائه داده است:
- Java card for smartcard
- JavaME
- JavaSE
- JavaEE
ایرادات مطرح شده
مهمترین ایرادی که برنامه نویسان سایر زبانها به زبان جاوا میگیرند سرعت اجرایی پایین جاوا در مقایسه با زبانها سطح پایینتر مانند ++C و اسمبلی است. یک برنامه جاوا به صورت بایت کد میباشد و باید در ماشین مجازی جاوا اجرا گردد. به همین دلیل سرعت اجرای پایینی را در مقابل زبانهای همچون ++C دارد. به صورت دیگر یک برنامه C به طور متوسط تا 10 برابر سریعتر از برنامه مشابه جاوا اجرا میگردد.
جاوا علی رغم شیءگرا بودن در بخشی از قسمتها برخی اصول شیگرایی را نادیده گرفتهاست. از جمله این قسمتها قابلیتبازتابش Reflection میباشد. هدف اصلی بازتابش بررسی (مشاهده) و ایجاد تغییر در برنامه در حال اجرا است ولی این مهم با زیر پا گذاشتن بعضی اصول ممکن شدهاست. برای نمونه با استفاده از بازتابش (و در صورت داشتن مجوز لازم ضمن اجرای برنامه) میتوان به متدهای خصوصی دیگر کلاسها دسترسی داشت.
زبان جاوا در مقابل زبانی مثل ++C ساده تر و یادگیری ان آسانتر است. این آسانتر بودن با حذف بسیاری از موارد که باعث قدرتمندتر بودن زبان ++C بودهاند ایجاد شدهاست. مهمترین این موارد اشاره گرها و وراثت چندگانه بودهاند که در زبان جاوا یافت نمیشوند.
از آنجایی که جاوا زبانی با عدم وابستگی به بستر میباشد پس استفاده از توابع سیستمعامل در برنامه را مستقیماً نمیپذیرد. به همین صورت نمیتوان مستقیماً از واسطهای برنامه نویسی غیر از جاوا در آن استفاده نمود.
پاسخ به ایرادات
سرعت پایین برنامههای جاوا در محیطی که اجرا میشوند ملاک کارایی نبوده زیرا در محیط وب مسئلهای که سرعت را کند میسازد، شبکه بوده و ابتدا باید سربار شبکه را از روی برنامهها برداشت. از طرف دیگر در برنامههای رومیزی هم در JDK 5.0 و 6.0، بهینه سازی بسیاری بوجود آمده که این مسئله باعث شده که در آخرین تست کارایی که انجام شده یک برنامه جاوا در محدودهٔ 0.8 تا 1.3 همان برنامه در ++C کارایی داشته باشد که 1.3 آن مربوط به بخش واسط کاربری و سرعت 0.8 آن مربوط به بسته تخلیه حافظه میشده که هیج الگوریتمی نتوانست از الگوریتم Garbage Collector جاوا پیشی بگیرد. همچنین سال ۱۹۹۹ در مقالهای آقای Lutz Prechelt به این مسئله را ثابت کردند که تجربه برنامهنویسی که برنامهای را مینویسد از انتخاب زبانی که برنامه برروی آن نوشته میشود در کارایی تأثیر بیشتری دارد و این بدان معناست که کارایی یک برنامه را برنامهنویس مشخص میکند و نه زبان برنامهنویسی( ایشان در همان مقاله از زبان جاوا استفاده نمودند تا ذهنیت بد را از بین ببرند)
همچنین در صنعت نرمافزار هزینه اصلی مربوط به ساخت نرمافزار است و نه تهیه سختافزار برای دستیابی به سرعت بیشتر.
حذف اشارهگرها در جاوا به دلیل مشکلاتی بوده که آنها در طول تاریخشان بوجود آوردهاند، اگرچه این موارد در برنامههای سیستمی لازم بهنظر میرسد ولی در محیطهای تحتوب که بستر اصلی جاوا هستند میتوانند اثراتی به مراتب شدیدتر نسبت به آنچه در برنامههای سیستمی دارند داشته باشند و باعث میشود که توجه برنامهنویسان از مسائلی چون کارایی، قابلیت اطمینان و مقیاسپذیری برنامه به تنظیم اشارهگرها معطوف گردد.
وجود وراثت چندگانه در زبانی مانند ++C، باعث ایجاد مشکلات اساسیای میگردید که اکثر برنامهنویسان ++C از آن دوری میکرده و هنوز هم میکنند. ولی قابلیت چندریخته شدن یک کلاس از لحاظ شی گرایی بسیار مهم بوده و بنابراین توجیهی برای وجود وراثت چندگانه را فراهم مینمود. در جاوا با وارد شدن مفهومی به نام واسط برنامهسازی (Interface)، دیگر نیازی به وجود وراثت چندگانه احساس نشد و بنابراین از زبان جاوا حذف گردید. در حال حاضر اکثر طراحان برنامهها حتی به این نتیجه رسیدهاند که وراثت تکی هم باعث ایجاد مشکل بوده و تا آنجایی که میشود باید از Composition استفاده نمود و در تمامی کتابهای طراحی که از سال ۲۰۰۰ به این طرف چاپ شده به آن اشاره نمودهاند.
از ابتدای بوجود آمدن جاوا، کتابخانه JNI - Java Native Interface در آن وجود داشته که قابلیت فراخوانی و دستکاری برنامههایی در ++C و ... را میداده که از نمونههای آن میتوان به Jtwain که یک بستهایست که از کتابخانههای ویندوز برای اسکن عکس استفاده میکند، یا SWT که یک بسته نرمافزاریست که از کتابخانههای ویندوز و لینوکس (برحسب سیستمعامل) برای ساخت واسط کاربری (UI) استفاده میکند، نام برد.
بسیاری از موارد یاد شده به عنوان ایرادات به جاوا به عنوان ایرادات به طراحی زبانهای سطح بالا هستند و نه جاوا.