Java'yı sıfırdan öğrenin

Yani, Java'da programlamak mı istiyorsunuz? Bu harika ve doğru yere geldiniz. Java 101 serisi temelleri ile başlayan ve üretken bir Java geliştiricisi olmak için bilmeniz gereken tüm temel kavramları kapsayan Java programlama kendinden güdümlü giriş sağlar. Bu seri tekniktir ve ilerledikçe kavramları anlamanıza yardımcı olacak birçok kod örneği içerir. Java'da değil, zaten biraz programlama deneyiminiz olduğunu varsayacağım.

Bu ilk makale Java platformunu tanıtıyor ve üç sürümü arasındaki farkı açıklıyor: Java SE, Java EE ve Java ME. Java uygulamalarının dağıtımında Java sanal makinesinin (JVM) rolünü de öğreneceksiniz. Java programlarını geliştirip çalıştırabilmeniz için sisteminizde bir Java Geliştirme Kiti (JDK) kurmanıza yardımcı olacağım ve sizi tipik bir Java uygulamasının mimarisiyle başlatacağım. Son olarak, basit bir Java uygulamasını nasıl derleyeceğinizi ve çalıştıracağınızı öğreneceksiniz.

Java 12 ve yeni JShell için güncellendi

Bu seri Java 12 için güncellenmiştir ve yeniye hızlı bir giriş içerir jshell: Java öğrenmek ve Java kodunu prototiplemek için etkileşimli bir araç.

indir Kodu alın Bu eğitimdeki örnek uygulamalar için kaynak kodunu indirin. JavaWorld için Jeff Friesen tarafından düzenlendi.

Java nedir?

Java'yı, C ve C ++ 'ya çok benzeyen, ancak kullanımı daha kolay ve daha sağlam programlar oluşturmanıza olanak tanıyan genel amaçlı, nesne yönelimli bir dil olarak düşünebilirsiniz. Ne yazık ki, bu tanım size Java hakkında pek bir fikir vermiyor. 2000 yılında, Sun Microsystems (Java platformunun yaratıcısı) Java'yı şu şekilde tanımladı: 

Java, basit, nesne yönelimli, ağ konusunda bilgili, yorumlanmış, sağlam, güvenli, mimariden bağımsız, taşınabilir, yüksek performanslı, çok iş parçacıklı, dinamik bir bilgisayar dilidir.

Bu tanımların her birini ayrı ayrı ele alalım.

Java basit bir dildir . Java başlangıçta C ve C ++ 'dan sonra modellenmiştir, bazı potansiyel olarak kafa karıştırıcı özellikler çıkarılmıştır. İşaretçiler, çoklu uygulama kalıtımı ve operatör aşırı yükleme, Java'nın parçası olmayan bazı C / C ++ özellikleridir. C / C ++ 'da zorunlu olmayan ancak Java için gerekli olan bir özellik, nesneleri ve dizileri otomatik olarak geri alan bir çöp toplama aracıdır.

Java, nesne yönelimli bir dildir . Java'nın nesne yönelimli odak noktası, geliştiricilerin, dil kısıtlamalarına uymak için bizi sorunu manipüle etmeye zorlamak yerine Java'yı bir sorunu çözmek için uyarlama çalışmalarını sağlar. Bu, C gibi yapılandırılmış bir dilden farklıdır.Örnek olarak, Java, tasarruf hesabı nesnelerine odaklanmanıza izin verirken, C, tasarruf hesabı durumu (böyle bir bakiye) ve davranışlar (para yatırma ve çekme gibi ) hakkında ayrı düşünmenizi gerektirir .

Java, ağ konusunda bilgili bir dildir . Java'nın kapsamlı ağ kitaplığı, HTTP (Köprü Metni Aktarım Protokolü) ve FTP (Dosya Aktarım Protokolü) gibi İletim Kontrol Protokolü / İnternet Protokolü (TCP / IP) ağ protokolleriyle başa çıkmayı kolaylaştırır ve ağ bağlantıları yapma görevini basitleştirir. Ayrıca, Java programları, yerel dosya sisteminden onlara eriştiğinizde olduğu gibi, Tekdüzen Kaynak Konum Belirleyicileri (URL'ler) aracılığıyla bir TCP / IP ağı üzerindeki nesnelere erişebilir.

Java, yorumlanmış bir dildir . Çalışma zamanında, bir Java programı, sanal bir makine (varsayımsal bir platformun yazılım temsilidir) ve ilişkili yürütme ortamı aracılığıyla temel platformda (Windows veya Linux gibi) dolaylı olarak yürütülür. Sanal makine, Java programının bayt kodlarını (talimatlar ve ilişkili veriler) yorumlama yoluyla platforma özgü talimatlara çevirir . Yorum , bir bayt kodu talimatının ne anlama geldiğini bulma ve ardından yürütmek için eşdeğer "korunmuş" platforma özgü talimatları seçme eylemidir. Sanal makine daha sonra bu platforma özgü talimatları yürütür.

Yorumlama, hatalı Java programlarında hata ayıklamayı kolaylaştırır çünkü çalışma zamanında daha fazla derleme zamanı bilgisi mevcuttur. Yorumlama ayrıca bir Java programının parçaları arasındaki bağlantı adımını çalışma zamanına kadar ertelemeyi mümkün kılar ve bu da geliştirmeyi hızlandırır.

Java sağlam bir dildir . Java programları, Blu-ray oynatıcılardan araç navigasyon veya hava kontrol sistemlerine kadar hem tüketici hem de kritik uygulamalarda kullanıldığından güvenilir olmalıdır. Java'nın sağlam olmasına yardımcı olan dil özellikleri arasında bildirimler, derleme zamanında ve çalışma zamanında yinelenen tür denetimi (sürüm uyuşmazlığı sorunlarını önlemek için), otomatik sınır denetimli gerçek diziler ve işaretçilerin atlanması yer alır. (Java dil türlerini, değişmezlerini, değişkenlerini ve daha fazlasını kullanmaya başlamak için "Temel Java dili özellikleri" bölümüne bakın.)

Java'nın sağlamlığının bir başka yönü de, 0'ın yanlış ve sıfır olmayan bir değerin doğru olduğu tamsayı ifadeleri yerine, döngülerin Boole ifadeleri tarafından kontrol edilmesi gerektiğidir. Örneğin, Java while (x) x++;, döngü beklendiği yerde bitmeyebileceği için C tarzı bir döngüye izin vermez . Bunun yerine, açıkça bir Boolean ifadesi sağlamalısınız, örneğin while (x != 10) x++;(bu, döngünün x10'a eşit olana kadar çalışacağı anlamına gelir ).

Java güvenli bir dildir . Java programları, ağa bağlı / dağıtılmış ortamlarda kullanılır. Java programları bir ağın çeşitli platformlarına geçiş yapabildiğinden ve bu platformlarda çalışabildiğinden, bu platformları virüs yayabilecek, kredi kartı bilgilerini çalabilecek veya diğer kötü niyetli eylemleri gerçekleştirebilecek kötü amaçlı kodlardan korumak önemlidir. Sağlamlığı destekleyen Java dili özellikleri (işaretçilerin atlanması gibi), Java sanal alan güvenlik modeli ve açık anahtar şifrelemesi gibi güvenlik özellikleriyle çalışır. Bu özellikler birlikte virüslerin ve diğer tehlikeli kodların şüphesiz bir platformda hasara yol açmasını önler.

Teorik olarak Java güvenlidir. Uygulamada, çeşitli güvenlik açıkları tespit edildi ve istismar edildi. Sonuç olarak, Sun Microsystems ve Oracle şimdi güvenlik güncellemelerini yayınlamaya devam ediyor.

Java, mimariden bağımsız bir dildir . Ağlar, çeşitli mikroişlemciler ve işletim sistemlerine dayalı olarak farklı mimarilere sahip platformları birbirine bağlar. Java'nın platforma özel talimatlar oluşturmasını ve bu talimatların bir ağın parçası olan her tür platform tarafından "anlaşılmasını" bekleyemezsiniz. Bunun yerine Java, her platformun yorumlaması kolay olan (JVM'nin uygulanması yoluyla), platformdan bağımsız bayt kodu talimatları üretir.

Java, taşınabilir bir dildir . Mimari tarafsızlık, taşınabilirliğe katkıda bulunur. Bununla birlikte, Java'nın taşınabilirliğinde platformdan bağımsız bayt kodu talimatlarından daha fazlası vardır. Tam sayı türü boyutlarının değişmemesi gerektiğini unutmayın. Örneğin, 32 bitlik tamsayı türü, 32 bitlik tamsayının nerede işlendiğine bakılmaksızın her zaman imzalanmalı ve 32 bit kaplamalıdır (örneğin, 16 bitlik kayıtları olan bir platform, 32 bitlik kayıtları olan bir platform veya bir platform 64 bitlik kayıtlarla). Java'nın kitaplıkları da taşınabilirliğe katkıda bulunur. Gerektiğinde, Java kodunu platforma özgü yeteneklerle mümkün olan en taşınabilir şekilde bağlayan türler sağlarlar.

Java, yüksek performanslı bir dildir . Yorumlama, genellikle yeterli olandan daha fazla bir performans düzeyi sağlar. Çok yüksek performanslı uygulama senaryoları için Java, yorumlanmış bayt kodu komut dizilerini analiz eden ve platforma özgü talimatlara göre sıklıkla yorumlanan komut dizilerini derleyen tam zamanında derleme kullanır. Bu bayt kodu komut dizilerini yorumlamaya yönelik sonraki girişimler, eşdeğer platforma özgü talimatların yürütülmesine ve performans artışına neden olur.

Java, çok iş parçacıklı bir dildir . Aynı anda birkaç görevi yerine getirmesi gereken programların performansını artırmak için Java, iş parçacıklı yürütme kavramını destekler . Örneğin, bir ağ bağlantısından giriş beklerken Grafik Kullanıcı Arayüzünü (GUI) yöneten bir program, her iki görev için de varsayılan GUI iş parçacığını kullanmak yerine beklemeyi gerçekleştirmek için başka bir iş parçacığı kullanır. Bu, GUI'nin yanıt vermesini sağlar. Java'nın senkronizasyon ilkelleri, iş parçacıklarının verileri bozmadan kendi aralarında güvenli bir şekilde veri iletişimine izin verir. (Java 101 serisinde başka bir yerde tartışılan Java'da iş parçacıklı programlamaya bakın.)

Java dinamik bir dildir . Program kodu ile kitaplıklar arasındaki ara bağlantılar çalışma zamanında dinamik olarak gerçekleştiğinden, bunları açıkça bağlamak gerekli değildir. Sonuç olarak, bir program veya kitaplıklarından biri geliştiğinde (örneğin, bir hata düzeltmesi veya performans iyileştirmesi için), bir geliştiricinin yalnızca güncellenmiş programı veya kitaplığı dağıtması gerekir. Dinamik davranış, bir sürüm değişikliği meydana geldiğinde daha az kodun dağıtılmasına yol açsa da, bu dağıtım ilkesi sürüm çakışmalarına da yol açabilir. Örneğin, bir geliştirici kitaplıktan bir sınıf türünü kaldırır veya yeniden adlandırır. Bir şirket güncellenmiş kitaplığı dağıttığında, sınıf türüne bağlı olan mevcut programlar başarısız olur. Bu sorunu büyük ölçüde azaltmak için, Java bir arayüz türünü destekler, iki taraf arasında bir sözleşme gibidir. (Java 101 serisinde başka yerlerde tartışılan arayüzler, türler ve diğer nesne yönelimli dil özelliklerine bakın.)

Bu tanımın paketini açmak bize Java hakkında çok şey öğretir. En önemlisi, Java'nın hem dil hem de platform olduğunu ortaya koyuyor. Bu öğreticide daha sonra Java platformu bileşenleri - yani Java sanal makinesi ve Java yürütme ortamı - hakkında daha fazla bilgi edineceksiniz.

Java'nın üç sürümü: Java SE, Java EE ve Java ME

Sun Microsystems, Mayıs 1995'te Java 1.0 yazılım geliştirme kitini (JDK) piyasaya sürdü. İlk JDK, masaüstü uygulamaları ve küçük uygulamaları geliştirmek için kullanıldı ve daha sonra Java, kurumsal sunucu ve mobil cihaz programlamasını kapsayacak şekilde gelişti. Tüm gerekli kitaplıkların tek bir JDK'da depolanması, JDK'yı dağıtmak için çok büyük hale getirirdi, çünkü özellikle 1990'larda dağıtım küçük boyutlu CD'ler ve düşük ağ hızları ile sınırlıydı. Çoğu geliştiricinin her son API'ye ihtiyacı olmadığı için (bir masaüstü uygulama geliştiricisinin kurumsal Java API'lerine erişmesi neredeyse hiç gerekmeyecektir), Sun, Java'yı üç ana sürüme ayırdı. Bunlar sonunda Java SE, Java EE ve Java ME olarak bilinmeye başladı:

  • Java Platformu, Standard Edition (Java SE) , istemci tarafı uygulamaları (masaüstlerinde çalışan) ve küçük uygulamaları (web tarayıcılarında çalışan) geliştirmek için Java platformudur. Güvenlik nedeniyle uygulamaların artık resmi olarak desteklenmediğini unutmayın.
  • Java Platform, Enterprise Edition (Java EE ), yalnızca kurumsal odaklı sunucu uygulamaları geliştirmek için kullanılan Java SE üzerine kurulmuş Java platformudur. Sunucu tarafı uygulamalar, apletlere benzeyen ancak istemci yerine sunucuda çalışan Java programları olan Java sunucu uygulamalarını içerir . Servletler Java Servlet API ile uyumludur.
  • Java Platform, Micro Edition (Java ME) da Java SE üzerine inşa edilmiştir. Mobil bilgi cihazlarında çalışan Java programları olan MIDlet'leri ve gömülü cihazlarda çalışan Java programları olan Xlets'i geliştirmek için Java platformudur .

Java SE, Java'nın temel platformudur ve Java 101 serisinin odak noktasıdır. Kod örnekleri, yazılırken Java'nın en son sürümü olan Java 12'yi temel alacaktır.

Java platformu ve JVM

Java hem bir programlama dili hem de derlenmiş Java kodunu çalıştırmak için bir platformdur. Bu platform esas olarak JVM'den oluşur, ancak aynı zamanda JVM'nin temel (yerel) platformda yürütülmesini destekleyen bir yürütme ortamı içerir. JVM, Java kodunu yüklemek, doğrulamak ve çalıştırmak için çeşitli bileşenler içerir. Şekil 1, bir Java programının bu platformda nasıl çalıştığını göstermektedir. 

Jeff Friesen

Diyagramın en üstünde, biri ana sınıf dosyası olarak belirtilen bir dizi program sınıfı dosyası bulunur. Bir Java programı, yüklenecek, doğrulanacak ve çalıştırılacak birinci sınıf dosya olan en azından ana sınıf dosyasından oluşur.

JVM, sınıf yükleyici bileşenine yükleme yetkisi verir. Sınıf yükleyiciler, dosya sistemleri, ağlar ve arşiv dosyaları gibi çeşitli kaynaklardan sınıf dosyaları yükler. JVM'yi sınıf yüklemesinin karmaşıklıklarından yalıtıyorlar.

Yüklenen bir sınıf dosyası bellekte depolanır ve Classsınıftan oluşturulan bir nesne olarak temsil edilir . Bayt kodu doğrulayıcı yüklendikten sonra, geçerli olduklarından ve güvenlikten ödün vermeyeceklerinden emin olmak için çeşitli bayt kodu talimatlarını doğrular.

Sınıf dosyasının bayt kodları geçerli değilse, JVM sona erer. Aksi takdirde, yorumlayıcı bileşeni bayt kodunu her seferinde bir talimatı yorumlar. Yorum, bayt kodu talimatlarını tanımlar ve eşdeğer yerel talimatları yürütür.

Bazı bayt kodu komut dizileri diğerlerinden daha sık yürütülür. Yorumlayıcı bu durumu algıladığında, JVM'nin tam zamanında (JIT) derleyicisi, bayt kodu dizisini daha hızlı yürütme için yerel koda derler.

Yürütme sırasında, yorumlayıcı tipik olarak başka bir sınıf dosyasının bayt kodunu (programa veya bir kitaplığa ait) yürütmek için bir istekle karşılaşır. Bu olduğunda, sınıf yükleyici sınıf dosyasını yükler ve bayt kodu doğrulayıcı, çalıştırılmadan önce yüklenen sınıf dosyasının bayt kodunu doğrular. Ayrıca yürütme sırasında, bayt kodu talimatları JVM'den bir dosya açmasını, ekranda bir şey görüntülemesini, ses çıkarmasını veya yerel platformla işbirliği gerektiren başka bir görevi gerçekleştirmesini isteyebilir. JVM, görevi gerçekleştirmek üzere yerel platformla etkileşim kurmak için Java Yerel Arabirimi (JNI) köprü teknolojisini kullanarak yanıt verir.