Java - Hızlı Kılavuz
Java programlama dili, ilk olarak James Gosling tarafından başlatılan ve Sun Microsystems'in Java platformunun (Java 1.0 [J2SE]) temel bileşeni olarak piyasaya sürülen Sun Microsystems tarafından geliştirilmiştir.
Java Standard Edition'ın en son sürümü Java SE 8'dir. Java'nın gelişmesi ve yaygın popülerliği ile çeşitli platform türlerine uyacak şekilde birden çok konfigürasyon oluşturulmuştur. Örneğin: Kurumsal Uygulamalar için J2EE, Mobil Uygulamalar için J2ME.
Yeni J2 sürümleri sırasıyla Java SE, Java EE ve Java ME olarak yeniden adlandırıldı. Java garantilidirWrite Once, Run Anywhere.
Java -
Object Oriented- Java'da her şey bir Nesnedir. Java, Object modeline dayandığından kolaylıkla genişletilebilir.
Platform Independent- C ve C ++ dahil diğer birçok programlama dilinden farklı olarak, Java derlendiğinde, platformdan bağımsız bayt kodu yerine platforma özel makinede derlenmez. Bu bayt kodu web üzerinden dağıtılır ve hangi platformda çalıştırılırsa çalıştırılsın Sanal Makine (JVM) tarafından yorumlanır.
Simple- Java, öğrenmesi kolay olacak şekilde tasarlanmıştır. OOP Java'nın temel kavramını anlarsanız, ustalaşması kolay olacaktır.
Secure- Java'nın güvenli özelliği ile virüssüz, kurcalamasız sistemler geliştirmeyi sağlar. Kimlik doğrulama teknikleri, açık anahtarlı şifrelemeye dayanır.
Architecture-neutral - Java derleyici, Java çalışma zamanı sisteminin varlığıyla, derlenen kodu birçok işlemcide yürütülebilir hale getiren, mimariden bağımsız bir nesne dosyası biçimi oluşturur.
Portable- Mimariden bağımsız olması ve spesifikasyonun uygulamaya bağlı özelliklerinin olmaması Java'yı taşınabilir kılar. Java'daki derleyici, bir POSIX alt kümesi olan temiz bir taşınabilirlik sınırı ile ANSI C'de yazılmıştır.
Robust - Java, esas olarak derleme sırasında hata denetimi ve çalışma zamanı denetimi üzerinde durarak hataya açık durumları ortadan kaldırmak için çaba gösterir.
Multithreaded- Java'nın çok iş parçacıklı özelliği ile birçok görevi aynı anda gerçekleştirebilen programlar yazmak mümkündür. Bu tasarım özelliği, geliştiricilerin sorunsuz çalışabilen etkileşimli uygulamalar oluşturmasına olanak tanır.
Interpreted- Java bayt kodu, anında yerel makine talimatlarına çevrilir ve hiçbir yerde depolanmaz. Geliştirme süreci daha hızlı ve analitiktir çünkü bağlantı artımlı ve hafif bir süreçtir.
High Performance - Just-In-Time derleyicilerin kullanımıyla, Java yüksek performans sağlar.
Distributed - Java, internetin dağıtılmış ortamı için tasarlanmıştır.
Dynamic- Java, gelişen bir ortama uyum sağlamak için tasarlandığından C veya C ++ 'dan daha dinamik olarak kabul edilir. Java programları, çalışma zamanında nesnelere erişimi doğrulamak ve çözümlemek için kullanılabilecek çok sayıda çalışma zamanı bilgisi taşıyabilir.
Java tarihi
James Gosling, birçok set üstü kutu projesinden birinde kullanılmak üzere Haziran 1991'de Java dili projesini başlattı. Başlangıçta Gosling'in ofisinin dışında duran bir meşe ağacından sonra 'Meşe' olarak adlandırılan dil, aynı zamanda 'Yeşil' adını aldı ve daha sonra rastgele sözcükler listesinden Java olarak yeniden adlandırıldı.
Sun, ilk genel uygulamayı Java 1.0 olarak 1995 yılında yayımladı. Write Once, Run Anywhere (WORA), popüler platformlarda ücretsiz çalışma süreleri sağlar.
13 Kasım 2006'da Sun, Java'nın çoğunu GNU Genel Kamu Lisansı (GPL) koşulları altında ücretsiz ve açık kaynaklı yazılım olarak yayınladı.
Sun, 8 Mayıs 2007'de, Java'nın telif hakkına sahip olmadığı küçük bir kod parçasının yanı sıra Java'nın tüm çekirdek kodunu ücretsiz ve açık kaynaklı hale getirerek süreci tamamladı.
İhtiyacınız Olacak Araçlar
Bu öğreticide tartışılan örnekleri gerçekleştirmek için, minimum 64 MB RAM (128 MB RAM önerilir) içeren bir Pentium 200-MHz bilgisayara ihtiyacınız olacak.
Ayrıca aşağıdaki yazılımlara da ihtiyacınız olacak -
- Linux 7.1 veya Windows xp / 7/8 işletim sistemi
- Java JDK 8
- Microsoft Not Defteri veya başka bir metin düzenleyici
Bu öğretici, Java kullanarak GUI, ağ oluşturma ve web uygulamaları oluşturmak için gerekli becerileri sağlayacaktır.
Sırada ne var?
Bir sonraki bölüm, Java'yı ve belgelerini nasıl edineceğiniz konusunda size rehberlik edecektir. Son olarak, Java'nın nasıl yükleneceği ve Java uygulamaları geliştirmek için bir ortamın nasıl hazırlanacağı konusunda size talimat verir.
Bu bölümde, Java için uygun bir ortam kurmanın farklı yönlerini tartışacağız.
Yerel Ortam Kurulumu
Hala ortamınızı Java programlama dili için kurmaya istekliyseniz, bu bölüm Java'yı makinenize nasıl indirip kuracağınız konusunda size yol gösterir. Ortamı kurma adımları aşağıdadır.
Java SE, Java İndirme bağlantısından ücretsiz olarak edinilebilir . İşletim sisteminize göre bir sürümü indirebilirsiniz.
Java'yı indirmek için talimatları izleyin ve .exeMakinenize Java yüklemek için. Java'yı makinenize yükledikten sonra, ortam değişkenlerini doğru yükleme dizinlerini gösterecek şekilde ayarlamanız gerekecektir -
Windows için Yolu Ayarlama
Java'yı c: \ Program Files \ java \ jdk dizinine kurduğunuzu varsayarsak -
"Bilgisayarım" ı sağ tıklayın ve "Özellikler" i seçin.
"Gelişmiş" sekmesinin altındaki "Ortam değişkenleri" düğmesini tıklayın.
Şimdi, 'Yol' değişkenini, Java yürütülebilir dosyasının yolunu da içerecek şekilde değiştirin. Örneğin, yol şu anda 'C: \ WINDOWS \ SYSTEM32' olarak ayarlanmışsa, yolunuzu 'C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin' olarak değiştirin.
Linux, UNIX, Solaris, FreeBSD için Yol Ayarlama
PATH ortam değişkeni, Java ikili dosyalarının kurulu olduğu yeri gösterecek şekilde ayarlanmalıdır. Bunu yapmakta sorun yaşıyorsanız, kabuk belgelerinize bakın.
Örneğin, kabuğunuz olarak bash kullanırsanız , aşağıdaki satırı '.bashrc: export PATH = / path / to / java: $ PATH'in sonuna eklersiniz.
Popüler Java Editörleri
Java programlarınızı yazmak için bir metin düzenleyiciye ihtiyacınız olacak. Piyasada daha da karmaşık IDE'ler mevcuttur. Ancak şimdilik aşağıdakilerden birini düşünebilirsiniz -
Notepad - Windows makinesinde, Not Defteri (Bu eğitim için önerilir), TextPad gibi herhangi bir basit metin düzenleyiciyi kullanabilirsiniz.
Netbeans - Açık kaynaklı ve ücretsiz bir Java IDE, buradan indirilebilir https://www.netbeans.org/index.html.
Eclipse - Eclipse açık kaynak topluluğu tarafından geliştirilen ve şu adresten indirilebilen bir Java IDE https://www.eclipse.org/.
Sırada ne var?
Sonraki bölüm size ilk Java programınızı nasıl yazacağınızı ve çalıştıracağınızı ve uygulama geliştirmek için gerekli Java'daki bazı önemli temel sözdizimlerini öğretecek.
Bir Java programını düşündüğümüzde, birbirlerinin yöntemlerini çağırarak iletişim kuran nesnelerin bir koleksiyonu olarak tanımlanabilir. Şimdi kısaca sınıf, nesne, yöntemler ve örnek değişkenlerinin ne anlama geldiğine bakalım.
Object- Nesnelerin durumları ve davranışları vardır. Örnek: Bir köpeğin durumları vardır - rengi, adı, cinsi ve kuyruk sallama, havlama, yemek yeme gibi davranışları. Bir nesne, bir sınıfın bir örneğidir.
Class - Bir sınıf, türünün nesnesinin desteklediği davranışı / durumu tanımlayan bir şablon / plan olarak tanımlanabilir.
Methods- Yöntem temelde bir davranıştır. Bir sınıf birçok yöntem içerebilir. Mantıkların yazıldığı, verilerin manipüle edildiği ve tüm eylemlerin yürütüldüğü yöntemlerdedir.
Instance Variables- Her nesnenin kendine özgü örnek değişkenleri vardır. Bir nesnenin durumu, bu örnek değişkenlerine atanan değerler tarafından oluşturulur.
İlk Java Programı
Kelimeleri yazdıracak basit bir koda bakalım Hello World.
Misal
public class MyFirstJavaProgram {
/* This is my first java program.
* This will print 'Hello World' as the output
*/
public static void main(String []args) {
System.out.println("Hello World"); // prints Hello World
}
}
Dosyayı nasıl kaydedeceğimize, derleyeceğimize ve programı nasıl çalıştıracağımıza bakalım. Lütfen sonraki adımları izleyin -
Not defterini açın ve kodu yukarıdaki gibi ekleyin.
Dosyayı şu şekilde kaydedin: MyFirstJavaProgram.java.
Bir komut istemi penceresi açın ve sınıfı kaydettiğiniz dizine gidin. C: \ olduğunu varsayalım.
'Javac MyFirstJavaProgram.java' yazın ve kodunuzu derlemek için enter tuşuna basın. Kodunuzda hata yoksa, komut istemi sizi sonraki satıra götürür (Varsayım: Yol değişkeni ayarlanmıştır).
Şimdi, programınızı çalıştırmak için 'java MyFirstJavaProgram' yazın.
Pencerede 'Merhaba Dünya' yazısını görebileceksiniz.
Çıktı
C:\> javac MyFirstJavaProgram.java
C:\> java MyFirstJavaProgram
Hello World
Temel Sözdizimi
Java programları hakkında aşağıdaki noktaları akılda tutmak çok önemlidir.
Case Sensitivity - Java büyük / küçük harfe duyarlıdır, bu tanımlayıcı anlamına gelir Hello ve hello Java'da farklı bir anlamı olacaktır.
Class Names- Tüm sınıf isimleri için ilk harf Büyük Harf olmalıdır. Sınıfın bir adını oluşturmak için birkaç kelime kullanılırsa, her bir iç kelimenin ilk harfi Büyük Harf olmalıdır.
Example: sınıf MyFirstJavaClass
Method Names- Tüm yöntem adları Küçük Harf ile başlamalıdır. Yöntemin adını oluşturmak için birkaç kelime kullanılırsa, o zaman her bir iç kelimenin ilk harfi Büyük Harf olmalıdır.
Example: public void myMethodName ()
Program File Name - Program dosyasının adı, sınıf adıyla tam olarak eşleşmelidir.
Dosyayı kaydederken, sınıf adını kullanarak kaydetmelisiniz (Java'nın büyük / küçük harf duyarlı olduğunu unutmayın) ve adın sonuna '.java' eklemelisiniz (dosya adı ve sınıf adı eşleşmezse, programınız derlenmeyecektir. ).
Example:'MyFirstJavaProgram'ın sınıf adı olduğunu varsayın. Ardından dosya 'MyFirstJavaProgram.java' olarak kaydedilmelidir.
public static void main(String args[]) - Java programı işlemesi, her Java programının zorunlu bir parçası olan main () yönteminden başlar.
Java Tanımlayıcıları
Tüm Java bileşenleri ad gerektirir. Sınıflar, değişkenler ve yöntemler için kullanılan isimler deniridentifiers.
Java'da, tanımlayıcılar hakkında hatırlanması gereken birkaç nokta vardır. Bunlar aşağıdaki gibidir -
Tüm tanımlayıcılar bir harf (A'dan Z'ye veya a'dan z'ye), para birimi karakteri ($) veya bir alt çizgi (_) ile başlamalıdır.
İlk karakterden sonra, tanımlayıcılar herhangi bir karakter kombinasyonuna sahip olabilir.
Bir anahtar kelime, tanımlayıcı olarak kullanılamaz.
En önemlisi, tanımlayıcılar büyük / küçük harfe duyarlıdır.
Yasal tanımlayıcı örnekleri: yaş, $ maaş, _value, __1_value.
Yasadışı tanımlayıcı örnekleri: 123abc, -salary.
Java Değiştiricileri
Diğer diller gibi, değiştiriciler kullanarak sınıfları, yöntemleri vb. Değiştirmek mümkündür. İki değiştirici kategorisi vardır -
Access Modifiers - varsayılan, genel, korumalı, özel
Non-access Modifiers - son, soyut, katıfp
Bir sonraki bölümde değiştiriciler hakkında daha fazla ayrıntıya bakacağız.
Java Değişkenleri
Java'daki değişken türleri aşağıdadır -
- Yerel Değişkenler
- Sınıf Değişkenleri (Statik Değişkenler)
- Örnek Değişkenler (Statik Olmayan Değişkenler)
Java Dizileri
Diziler, aynı türden birden çok değişkeni depolayan nesnelerdir. Bununla birlikte, bir dizinin kendisi öbek üzerindeki bir nesnedir. İlerleyen bölümlerde nasıl ilan edeceğimizi, inşa edeceğimizi ve başlatacağımızı inceleyeceğiz.
Java Numaralandırmaları
Numaralandırmalar Java 5.0'da tanıtıldı. Numaralandırmalar, bir değişkeni önceden tanımlanmış birkaç değerden birine sahip olacak şekilde kısıtlar. Bu numaralandırılmış listedeki değerlere numaralandırma adı verilir.
Numaralandırmaların kullanılmasıyla kodunuzdaki hataların sayısını azaltmak mümkündür.
Örneğin, bir taze meyve suyu dükkanı için bir uygulama düşünürsek, cam boyutunu küçük, orta ve büyük olarak sınırlamak mümkün olacaktır. Bu, kimsenin küçük, orta veya büyük dışında herhangi bir boyut sipariş etmesine izin vermemesini sağlar.
Misal
class FreshJuice {
enum FreshJuiceSize{ SMALL, MEDIUM, LARGE }
FreshJuiceSize size;
}
public class FreshJuiceTest {
public static void main(String args[]) {
FreshJuice juice = new FreshJuice();
juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
System.out.println("Size: " + juice.size);
}
}
Yukarıdaki örnek aşağıdaki sonucu verecektir -
Çıktı
Size: MEDIUM
Note- Numaralar kendilerine ait veya bir sınıf içinde ilan edilebilir. Yöntemler, değişkenler, yapıcılar da numaralandırmalar içinde tanımlanabilir.
Java Anahtar Kelimeleri
Aşağıdaki liste, Java'daki ayrılmış sözcükleri göstermektedir. Bu ayrılmış sözcükler, sabit ya da değişken ya da başka herhangi bir tanımlayıcı isim olarak kullanılamaz.
Öz | iddia etmek | Boole | kırmak |
bayt | durum | tutmak | kömür |
sınıf | sabit | devam et | varsayılan |
yapmak | çift | Başka | Sıralama |
genişler | final | en sonunda | yüzen |
için | git | Eğer | uygular |
ithalat | örneği | int | arayüz |
uzun | yerli | yeni | paket |
özel | korumalı | halka açık | dönüş |
kısa | statik | katıfp | Süper |
değiştirmek | senkronize | bu | atmak |
atar | geçici | Deneyin | geçersiz |
uçucu | süre |
Java'da Yorumlar
Java, C ve C ++ 'ya çok benzer tek satırlı ve çok satırlı yorumları destekler. Herhangi bir yorumun içinde bulunan tüm karakterler Java derleyicisi tarafından göz ardı edilir.
Misal
public class MyFirstJavaProgram {
/* This is my first java program.
* This will print 'Hello World' as the output
* This is an example of multi-line comments.
*/
public static void main(String []args) {
// This is an example of single line comment
/* This is also an example of single line comment. */
System.out.println("Hello World");
}
}
Çıktı
Hello World
Boş Satırları Kullanma
Yalnızca beyaz boşluk içeren ve muhtemelen yorum içeren bir satır boş satır olarak bilinir ve Java bunu tamamen yok sayar.
Miras
Java'da sınıflar, sınıflardan türetilebilir. Temel olarak, yeni bir sınıf oluşturmanız gerekiyorsa ve burada zaten ihtiyaç duyduğunuz kodun bir kısmına sahip bir sınıf varsa, yeni sınıfınızı mevcut koddan türetmeniz mümkündür.
Bu kavram, kodu yeni bir sınıfta yeniden yazmak zorunda kalmadan mevcut sınıfın alanlarını ve yöntemlerini yeniden kullanmanıza olanak tanır. Bu senaryoda, mevcut sınıfasuperclass ve türetilen sınıfa subclass.
Arayüzler
Java dilinde, bir arayüz, birbirleriyle nasıl iletişim kurulacağına dair nesneler arasındaki bir sözleşme olarak tanımlanabilir. Kalıtım kavramı söz konusu olduğunda arayüzler hayati bir rol oynar.
Bir arabirim yöntemleri tanımlar, bir türetme sınıfı (alt sınıf) kullanmalıdır. Ancak yöntemlerin uygulanması tamamen alt sınıfa bağlıdır.
Sırada ne var?
Sonraki bölüm Java programlamadaki Nesneler ve sınıflar hakkında açıklar. Oturumun sonunda, Java'da nesnelerin ve sınıfların ne olduğu konusunda net bir resim elde edebileceksiniz.
Java, Nesne Tabanlı bir Dildir. Nesneye Yönelik özelliğe sahip bir dil olarak Java, aşağıdaki temel kavramları destekler:
- Polymorphism
- Inheritance
- Encapsulation
- Abstraction
- Classes
- Objects
- Instance
- Method
- İleti geçişi
Bu bölümde, kavramlara - Sınıflar ve Nesneler - bakacağız.
Object- Nesnelerin durumları ve davranışları vardır. Örnek: Bir köpeğin durumları - rengi, adı, cinsi ve davranışları - kuyruğunu sallama, havlama, yeme. Bir nesne, bir sınıfın bir örneğidir.
Class - Bir sınıf, türünün nesnesinin desteklediği davranışı / durumu tanımlayan bir şablon / plan olarak tanımlanabilir.
Java'daki nesneler
Şimdi nesnelerin ne olduğuna derinlemesine bakalım. Gerçek dünyayı düşünürsek, çevremizde birçok nesne bulabiliriz, arabalar, köpekler, insanlar, vb. Bütün bu nesnelerin bir durumu ve bir davranışı vardır.
Bir köpeği düşünürsek, durumu - adı, cinsi, rengi ve davranışı - havlamak, kuyruğunu sallamak, koşmaktır.
Yazılım nesnesini gerçek dünya nesnesiyle karşılaştırırsanız, çok benzer özelliklere sahiptirler.
Yazılım nesnelerinin de bir durumu ve davranışı vardır. Bir yazılım nesnesinin durumu alanlarda saklanır ve davranış, yöntemler aracılığıyla gösterilir.
Dolayısıyla, yazılım geliştirmede yöntemler bir nesnenin dahili durumuna göre çalışır ve nesneden nesneye iletişim yöntemler aracılığıyla yapılır.
Java Sınıfları
Sınıf, tek tek nesnelerin oluşturulduğu bir plandır.
Aşağıda bir sınıf örneği verilmiştir.
Misal
public class Dog {
String breed;
int age;
String color;
void barking() {
}
void hungry() {
}
void sleeping() {
}
}
Bir sınıf, aşağıdaki değişken türlerinden herhangi birini içerebilir.
Local variables- Yöntemler, yapıcılar veya bloklar içinde tanımlanan değişkenlere yerel değişkenler denir. Değişken, yöntem içinde bildirilecek ve başlatılacak ve değişken, yöntem tamamlandığında yok edilecektir.
Instance variables- Örnek değişkenler, bir sınıf içindeki ancak herhangi bir yöntemin dışındaki değişkenlerdir. Bu değişkenler, sınıf başlatıldığında başlatılır. Örnek değişkenlerine, söz konusu sınıfın herhangi bir yöntemi, kurucusu veya bloğunun içinden erişilebilir.
Class variables - Sınıf değişkenleri, herhangi bir yöntemin dışında, bir sınıf içinde static anahtar sözcüğü ile bildirilen değişkenlerdir.
Bir sınıf, çeşitli yöntem türlerinin değerine erişmek için herhangi bir sayıda yönteme sahip olabilir. Yukarıdaki örnekte, havlama (), aç () ve uyku () yöntemlerdir.
Aşağıda, Java Dili sınıflarına bakılırken tartışılması gereken önemli konulardan bazıları verilmiştir.
İnşaatçılar
Sınıflar hakkında tartışırken en önemli alt konulardan biri kurucular olacaktır. Her sınıfın bir kurucusu vardır. Bir sınıf için açık bir şekilde yapıcı yazmazsak, Java derleyicisi o sınıf için varsayılan bir kurucu oluşturur.
Her yeni nesne oluşturulduğunda, en az bir kurucu çağrılacaktır. Oluşturucuların ana kuralı, sınıfla aynı ada sahip olmaları gerektiğidir. Bir sınıfın birden fazla kurucusu olabilir.
Aşağıda bir kurucu örneği verilmiştir -
Misal
public class Puppy {
public Puppy() {
}
public Puppy(String name) {
// This constructor has one parameter, name.
}
}
Java ayrıca , bir sınıfın yalnızca bir örneğini oluşturabileceğiniz Singleton Sınıflarını da destekler .
Note- İki farklı tip kurucumuz var. İnşaatçıları sonraki bölümlerde ayrıntılı olarak tartışacağız.
Bir Nesne Oluşturmak
Daha önce bahsedildiği gibi, bir sınıf nesnelerin planlarını sağlar. Yani temel olarak, bir sınıftan bir nesne oluşturulur. Java'da, yeni anahtar sözcük, yeni nesneler oluşturmak için kullanılır.
Bir sınıftan nesne oluşturmanın üç adımı vardır -
Declaration - Nesne türüne sahip bir değişken adı olan bir değişken bildirimi.
Instantiation - Nesneyi oluşturmak için 'new' anahtar sözcüğü kullanılır.
Initialization- 'new' anahtar kelimesinin ardından bir kurucuya çağrı gelir. Bu çağrı yeni nesneyi başlatır.
Aşağıda bir nesne oluşturmaya bir örnek verilmiştir -
Misal
public class Puppy {
public Puppy(String name) {
// This constructor has one parameter, name.
System.out.println("Passed Name is :" + name );
}
public static void main(String []args) {
// Following statement would create an object myPuppy
Puppy myPuppy = new Puppy( "tommy" );
}
}
Yukarıdaki programı derler ve çalıştırırsak, aşağıdaki sonucu verecektir -
Çıktı
Passed Name is :tommy
Örnek Değişkenlerine ve Yöntemlerine Erişim
Örnek değişkenlere ve yöntemlere, oluşturulan nesneler aracılığıyla erişilir. Bir örnek değişkenine erişmek için tam nitelikli yol aşağıdadır -
/* First create an object */
ObjectReference = new Constructor();
/* Now call a variable as follows */
ObjectReference.variableName;
/* Now you can call a class method as follows */
ObjectReference.MethodName();
Misal
Bu örnek, bir sınıfın örnek değişkenlerine ve yöntemlerine nasıl erişileceğini açıklar.
public class Puppy {
int puppyAge;
public Puppy(String name) {
// This constructor has one parameter, name.
System.out.println("Name chosen is :" + name );
}
public void setAge( int age ) {
puppyAge = age;
}
public int getAge( ) {
System.out.println("Puppy's age is :" + puppyAge );
return puppyAge;
}
public static void main(String []args) {
/* Object creation */
Puppy myPuppy = new Puppy( "tommy" );
/* Call class method to set puppy's age */
myPuppy.setAge( 2 );
/* Call another class method to get puppy's age */
myPuppy.getAge( );
/* You can access instance variable as follows as well */
System.out.println("Variable Value :" + myPuppy.puppyAge );
}
}
Yukarıdaki programı derler ve çalıştırırsak, aşağıdaki sonucu verecektir -
Çıktı
Name chosen is :tommy
Puppy's age is :2
Variable Value :2
Kaynak Dosya Bildirimi Kuralları
Bu bölümün son kısmı olarak, şimdi kaynak dosya bildirim kurallarına bakalım. Bu kurallar, bir kaynak dosyada sınıfları, içe aktarma ifadelerini ve paket ifadelerini bildirirken önemlidir .
Kaynak dosya başına yalnızca bir genel sınıf olabilir.
Bir kaynak dosyada birden çok genel olmayan sınıf olabilir.
Public sınıf adı, kaynak dosyanın adı da olmalıdır ve eklenmesi gereken .javasonunda. Örneğin: sınıf adı genel sınıf Employee {} ise kaynak dosya Employee.java olarak olmalıdır.
Sınıf bir paket içinde tanımlanmışsa, paket ifadesi kaynak dosyadaki ilk ifade olmalıdır.
İthalat ifadeleri varsa, paket ifadesi ile sınıf bildirimi arasına yazılmalıdır. Paket deyimi yoksa, kaynak dosyadaki ilk satır import deyimi olmalıdır.
İçe aktarma ve paket deyimleri, kaynak dosyada bulunan tüm sınıfları ifade eder. Kaynak dosyadaki farklı sınıflara farklı içe aktarma ve / veya paket ifadeleri bildirmek mümkün değildir.
Sınıfların çeşitli erişim seviyeleri vardır ve farklı sınıf türleri vardır; soyut sınıflar, final sınıfları, vb. Tüm bunları erişim değiştiriciler bölümünde açıklayacağız.
Yukarıda belirtilen sınıf türlerinin yanı sıra, Java'da İç sınıflar ve Anonim sınıflar adı verilen bazı özel sınıflar da vardır.
Java Paketi
Basit bir deyişle, sınıfları ve arayüzleri kategorize etmenin bir yoludur. Java'da uygulamalar geliştirirken, yüzlerce sınıf ve arayüz yazılacak, bu nedenle bu sınıfları kategorize etmek bir zorunluluktur ve hayatı çok daha kolaylaştırır.
İçe Aktarım İfadeleri
Java'da, paketi ve sınıf adını içeren tam nitelikli bir ad verilirse, derleyici kaynak kodunu veya sınıfları kolayca bulabilir. Import ifadesi, derleyicinin söz konusu sınıfı bulması için uygun konumu vermenin bir yoludur.
Örneğin, aşağıdaki satır derleyiciden java_installation / java / io dizininde bulunan tüm sınıfları yüklemesini ister -
import java.io.*;
Basit Bir Örnek Olay İncelemesi
Örnek olay incelememiz için iki sınıf oluşturacağız. Bunlar Çalışan ve Çalışan Testi'dir.
Önce not defterini açın ve aşağıdaki kodu ekleyin. Bunun Employee sınıfı olduğunu ve sınıfın genel bir sınıf olduğunu unutmayın. Şimdi, bu kaynak dosyayı Employee.java adıyla kaydedin.
Employee sınıfının dört örnek değişkeni vardır - ad, yaş, atama ve maaş. Sınıf, bir parametre alan, açıkça tanımlanmış bir kurucuya sahiptir.
Misal
import java.io.*;
public class Employee {
String name;
int age;
String designation;
double salary;
// This is the constructor of the class Employee
public Employee(String name) {
this.name = name;
}
// Assign the age of the Employee to the variable age.
public void empAge(int empAge) {
age = empAge;
}
/* Assign the designation to the variable designation.*/
public void empDesignation(String empDesig) {
designation = empDesig;
}
/* Assign the salary to the variable salary.*/
public void empSalary(double empSalary) {
salary = empSalary;
}
/* Print the Employee details */
public void printEmployee() {
System.out.println("Name:"+ name );
System.out.println("Age:" + age );
System.out.println("Designation:" + designation );
System.out.println("Salary:" + salary);
}
}
Bu eğiticide daha önce bahsedildiği gibi, işlem ana yöntemden başlar. Bu nedenle, bu Employee sınıfını çalıştırabilmemiz için bir ana metot olmalı ve nesneler oluşturulmalıdır. Bu görevler için ayrı bir sınıf oluşturacağız.
Aşağıda, Employee sınıfının iki örneğini oluşturan ve her değişken için değer atamak üzere her nesnenin yöntemlerini çağıran EmployeeTest sınıfı yer almaktadır.
Aşağıdaki kodu EmployeeTest.java dosyasına kaydedin.
import java.io.*;
public class EmployeeTest {
public static void main(String args[]) {
/* Create two objects using constructor */
Employee empOne = new Employee("James Smith");
Employee empTwo = new Employee("Mary Anne");
// Invoking methods for each object created
empOne.empAge(26);
empOne.empDesignation("Senior Software Engineer");
empOne.empSalary(1000);
empOne.printEmployee();
empTwo.empAge(21);
empTwo.empDesignation("Software Engineer");
empTwo.empSalary(500);
empTwo.printEmployee();
}
}
Şimdi, her iki sınıfı da derleyin ve ardından sonucu aşağıdaki gibi görmek için EmployeeTest'i çalıştırın -
Çıktı
C:\> javac Employee.java
C:\> javac EmployeeTest.java
C:\> java EmployeeTest
Name:James Smith
Age:26
Designation:Senior Software Engineer
Salary:1000.0
Name:Mary Anne
Age:21
Designation:Software Engineer
Salary:500.0
Sırada ne var?
Bir sonraki oturumda Java'daki temel veri türlerini ve bunların Java uygulamaları geliştirirken nasıl kullanılabileceğini tartışacağız.
Yapıcı, oluşturulduğunda bir nesneyi başlatır. Sınıfıyla aynı ada sahiptir ve sözdizimsel olarak bir yönteme benzer. Ancak, oluşturucuların açık bir dönüş türü yoktur.
Tipik olarak, sınıf tarafından tanımlanan örnek değişkenlerine başlangıç değerleri vermek veya tam olarak oluşturulmuş bir nesne oluşturmak için gereken diğer başlatma prosedürlerini gerçekleştirmek için bir kurucu kullanırsınız.
İster tanımlasanız da tanımlasanız da, tüm sınıfların kurucuları vardır, çünkü Java otomatik olarak tüm üye değişkenleri sıfır olarak başlatan varsayılan bir kurucu sağlar. Bununla birlikte, kendi kurucunuzu tanımladığınızda, varsayılan kurucu artık kullanılmaz.
Sözdizimi
Bir kurucunun sözdizimi aşağıdadır -
class ClassName {
ClassName() {
}
}
Java, iki tür kurucuya izin verir:
- Oluşturucular yok
- Parametreli Oluşturucular
Oluşturucular yok
Ad, Java'nın argüman yok yapıcılarını belirttiği için bunun yerine herhangi bir parametre kabul etmez, bu yapıcılar kullanıldığında bir yöntemin örnek değişkenleri tüm nesneler için sabit değerlerle başlatılır.
Misal
Public class MyClass {
Int num;
MyClass() {
num = 100;
}
}
Nesneleri başlatmak için yapıcıyı aşağıdaki gibi çağırırsınız
public class ConsDemo {
public static void main(String args[]) {
MyClass t1 = new MyClass();
MyClass t2 = new MyClass();
System.out.println(t1.num + " " + t2.num);
}
}
Bu, aşağıdaki sonucu verecektir
100 100
Parametreli Oluşturucular
Çoğu zaman, bir veya daha fazla parametreyi kabul eden bir kurucuya ihtiyacınız olacaktır. Parametreler bir kurucuya, bir yönteme eklendikleri gibi eklenir; bunları yapıcının adından sonra parantez içinde bildirmeniz yeterlidir.
Misal
İşte bir yapıcı kullanan basit bir örnek -
// A simple constructor.
class MyClass {
int x;
// Following is the constructor
MyClass(int i ) {
x = i;
}
}
Yapıcıyı nesneleri başlatmak için aşağıdaki gibi çağırırsınız -
public class ConsDemo {
public static void main(String args[]) {
MyClass t1 = new MyClass( 10 );
MyClass t2 = new MyClass( 20 );
System.out.println(t1.x + " " + t2.x);
}
}
Bu, aşağıdaki sonucu verecektir -
10 20
Değişkenler, değerleri saklamak için ayrılmış bellek konumlarından başka bir şey değildir. Bu, bir değişken oluşturduğunuzda bellekte biraz yer ayırdığınız anlamına gelir.
Bir değişkenin veri türüne bağlı olarak, işletim sistemi belleği ayırır ve ayrılmış bellekte nelerin saklanabileceğine karar verir. Bu nedenle, değişkenlere farklı veri türleri atayarak, bu değişkenlerde tamsayıları, ondalık sayıları veya karakterleri saklayabilirsiniz.
Java'da kullanılabilen iki veri türü vardır -
- İlkel Veri Türleri
- Referans / Nesne Veri Tipleri
İlkel Veri Türleri
Java tarafından desteklenen sekiz ilkel veri türü vardır. İlkel veri türleri, dil tarafından önceden tanımlanır ve bir anahtar sözcükle adlandırılır. Şimdi sekiz ilkel veri türünü ayrıntılı olarak inceleyelim.
bayt
Bayt veri türü, 8 bitlik işaretli ikinin tümleyen tamsayısıdır
Minimum değer -128'dir (-2 ^ 7)
Maksimum değer 127'dir (dahil) (2 ^ 7 -1)
Varsayılan değer 0'dır
Bayt veri türü, bir bayt bir tamsayıdan dört kat daha küçük olduğundan, büyük dizilerde, esas olarak tamsayıların yerine yer kazanmak için kullanılır.
Örnek: bayt a = 100, bayt b = -50
kısa
Kısa veri türü, 16 bitlik işaretli ikinin tümleyen tamsayısıdır
Minimum değer -32.768'dir (-2 ^ 15)
Maksimum değer 32.767'dir (dahil) (2 ^ 15 -1)
Kısa veri türü, belleği bayt veri türü olarak kaydetmek için de kullanılabilir. Kısa bir tam sayıdan 2 kat daha küçüktür
Varsayılan değer 0'dır.
Örnek: kısa s = 10000, kısa r = -20000
int
Int veri türü, 32 bitlik işaretli ikinin tümleyen tamsayısıdır.
Minimum değer - 2.147.483.648 (-2 ^ 31)
Maksimum değer 2.147.483.647 (dahil) (2 ^ 31 -1)
Tamsayı, bellekle ilgili bir endişe olmadıkça, genellikle integral değerler için varsayılan veri türü olarak kullanılır.
Varsayılan değer 0'dır
Örnek: int a = 100000, int b = -200000
uzun
- Uzun veri türü, 64 bitlik işaretli ikinin tümleyen tamsayısıdır
- Minimum değer -9,223,372,036,854,775,808'dir (-2 ^ 63)
- Maksimum değer 9.223.372.036.854.775.807'dir (dahil) (2 ^ 63 -1)
- Bu tür, int'den daha geniş bir aralık gerektiğinde kullanılır
- Varsayılan değer 0L'dir
- Örnek: uzun a = 100000L, uzun b = -200000L
yüzen
Kayan veri türü, tek duyarlıklı 32 bit IEEE 754 kayan noktadır
Float, çoğunlukla büyük kayan nokta sayı dizilerinde bellek tasarrufu yapmak için kullanılır
Varsayılan değer 0.0f'dir
Float veri türü hiçbir zaman para birimi gibi kesin değerler için kullanılmaz
Örnek: float f1 = 234.5f
çift
çift veri türü, çift duyarlıklı 64 bit IEEE 754 kayan noktadır
Bu veri türü genellikle ondalık değerler için varsayılan veri türü olarak kullanılır, genellikle varsayılan seçimdir.
Çift veri türü asla para birimi gibi kesin değerler için kullanılmamalıdır
Varsayılan değer 0.0d
Örnek: çift d1 = 123,4
Boole
- boolean veri türü bir bitlik bilgiyi temsil eder
- Yalnızca iki olası değer vardır: doğru ve yanlış
- Bu veri türü, doğru / yanlış koşullarını izleyen basit bayraklar için kullanılır.
- Varsayılan değer yanlıştır
- Örnek: boolean bir = true
kömür
- char veri türü tek bir 16 bit Unicode karakteridir
- Minimum değer "\ u0000" (veya 0)
- Maksimum değer "\ uffff" (veya 65.535 dahil)
- Char veri türü herhangi bir karakteri saklamak için kullanılır
- Örnek: char letterA = 'A'
Referans Veri Türleri
Referans değişkenler, sınıfların tanımlanmış yapıcıları kullanılarak oluşturulur. Nesnelere erişmek için kullanılırlar. Bu değişkenler, değiştirilemeyen belirli bir tür olarak bildirilir. Örneğin Çalışan, Yavru vb.
Sınıf nesneleri ve çeşitli dizi değişkenleri, referans veri türü altında gelir.
Herhangi bir referans değişkeninin varsayılan değeri boştur.
Bir referans değişkeni, bildirilen türdeki herhangi bir nesneyi veya herhangi bir uyumlu türü belirtmek için kullanılabilir.
Örnek: Hayvan hayvan = yeni Hayvan ("zürafa");
Java Literals
Değişmez bilgi, sabit bir değerin kaynak kodu gösterimidir. Herhangi bir hesaplama yapılmadan doğrudan kodda temsil edilirler.
Değişmezler herhangi bir ilkel tür değişkene atanabilir. Örneğin -
byte a = 68;
char a = 'A';
byte, int, long ve short, ondalık (10 tabanı), onaltılık (16 tabanı) veya sekizlik (8 tabanı) sayı sistemlerinde de ifade edilebilir.
Önek 0, sekizli belirtmek için kullanılır ve 0x öneki, bu sayı sistemleri değişmez değerler için kullanılırken onaltılıyı gösterir. Örneğin -
int decimal = 100;
int octal = 0144;
int hexa = 0x64;
Java'daki dize değişmezleri, diğer dillerin çoğunda olduğu gibi, bir çift çift tırnak arasına bir karakter dizisi eklenerek belirtilir. Dize değişmezlerine örnekler -
Misal
"Hello World"
"two\nlines"
"\"This is in quotes\""
Dize ve char türleri, herhangi bir Unicode karakter içerebilir. Örneğin -
char a = '\u0001';
String a = "\u0001";
Java dili, String ve değişmez karakterler için birkaç özel kaçış dizisini de destekler. Onlar -
Gösterim | Temsil edilen karakter |
---|---|
\ n | Yeni Satır (0x0a) |
\ r | Satır başı (0x0d) |
\ f | Form besleme (0x0c) |
\ b | Geri tuşu (0x08) |
\ s | Boşluk (0x20) |
\ t | sekme |
\ " | Çift tırnak |
\ ' | Tek alıntı |
\\ | ters eğik çizgi |
\ ddd | Sekizli karakter (ddd) |
\ uxxxx | Onaltılık UNICODE karakteri (xxxx) |
Sırada ne var?
Bu bölümde çeşitli veri türleri açıklanmıştır. Sonraki konu, farklı değişken türlerini ve kullanımlarını açıklamaktadır. Bu, Java sınıflarında, arayüzlerinde vb. Nasıl kullanılabilecekleri konusunda size iyi bir anlayış sağlayacaktır.
Bir değişken, programlarımızın değiştirebileceği adlandırılmış depolama alanı sağlar. Java'daki her değişkenin, değişkenin belleğinin boyutunu ve düzenini belirleyen belirli bir türü vardır; o hafızada saklanabilecek değerlerin aralığı; ve değişkene uygulanabilecek işlemler kümesi.
Kullanılmadan önce tüm değişkenleri bildirmelisiniz. Aşağıda, değişken bildiriminin temel şekli verilmiştir -
data type variable [ = value][, variable [ = value] ...] ;
Burada veri türü , Java'nın veri türlerinden biridir ve değişken , değişkenin adıdır. Belirtilen türde birden fazla değişkeni bildirmek için virgülle ayrılmış bir liste kullanabilirsiniz.
Aşağıda, Java'da değişken bildirimi ve başlatma için geçerli örnekler verilmiştir -
Misal
int a, b, c; // Declares three ints, a, b, and c.
int a = 10, b = 10; // Example of initialization
byte B = 22; // initializes a byte type variable B.
double pi = 3.14159; // declares and assigns a value of PI.
char a = 'A'; // the char variable a iis initialized with value 'a'
Bu bölümde, Java Dilinde bulunan çeşitli değişken türleri açıklanacaktır. Java'da üç tür değişken vardır -
- Yerel değişkenler
- Örnek değişkenler
- Sınıf / Statik değişkenler
Yerel Değişkenler
Yerel değişkenler yöntemlerde, yapıcılarda veya bloklarda bildirilir.
Yöntem, yapıcı veya blok girildiğinde yerel değişkenler oluşturulur ve değişken, yöntem, yapıcı veya bloktan çıktığında yok edilir.
Erişim değiştiriciler yerel değişkenler için kullanılamaz.
Yerel değişkenler yalnızca bildirilen yöntem, yapıcı veya blok içinde görülebilir.
Yerel değişkenler, dahili olarak yığın düzeyinde uygulanır.
Yerel değişkenler için varsayılan değer yoktur, bu nedenle yerel değişkenler bildirilmeli ve ilk kullanımdan önce bir başlangıç değeri atanmalıdır.
Misal
Burada yaş yerel bir değişkendir. Bu pupAge () yöntemi içinde tanımlanır ve kapsamı yalnızca bu yöntemle sınırlıdır.
public class Test {
public void pupAge() {
int age = 0;
age = age + 7;
System.out.println("Puppy age is : " + age);
}
public static void main(String args[]) {
Test test = new Test();
test.pupAge();
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Puppy age is: 7
Misal
Aşağıdaki örnek, yaşı başlatmadan kullanır , bu nedenle derleme sırasında bir hata verir.
public class Test {
public void pupAge() {
int age;
age = age + 7;
System.out.println("Puppy age is : " + age);
}
public static void main(String args[]) {
Test test = new Test();
test.pupAge();
}
}
Bu, onu derlerken aşağıdaki hatayı üretecektir -
Çıktı
Test.java:4:variable number might not have been initialized
age = age + 7;
^
1 error
Örnek değişkenler
Örnek değişkenleri bir sınıfta, ancak bir yöntem, yapıcı veya herhangi bir bloğun dışında bildirilir.
Yığın içindeki bir nesne için bir alan tahsis edildiğinde, her bir örnek değişken değeri için bir yuva yaratılır.
Örnek değişkenleri, bir nesne 'yeni' anahtar kelimesinin kullanılmasıyla yaratıldığında oluşturulur ve nesne yok edildiğinde yok edilir.
Örnek değişkenleri, birden fazla yöntem, yapıcı veya blok tarafından veya bir nesnenin durumunun sınıf boyunca mevcut olması gereken temel kısımları tarafından başvurulması gereken değerleri tutar.
Örnek değişkenler, kullanımdan önce veya sonra sınıf düzeyinde bildirilebilir.
Örnek değişkenler için erişim değiştiriciler verilebilir.
Örnek değişkenleri, sınıftaki tüm yöntemler, yapıcılar ve blok için görülebilir. Normalde, bu değişkenlerin özel (erişim seviyesi) yapılması önerilir. Ancak, erişim değiştiricileri kullanılarak bu değişkenler için alt sınıflar için görünürlük verilebilir.
Örnek değişkenlerinin varsayılan değerleri vardır. Sayılar için varsayılan değer 0'dır, Booleans için yanlıştır ve nesne başvuruları için boştur. Değerler, bildirim sırasında veya kurucu içinde atanabilir.
Örnek değişkenlere, sınıf içindeki değişken adı çağrılarak doğrudan erişilebilir. Bununla birlikte, statik yöntemlerde (örnek değişkenlere erişilebilirlik verildiğinde), tam olarak nitelenmiş ad kullanılarak çağrılmalıdırlar. ObjectReference.VariableName .
Misal
import java.io.*;
public class Employee {
// this instance variable is visible for any child class.
public String name;
// salary variable is visible in Employee class only.
private double salary;
// The name variable is assigned in the constructor.
public Employee (String empName) {
name = empName;
}
// The salary variable is assigned a value.
public void setSalary(double empSal) {
salary = empSal;
}
// This method prints the employee details.
public void printEmp() {
System.out.println("name : " + name );
System.out.println("salary :" + salary);
}
public static void main(String args[]) {
Employee empOne = new Employee("Ransika");
empOne.setSalary(1000);
empOne.printEmp();
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
name : Ransika
salary :1000.0
Sınıf / Statik Değişkenler
Statik değişkenler olarak da bilinen sınıf değişkenleri, bir sınıfta, ancak bir yöntem, yapıcı veya bir bloğun dışında statik anahtar sözcükle bildirilir.
Her sınıf değişkeninin, ondan kaç tane nesne oluşturulduğuna bakılmaksızın, her sınıf için yalnızca bir kopyası olacaktır.
Statik değişkenler, sabit olarak bildirilmekten başka nadiren kullanılır. Sabitler, genel / özel, nihai ve statik olarak bildirilen değişkenlerdir. Sabit değişkenler asla başlangıç değerlerinden değişmezler.
Statik değişkenler statik bellekte saklanır. Son olarak bildirilen ve genel veya özel sabitler olarak kullanılandan farklı statik değişkenler kullanmak nadirdir.
Statik değişkenler, program başladığında oluşturulur ve program durduğunda yok edilir.
Görünürlük, örnek değişkenlerine benzer. Bununla birlikte, çoğu statik değişken, sınıfın kullanıcıları için erişilebilir olmaları gerektiğinden genel olarak bildirilir.
Varsayılan değerler, örnek değişkenlerle aynıdır. Sayılar için varsayılan değer 0'dır; Booleans için yanlıştır; ve nesne referansları için boştur. Değerler, bildirim sırasında veya kurucu içinde atanabilir. Ek olarak, değerler özel statik başlatıcı bloklarında atanabilir.
Statik değişkenlere ClassName.VariableName sınıf adıyla çağrı yapılarak erişilebilir .
Sınıf değişkenlerini genel statik son olarak bildirirken, değişken adlarının (sabitler) tümü büyük harftir. Statik değişkenler genel ve nihai değilse, adlandırma sözdizimi, örnek ve yerel değişkenlerle aynıdır.
Misal
import java.io.*;
public class Employee {
// salary variable is a private static variable
private static double salary;
// DEPARTMENT is a constant
public static final String DEPARTMENT = "Development ";
public static void main(String args[]) {
salary = 1000;
System.out.println(DEPARTMENT + "average salary:" + salary);
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Development average salary:1000
Note - Değişkenlere dışarıdan bir sınıftan erişiliyorsa, sabite Çalışan olarak erişilmelidir.
Sırada ne var?
Bu bölümde zaten erişim değiştiricileri (genel ve özel) kullandınız. Bir sonraki bölüm Erişim Değiştiricileri ve Erişim Dışı Değiştiricileri ayrıntılı olarak açıklayacaktır.
Değiştiriciler, anlamlarını değiştirmek için bu tanımlara eklediğiniz anahtar kelimelerdir. Java dili, aşağıdakiler dahil çok çeşitli değiştiricilere sahiptir -
Java Erişim Değiştiricileri
Erişilemeyen Değiştiriciler
Bir değiştirici kullanmak için, anahtar kelimesini bir sınıf, yöntem veya değişken tanımına dahil edersiniz. Değiştirici, aşağıdaki örnekte olduğu gibi, ifadenin geri kalanından önce gelir.
Misal
public class className {
// ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
// body of method
}
Erişim Kontrol Değiştiricileri
Java, sınıflar, değişkenler, yöntemler ve yapıcılar için erişim düzeylerini ayarlamak için bir dizi erişim değiştirici sağlar. Dört erişim seviyesi şunlardır:
- Paket tarafından görülebilir, varsayılan. Değiştiriciye gerek yoktur.
- Yalnızca sınıfa görünür (özel).
- Dünyaya görünür (halka açık).
- Paket ve tüm alt sınıflar (korumalı) tarafından görülebilir.
Erişilemeyen Değiştiriciler
Java, diğer birçok işlevi elde etmek için bir dizi erişim dışı değiştirici sağlar.
Statik sınıf yöntemleri ve değişkenler oluşturmak için modifiye edici.
Nihai sınıfları, yöntemleri ve değişkenlerin uygulamaları tamamlamak için modifiye edici.
Anahtar soyut sınıfları ve yöntemleri oluşturmak için modifiye edici.
İş parçacıkları için kullanılan senkronize ve uçucu değiştiriciler.
Sırada ne var?
Bir sonraki bölümde, Java Dilinde kullanılan Temel Operatörler hakkında konuşacağız. Bu bölüm size bu operatörlerin uygulama geliştirme sırasında nasıl kullanılabileceğine dair bir genel bakış sunacaktır.
Java, değişkenleri işlemek için zengin bir operatör kümesi sağlar. Tüm Java operatörlerini aşağıdaki gruplara ayırabiliriz -
- Aritmetik operatörler
- İlişkisel Operatörler
- Bitsel Operatörler
- Mantıksal operatörler
- Atama Operatörleri
- Çeşitli Operatörler
Aritmetik Operatörler
Aritmetik operatörler, matematiksel ifadelerde, cebirde kullanıldığı gibi kullanılır. Aşağıdaki tablo aritmetik operatörleri listeler -
Tamsayı değişken A'nın 10, B değişkeninin 20, o zaman -
Örnekleri Göster
Şebeke | Açıklama | Misal |
---|---|---|
+ (Toplama) | İşlecin her iki tarafına da değerler ekler. | A + B 30 verecek |
- (Çıkarma) | Sağ el işleneni sol el işlenenden çıkarır. | A - B -10 verir |
* (Çarpma işlemi) | İşlecin her iki tarafındaki değerleri çarpar. | A * B 200 verecek |
/ (Bölünme) | Sol el işleneni sağ el işlenene göre böler. | B / A 2 verecek |
% (Modül) | Sol el işleneni sağ el işlenene böler ve kalanını döndürür. | B% A 0 verir |
++ (Artış) | İşlenen değerini 1 artırır. | B ++ 21 verir |
- (Azaltma) | İşlenen değerini 1 azaltır. | B-- 19 verir |
İlişkisel Operatörler
Java dili tarafından desteklenen aşağıdaki ilişkisel operatörler vardır.
A değişkeninin 10 ve B değişkeninin 20 olduğunu varsayalım, o zaman -
Örnekleri Göster
Şebeke | Açıklama | Misal |
---|---|---|
== (eşittir) | İki işlenenin değerlerinin eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. | (A == B) doğru değil. |
! = (eşit değildir) | İki işlenenin değerlerinin eşit olup olmadığını kontrol eder, değerler eşit değilse koşul doğru olur. | (A! = B) doğrudur. |
> (büyüktür) | Soldaki işlenenin değerinin sağ işlenenin değerinden büyük olup olmadığını kontrol eder, evet ise koşul doğru olur. | (A> B) doğru değil. |
<(küçüktür) | Soldaki işlenenin değerinin sağ işlenenin değerinden küçük olup olmadığını kontrol eder, evet ise koşul doğru olur. | (A <B) doğrudur. |
> = (büyüktür veya eşittir) | Sol işlenenin değerinin sağ işlenenin değerinden büyük veya ona eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. | (A> = B) doğru değil. |
<= (küçüktür veya eşittir) | Sol işlenenin değerinin sağ işlenenin değerinden küçük veya ona eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. | (A <= B) doğrudur. |
Bitsel Operatörler
Java, tam sayı türlerine, long, int, short, char ve byte'a uygulanabilen birkaç bitsel operatör tanımlar.
Bitsel operatör bitler üzerinde çalışır ve bit bit işlem gerçekleştirir. A = 60 ve b = 13 olduğunu varsayalım; şimdi ikili biçimde aşağıdaki gibi olacaklar -
a = 0011 1100
b = 0000 1101
-----------------
a & b = 0000 1100
a | b = 0011 1101
a ^ b = 0011 0001
~ a = 1100 0011
Aşağıdaki tablo bitsel operatörleri listeler -
Tamsayı değişken A'nın 60, B değişkeninin 13 olduğunu varsayalım -
Örnekleri Göster
Şebeke | Açıklama | Misal |
---|---|---|
& (bitsel ve) | İkili VE İşleci, her iki işlenende de varsa sonuca bir bit kopyalar. | (A & B) 0000 1100 olan 12 verecek |
| (bitsel veya) | İkili VEYA İşleci, işlenenlerden herhangi birinde varsa bir bit kopyalar. | (A | B) 0011 1101 olan 61 verir |
^ (bitsel ÖZELVEYA) | İkili XOR İşleci, bir işlenen içinde ayarlanmışsa, ancak her ikisinde birden değil ise biti kopyalar. | (A ^ B), 0011 0001 olan 49 verecek |
~ (bitsel iltifat) | İkili Birler Tamamlayıcı Operatörü tekli ve bitleri 'çevirme' etkisine sahiptir. | (~ A), işaretli bir ikili sayı nedeniyle 2'nin tamamlayıcı formunda 1100 0011 olan -61'i verecektir. |
<< (sola kaydırma) | İkili Sol Kaydırma Operatörü. Soldaki işlenenler değeri, sağ işlenen tarafından belirtilen bit sayısı kadar sola taşınır. | Bir << 2, 1111 0000 olan 240 değerini verir |
>> (sağa kaydırma) | İkili Sağ Shift Operatörü. Soldaki işlenenler değeri, sağ işlenen tarafından belirtilen bit sayısı kadar sağa taşınır. | A >> 2, 1111 olan 15 verir |
>>> (sıfır dolgulu sağa kaydırma) | Sıfır doldurma operatörünü sağa kaydır. Soldaki işlenenler değeri, sağ işlenen tarafından belirtilen bit sayısı kadar sağa taşınır ve kaydırılan değerler sıfırlarla doldurulur. | A >>> 2, 0000 1111 olan 15 verir |
Mantıksal Operatörler
Aşağıdaki tablo mantıksal operatörleri listeler -
Boolean değişkenleri A'nın doğru ve B değişkeninin yanlış olduğunu varsayalım, o zaman -
Örnekleri Göster
Şebeke | Açıklama | Misal |
---|---|---|
&& (mantıksal ve) | Mantıksal AND operatörü çağrıldı. Her iki işlenen de sıfır değilse, koşul doğru olur. | (A && B) yanlıştır |
|| (mantıksal veya) | Mantıksal VEYA Operatörü çağrıldı. İki işlenenden herhangi biri sıfır değilse, koşul doğru olur. | (A || B) doğru |
! (mantıksal değil) | Mantıksal NOT Operatörü olarak adlandırıldı. İşleneninin mantıksal durumunu tersine çevirmek için kullanın. Bir koşul doğruysa, Mantıksal NOT operatörü yanlış yapar. | ! (A && B) doğru |
Atama Operatörleri
Aşağıda Java dili tarafından desteklenen atama operatörleri verilmiştir -
Örnekleri Göster
Şebeke | Açıklama | Misal |
---|---|---|
= | Basit atama operatörü. Sağ taraftaki işlenenlerden sol taraf işlenene değer atar. | C = A + B, A + B'nin değerini C'ye atar |
+ = | AND atama operatörü ekleyin. Sol operanda sağ operandı ekler ve sonucu sol operanda atar. | C + = A, C = C + A'ya eşdeğerdir |
- = | Çıkarma VE atama operatörü. Sağ operandı sol operanddan çıkarır ve sonucu sol operanda atar. | C - = A, C = C - A'ya eşdeğerdir |
* = | AND atama operatörünü çarpın. Sağ operandı sol operand ile çarpar ve sonucu sol operanda atar. | C * = A, C = C * A'ya eşdeğerdir |
/ = | VE atama işlecini böl. Soldaki operandı sağ operandla böler ve sonucu sol operanda atar. | C / = A, C = C / A'ya eşdeğerdir |
% = | Modül VE atama operatörü. İki işlenen kullanarak modülü alır ve sonucu sol işlenenlere atar. | C% = A eşdeğerdir C = C% A |
<< = | Sol kaydırma VE atama operatörü. | C << = 2, C = C << 2 ile aynıdır |
>> = | Sağ kaydırma VE atama operatörü. | C >> = 2, C = C >> 2 ile aynıdır |
& = | Bitsel AND atama operatörü. | C & = 2, C = C & 2 ile aynıdır |
^ = | bit düzeyinde özel OR ve atama operatörü. | C ^ = 2, C = C ^ 2 ile aynıdır |
| = | bitsel kapsayıcı OR ve atama operatörü. | C | = 2, C = C | ile aynıdır | 2 |
Çeşitli Operatörler
Java Dili tarafından desteklenen birkaç başka operatör vardır.
Koşullu Operatör (?:)
Koşullu operatör, aynı zamanda ternary operator. Bu operatör üç işlenen içerir ve Boole ifadelerini değerlendirmek için kullanılır. Operatörün amacı, değişkene hangi değerin atanması gerektiğine karar vermektir. Operatör şu şekilde yazılır -
variable x = (expression) ? value if true : value if false
Aşağıda bir örnek verilmiştir -
Example
public class Test {
public static void main(String args[]) {
int a, b;
a = 10;
b = (a == 1) ? 20: 30;
System.out.println( "Value of b is : " + b );
b = (a == 10) ? 20: 30;
System.out.println( "Value of b is : " + b );
}
}
Bu, aşağıdaki sonucu verecektir -
Output
Value of b is : 30
Value of b is : 20
instanceof Operatörü
Bu operatör yalnızca nesne referans değişkenleri için kullanılır. Operatör, nesnenin belirli bir türde (sınıf türü veya arabirim türü) olup olmadığını kontrol eder. instanceof operatörü şu şekilde yazılır -
( Object reference variable ) instanceof (class/interface type)
Operatörün sol tarafındaki değişken tarafından belirtilen nesne, sağ taraftaki sınıf / arayüz türü için IS-A kontrolünden geçerse, sonuç doğru olacaktır. Aşağıda bir örnek verilmiştir -
Example
public class Test {
public static void main(String args[]) {
String name = "James";
// following will return true since name is type of String
boolean result = name instanceof String;
System.out.println( result );
}
}
Bu, aşağıdaki sonucu verecektir -
Output
true
Karşılaştırılan nesne sağdaki türle uyumlu atama ise bu operatör yine de doğru döndürür. Aşağıda bir örnek daha var -
Example
class Vehicle {}
public class Car extends Vehicle {
public static void main(String args[]) {
Vehicle a = new Car();
boolean result = a instanceof Car;
System.out.println( result );
}
}
Bu, aşağıdaki sonucu verecektir -
Output
true
Java Operatörlerinin Önceliği
Operatör önceliği, bir ifadedeki terimlerin gruplandırılmasını belirler. Bu, bir ifadenin nasıl değerlendirileceğini etkiler. Bazı operatörler diğerlerinden daha yüksek önceliğe sahiptir; örneğin, çarpma operatörü toplama operatöründen daha yüksek önceliğe sahiptir -
Örneğin, x = 7 + 3 * 2; burada x operatörü * + 'dan daha yüksek önceliğe sahip olduğu için 20 değil 13 olarak atanır, bu nedenle önce 3 * 2 ile çarpılır ve sonra 7'ye eklenir.
Burada, en yüksek önceliğe sahip operatörler tablonun en üstünde, en düşük olanlar ise en altta görünür. Bir ifade içinde, daha yüksek öncelikli operatörler ilk olarak değerlendirilecektir.
Kategori | Şebeke | İlişkisellik |
---|---|---|
Postfix | ifade ++ ifade-- | Soldan sağa |
Tekli | ++ ifade –- ifade + ifade –ifade ~! | Sağdan sola |
Çarpımsal | * /% | Soldan sağa |
Katkı | + - | Soldan sağa |
Vardiya | << >> >>> | Soldan sağa |
İlişkisel | <> <=> = örnek | Soldan sağa |
Eşitlik | ==! = | Soldan sağa |
Bitsel AND | & | Soldan sağa |
Bitsel ÖZELVEYA | ^ | Soldan sağa |
Bit tabanlı VEYA | | | Soldan sağa |
Mantıksal AND | && | Soldan sağa |
Mantıksal VEYA | || | Soldan sağa |
Koşullu | ?: | Sağdan sola |
Görev | = + = - = * = / =% = ^ = | = << = >> = >>> = | Sağdan sola |
Sırada ne var?
Sonraki bölüm Java programlamada döngü kontrolü hakkında bilgi verecektir. Bölüm, çeşitli döngü türlerini ve bu döngülerin Java programı geliştirmede nasıl kullanılabileceğini ve hangi amaçlarla kullanıldıklarını açıklayacaktır.
Bir kod bloğunu birkaç kez çalıştırmanız gereken bir durum olabilir. Genel olarak, ifadeler sıralı olarak yürütülür: Bir fonksiyondaki ilk ifade önce çalıştırılır, ardından ikincisi vb.
Programlama dilleri, daha karmaşık yürütme yollarına izin veren çeşitli kontrol yapıları sağlar.
Bir loop ifadesi, bir ifadeyi veya ifadeler grubunu birden çok kez yürütmemize izin verir ve aşağıdakiler, programlama dillerinin çoğunda bir döngü ifadesinin genel biçimidir -
Java programlama dili, döngü gereksinimlerini karşılamak için aşağıdaki döngü türlerini sağlar. Ayrıntılarını kontrol etmek için aşağıdaki bağlantıları tıklayın.
Sr.No. | Döngü ve Açıklama |
---|---|
1 | döngü sırasında Belirli bir koşul doğruyken bir ifadeyi veya ifade grubunu tekrarlar. Döngü gövdesini çalıştırmadan önce koşulu test eder. |
2 | döngü için Bir dizi ifadeyi birden çok kez çalıştırın ve döngü değişkenini yöneten kodu kısaltın. |
3 | döngü sırasında yap Döngü gövdesinin sonundaki koşulu test etmesi dışında bir while ifadesi gibi. |
Döngü Kontrol İfadeleri
Döngü kontrol ifadeleri, yürütmeyi normal sırasından değiştirir. Yürütme bir kapsam bıraktığında, bu kapsamda oluşturulan tüm otomatik nesneler yok edilir.
Java, aşağıdaki kontrol ifadelerini destekler. Ayrıntılarını kontrol etmek için aşağıdaki bağlantıları tıklayın.
Sr.No. | Kontrol İfadesi ve Açıklama |
---|---|
1 | break ifadesi Sonlandırır loop veya switch deyim ve yürütmeyi döngü veya anahtardan hemen sonra deyime aktarır. |
2 | devam ifadesi Döngünün vücudunun geri kalanını atlamasına ve yinelemeden önce durumunu hemen yeniden test etmesine neden olur. |
Java'da geliştirilmiş for döngüsü
Java 5'ten itibaren, geliştirilmiş for döngüsü tanıtıldı. Bu, esas olarak diziler de dahil olmak üzere öğelerin koleksiyonunda gezinmek için kullanılır.
Sözdizimi
Aşağıda, geliştirilmiş for döngüsünün sözdizimi verilmiştir -
for(declaration : expression) {
// Statements
}
Declaration- Yeni bildirilen blok değişkeni, erişmekte olduğunuz dizinin öğeleriyle uyumlu bir türdendir. Değişken, for bloğunun içinde mevcut olacaktır ve değeri, geçerli dizi öğesiyle aynı olacaktır.
Expression- Bu, döngülemeniz gereken dizi olarak değerlendirilir. İfade, bir dizi değişkeni veya bir dizi döndüren yöntem çağrısı olabilir.
Misal
public class Test {
public static void main(String args[]) {
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ) {
System.out.print( x );
System.out.print(",");
}
System.out.print("\n");
String [] names = {"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
}
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
10, 20, 30, 40, 50,
James, Larry, Tom, Lacy,
Sırada ne var?
Bir sonraki bölümde, Java programlamasında karar verme ifadelerini öğreneceğiz.
Karar verme yapıları, program tarafından değerlendirilecek veya test edilecek bir veya daha fazla koşula, koşulun doğru olduğu belirlenirse yürütülecek bir ifade veya ifadeye ve isteğe bağlı olarak koşul belirlenirse yürütülecek diğer ifadelere sahiptir. yanlış olmak.
Aşağıda, programlama dillerinin çoğunda bulunan tipik bir karar verme yapısının genel biçimi verilmiştir -
Java programlama dili, aşağıdaki türden karar verme ifadeleri sağlar. Ayrıntılarını kontrol etmek için aşağıdaki bağlantıları tıklayın.
Sr.No. | Açıklama ve Açıklama |
---|---|
1 | eğer ifadesi Bir if statement bir boole ifadesinin ardından bir veya daha fazla ifadeden oluşur. |
2 | if ... else ifadesi Bir if statement ardından isteğe bağlı bir else statement, boolean ifadesi yanlış olduğunda çalıştırılır. |
3 | yuvalanmış if ifadesi Birini kullanabilirsin if veya else if bir başkasının içinde ifade if veya else if beyan (lar). |
4 | anahtar deyimi Bir switch ifadesi, bir değişkenin bir değerler listesine karşı eşitlik açısından test edilmesine izin verir. |
? : Şebeke
Biz kapladık conditional operator ? : değiştirmek için kullanılabilecek önceki bölümde if...elseifadeler. Aşağıdaki genel biçime sahiptir -
Exp1 ? Exp2 : Exp3;
Burada Exp1, Exp2 ve Exp3 ifadelerdir. Kolonun kullanımına ve yerleştirilmesine dikkat edin.
Tüm ifadenin değerini belirlemek için başlangıçta ifade1 değerlendirilir.
Ifade1 değeri doğruysa, Exp2'nin değeri tüm ifadenin değeri olacaktır.
Ifade1 değeri yanlışsa, Exp3 değerlendirilir ve değeri tüm ifadenin değeri olur.
Sırada ne var?
Sonraki bölümde, Number sınıfı (java.lang paketinde) ve onun Java Dilindeki alt sınıfları hakkında tartışacağız.
İlkel veri türleri yerine bu sınıfların örneklemelerini kullanacağınız bazı durumların yanı sıra Numbers ile çalışırken bilmeniz gereken biçimlendirme, matematiksel işlevler gibi sınıfları inceleyeceğiz.
Normalde Numbers ile çalışırken byte, int, long, double gibi ilkel veri türleri kullanırız.
Misal
int i = 5000;
float gpa = 13.65f;
double mask = 125;
Ancak geliştirme aşamasında ilkel veri türleri yerine nesneleri kullanmamız gereken durumlarla karşılaşıyoruz. Bunu başarmak için Java,wrapper classes.
Tüm sarmalayıcı sınıfları (Integer, Long, Byte, Double, Float, Short), Number soyut sınıfının alt sınıflarıdır.
Sarmalayıcı sınıfının nesnesi, ilgili ilkel veri türünü içerir veya sarar. İlkel veri türlerini nesneye dönüştürmek denirboxingve bu derleyici tarafından halledilir. Bu nedenle, bir sarmalayıcı sınıfı kullanırken, yalnızca ilkel veri türünün değerini Wrapper sınıfının yapıcısına iletmeniz gerekir.
Ve Wrapper nesnesi, ilkel bir veri türüne geri dönüştürülür ve bu işleme kutudan çıkarma adı verilir. Number class, java.lang paketinin bir parçasıdır.
Aşağıda bir boks ve kutudan çıkarma örneği verilmiştir -
Misal
public class Test {
public static void main(String args[]) {
Integer x = 5; // boxes int to an Integer object
x = x + 10; // unboxes the Integer to a int
System.out.println(x);
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
15
X'e bir tamsayı değeri atandığında, derleyici tamsayıyı kutulara yerleştirir çünkü x tamsayı nesnesidir. Daha sonra x, bir tamsayı olarak eklenebilmeleri için kutudan çıkarılır.
Sayı Yöntemleri
Aşağıda, Number sınıfının tüm alt sınıflarının uyguladığı örnek yöntemlerinin listesi verilmiştir:
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | xxxValue () Bu Number nesnesinin değerini xxx veri türüne dönüştürür ve döndürür. |
2 | karşılaştırmak() Karşılaştırır bu tartışmaya Numara nesnesi. |
3 | eşittir () Bu sayı nesnesinin bağımsız değişkene eşit olup olmadığını belirler . |
4 | değeri() Belirtilen temel öğenin değerini tutan bir Tamsayı nesnesi döndürür. |
5 | toString () Belirtilen int veya Integer'ın değerini temsil eden bir String nesnesi döndürür. |
6 | parseInt () Bu yöntem, belirli bir String'in ilkel veri türünü elde etmek için kullanılır. |
7 | abs () Bağımsız değişkenin mutlak değerini döndürür. |
8 | ceil () Bağımsız değişkenden büyük veya ona eşit olan en küçük tamsayıyı döndürür. Double olarak geri döndü. |
9 | kat () Bağımsız değişkenden küçük veya ona eşit olan en büyük tamsayıyı döndürür. Double olarak geri döndü. |
10 | rint () Değeri bağımsız değişkene en yakın olan tamsayıyı döndürür. Double olarak geri döndü. |
11 | yuvarlak () Yöntemin dönüş türünün argümana gösterdiği en yakın long veya int değerini döndürür. |
12 | dk () İki bağımsız değişkenden küçük olanı döndürür. |
13 | max () İki bağımsız değişkenden daha büyük olanı döndürür. |
14 | tecrübe() Doğal logaritmaların tabanını (e) argümanın gücüne döndürür. |
15 | günlük () Bağımsız değişkenin doğal logaritmasını döndürür. |
16 | pow () İkinci argümanın gücüne yükseltilen ilk argümanın değerini döndürür. |
17 | sqrt () Bağımsız değişkenin karekökünü döndürür. |
18 | günah() Belirtilen çift değerin sinüsünü döndürür. |
19 | çünkü () Belirtilen çift değerin kosinüsünü döndürür. |
20 | tan () Belirtilen çift değerin tanjantını döndürür. |
21 | de olduğu gibi() Belirtilen çift değerin arkini döndürür. |
22 | acos () Belirtilen çift değerin arkkosinüsünü döndürür. |
23 | atan () Belirtilen çift değerin arktanjantını döndürür. |
24 | atan2 () Dikdörtgen koordinatları (x, y) kutupsal koordinata (r, teta) dönüştürür ve teta'yı döndürür. |
25 | toDegrees () Argümanı dereceye dönüştürür. |
26 | toRadians () Argümanı radyanlara dönüştürür. |
27 | rastgele () Rastgele bir sayı döndürür. |
Sırada ne var?
Bir sonraki bölümde, Java'da Character sınıfından geçeceğiz. Java'da nesne karakterlerini ve ilkel veri türü karakterini nasıl kullanacağınızı öğreneceksiniz.
Normalde, karakterlerle çalışırken, ilkel veri türleri char kullanırız.
Misal
char ch = 'a';
// Unicode for uppercase Greek omega character
char uniChar = '\u039A';
// an array of chars
char[] charArray ={ 'a', 'b', 'c', 'd', 'e' };
Ancak geliştirme aşamasında, ilkel veri türleri yerine nesneleri kullanmamız gereken durumlarla karşılaşıyoruz. Bunu başarmak için Java, sarmalayıcı sınıfı sağlarCharacter ilkel veri türü için char.
Character sınıfı, karakterleri işlemek için bir dizi yararlı sınıf (yani statik) yöntem sunar. Character yapıcısı ile bir Character nesnesi oluşturabilirsiniz -
Character ch = new Character('a');
Java derleyicisi, bazı durumlarda sizin için bir Karakter nesnesi de oluşturacaktır. Örneğin, bir nesneyi bekleyen bir yönteme ilkel bir karakter iletirseniz, derleyici sizin için karakteri otomatik olarak bir Karaktere dönüştürür. Bu özelliğe otomatik kutulama veya kutudan çıkarma adı verilir, eğer dönüştürme diğer yöne giderse.
Misal
// Here following primitive char 'a'
// is boxed into the Character object ch
Character ch = 'a';
// Here primitive 'x' is boxed for method test,
// return is unboxed to char 'c'
char c = test('x');
Kaçış dizileri
Önünde ters eğik çizgi (\) bulunan bir karakter bir kaçış dizisidir ve derleyici için özel bir anlamı vardır.
Satırsonu karakteri (\ n), dizge yazdırıldıktan sonra sonraki satıra ilerlemek için bu eğiticide System.out.println () ifadelerinde sıklıkla kullanılmıştır.
Aşağıdaki tablo Java kaçış dizilerini göstermektedir -
Kaçış dizisi | Açıklama |
---|---|
\ t | Bu noktada metne bir sekme ekler. |
\ b | Bu noktada metne bir geri tuşu ekler. |
\ n | Bu noktada metne bir yeni satır ekler. |
\ r | Bu noktada metne bir satır başı ekler. |
\ f | Bu noktada metne bir form beslemesi ekler. |
\ ' | Bu noktada metne tek bir tırnak işareti ekler. |
\ " | Bu noktada metne bir çift tırnak karakteri ekler. |
\\ | Bu noktada metne bir ters eğik çizgi karakteri ekler. |
Bir print deyiminde bir kaçış dizisiyle karşılaşıldığında, derleyici bunu uygun şekilde yorumlar.
Misal
Tırnak işaretleri arasına tırnak işareti koymak isterseniz, iç tırnak işaretlerinde \ "kaçış dizisini kullanmalısınız -
public class Test {
public static void main(String args[]) {
System.out.println("She said \"Hello!\" to me.");
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
She said "Hello!" to me.
Karakter Yöntemleri
Aşağıda, Character sınıfının tüm alt sınıflarının uyguladığı önemli örnek yöntemlerinin listesi verilmiştir:
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | isLetter () Belirtilen char değerinin bir harf olup olmadığını belirler. |
2 | isDigit () Belirtilen char değerinin bir rakam olup olmadığını belirler. |
3 | isWhitespace () Belirtilen char değerinin beyaz boşluk olup olmadığını belirler. |
4 | isUpperCase () Belirtilen char değerinin büyük harf olup olmadığını belirler. |
5 | isLowerCase () Belirtilen char değerinin küçük harf olup olmadığını belirler. |
6 | toUpperCase () Belirtilen char değerinin büyük harf biçimini döndürür. |
7 | toLowerCase () Belirtilen char değerinin küçük harfli biçimini döndürür. |
8 | toString () Belirtilen karakter değerini, yani tek karakterlik bir dizeyi temsil eden bir String nesnesi döndürür. |
Yöntemlerin tam listesi için lütfen java.lang.Character API spesifikasyonuna bakın.
Sırada ne var?
Bir sonraki bölümde Java'daki String sınıfından geçeceğiz. Strings'i nasıl verimli bir şekilde bildirip kullanacağınızı ve String sınıfındaki bazı önemli yöntemleri öğreneceksiniz.
Java programlamada yaygın olarak kullanılan dizeler bir dizi karakterdir. Java programlama dilinde, dizeler nesne olarak kabul edilir.
Java platformu, dizeleri oluşturmak ve işlemek için String sınıfını sağlar.
Dizeler Oluşturma
Bir dizge oluşturmanın en doğrudan yolu yazmaktır -
String greeting = "Hello world!";
Kodunuzda bir dize değişmezi ile karşılaştığında, derleyici bu durumda "Merhaba dünya!" Değerine sahip bir String nesnesi oluşturur.
Diğer tüm nesnelerde olduğu gibi, new anahtar sözcüğü ve bir yapıcı kullanarak String nesneleri oluşturabilirsiniz. String sınıfı, karakter dizisi gibi farklı kaynaklar kullanarak dizenin başlangıç değerini sağlamanıza izin veren 11 yapıcıya sahiptir.
Misal
public class StringDemo {
public static void main(String args[]) {
char[] helloArray = { 'h', 'e', 'l', 'l', 'o', '.' };
String helloString = new String(helloArray);
System.out.println( helloString );
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
hello.
Note- String sınıfı değişmezdir, dolayısıyla oluşturulduktan sonra bir String nesnesi değiştirilemez. Karakter dizilerinde çok sayıda değişiklik yapma zorunluluğu varsa, String Buffer & String Builder Classes kullanmalısınız.
IP uzunluğu
Bir nesne hakkında bilgi almak için kullanılan yöntemler şu şekilde bilinir: accessor methods. Dizelerle kullanabileceğiniz bir erişimci yöntemi, dize nesnesinde bulunan karakterlerin sayısını döndüren length () yöntemidir.
Aşağıdaki program bir örnektir length(), yöntem String sınıfı.
Misal
public class StringDemo {
public static void main(String args[]) {
String palindrome = "Dot saw I was Tod";
int len = palindrome.length();
System.out.println( "String Length is : " + len );
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
String Length is : 17
Dizeleri Birleştirme
String sınıfı, iki dizeyi birleştirmek için bir yöntem içerir -
string1.concat(string2);
Bu, sonunda string2 eklenmiş string1 olan yeni bir string döndürür. Concat () yöntemini dize değişmezleri ile de kullanabilirsiniz, örneğin -
"My name is ".concat("Zara");
Dizeler daha çok + operatörüyle birleştirilir, örneğin -
"Hello," + " world" + "!"
sonuç -
"Hello, world!"
Şu örneğe bakalım -
Misal
public class StringDemo {
public static void main(String args[]) {
String string1 = "saw I was ";
System.out.println("Dot " + string1 + "Tod");
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Dot saw I was Tod
Biçim Dizeleri Oluşturma
Çıktıyı biçimlendirilmiş sayılarla yazdırmak için printf () ve format () yöntemlerine sahipsiniz. String sınıfı, bir PrintStream nesnesi yerine bir String nesnesi döndüren eşdeğer bir sınıf yöntemine (format ()) sahiptir.
String'in statik format () yöntemini kullanmak, tek seferlik bir print ifadesi yerine yeniden kullanabileceğiniz biçimlendirilmiş bir dize oluşturmanıza olanak tanır. Örneğin, - yerine
Misal
System.out.printf("The value of the float variable is " +
"%f, while the value of the integer " +
"variable is %d, and the string " +
"is %s", floatVar, intVar, stringVar);
Yazabilirsin -
String fs;
fs = String.format("The value of the float variable is " +
"%f, while the value of the integer " +
"variable is %d, and the string " +
"is %s", floatVar, intVar, stringVar);
System.out.println(fs);
Dize Yöntemleri
String sınıfı tarafından desteklenen yöntemlerin listesi aşağıdadır -
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | char charAt (int dizin) Belirtilen dizindeki karakteri döndürür. |
2 | int CompareTo (Nesne o) Bu Dizeyi başka bir Nesne ile karşılaştırır. |
3 | int karşılaştırmaTo (String anotherString) İki dizgeyi sözlükbilimsel olarak karşılaştırır. |
4 | int CompareToIgnoreCase (Dize dizesi) Büyük / küçük harf farklılıklarını göz ardı ederek iki dizgeyi sözlüksel olarak karşılaştırır. |
5 | String concat (String str) Belirtilen dizeyi bu dizenin sonuna birleştirir. |
6 | boolean contentEquals (StringBuffer sb) Yalnızca ve yalnızca bu String, belirtilen StringBuffer ile aynı karakter dizisini temsil ediyorsa true döndürür. |
7 | statik String copyValueOf (char [] veri) Belirtilen dizideki karakter sırasını temsil eden bir Dize döndürür. |
8 | statik String copyValueOf (char [] veri, int uzaklık, int sayım) Belirtilen dizideki karakter sırasını temsil eden bir Dize döndürür. |
9 | boolean uçlarıWith (Dize soneki) Bu dizenin belirtilen sonekle bitip bitmediğini test eder. |
10 | boole eşittir (Object anObject) Bu dizeyi belirtilen nesneyle karşılaştırır. |
11 | boolean equalsIgnoreCase (String anotherString) Bu Dizeyi başka bir Dize ile karşılaştırır, büyük / küçük harf hususlarını dikkate almaz. |
12 | bayt getBytes () Bu Dizeyi, platformun varsayılan karakter kümesini kullanarak bir bayt dizisine kodlar ve sonucu yeni bir bayt dizisinde saklar. |
13 | bayt [] getBytes (Dize charsetName) Bu Dizeyi, adlandırılmış karakter kümesini kullanarak bir bayt dizisine kodlar ve sonucu yeni bir bayt dizisinde saklar. |
14 | void getChars (int srcBegin, int srcEnd, char [] dst, int dstBegin) Bu dizedeki karakterleri hedef karakter dizisine kopyalar. |
15 | int hashCode () Bu dizge için bir karma kod döndürür. |
16 | int indexOf (int ch) Belirtilen karakterin ilk oluşumunun bu dizge içindeki dizini döndürür. |
17 | int indexOf (int ch, int fromIndex) Aramayı belirtilen dizinde başlatarak, belirtilen karakterin ilk oluşumunun bu dizge içindeki dizini döndürür. |
18 | int indexOf (Dize dizesi) Belirtilen alt dizenin ilk oluşumunun bu dizge içindeki dizini döndürür. |
19 | int indexOf (String str, int fromIndex) Belirtilen dizinden başlayarak, belirtilen alt dizenin ilk oluşumunun bu dize içindeki dizini döndürür. |
20 | Dize stajyeri () Dize nesnesi için kanonik bir temsil döndürür. |
21 | int lastIndexOf (int ch) Belirtilen karakterin son oluşumunun bu dizge içindeki dizini döndürür. |
22 | int lastIndexOf (int ch, int fromIndex) Belirtilen dizinden başlayarak geriye doğru arama yaparak, belirtilen karakterin son oluşumunun bu dizge içindeki dizini döndürür. |
23 | int lastIndexOf (Dize dizesi) Belirtilen alt dizenin en sağdaki oluşumunun bu dizge içindeki dizini döndürür. |
24 | int lastIndexOf (String str, int fromIndex) Belirtilen dizinin son oluşumunun bu dizesi içindeki dizini döndürür, belirtilen dizinden başlayarak geriye doğru arama yapar. |
25 | int uzunluk () Bu dizenin uzunluğunu döndürür. |
26 | boolean eşleşmeleri (String regex) Bu dizenin verilen normal ifadeyle eşleşip eşleşmediğini söyler. |
27 | boolean regionMatches (boolean ignoreCase, int toffset, String diğer, int ooffset, int len) İki dizi bölgesinin eşit olup olmadığını test eder. |
28 | boolean regionMatches (int toffset, String other, int ooffset, int len) İki dizi bölgesinin eşit olup olmadığını test eder. |
29 | Dize değiştirme (char oldChar, char newChar) Bu dizedeki tüm oldChar oluşumlarının newChar ile değiştirilmesinden kaynaklanan yeni bir dize döndürür. |
30 | String replaceAll (String regex, String değişimi Verilen normal ifadeyle eşleşen bu dizenin her bir alt dizesini verilen değiştirmeyle değiştirir. |
31 | String replaceFirst (String regex, String değişimi) Verilen normal ifadeyle eşleşen bu dizenin ilk alt dizesini verilen yedekle değiştirir. |
32 | Dize [] bölme (Dize normal ifadesi) Bu dizeyi verilen normal ifadenin eşleşmelerinin etrafına böler. |
33 | Dize [] bölme (Dize normal ifadesi, int sınırı) Bu dizeyi verilen normal ifadenin eşleşmelerinin etrafına böler. |
34 | boolean startsWith (Dize öneki) Bu dizenin belirtilen önekle başlayıp başlamadığını test eder. |
35 | boolean startsWith (Dize öneki, int toffset) Bu dizenin belirtilen bir dizinden başlayarak belirtilen önekle başlayıp başlamadığını test eder. |
36 | CharSequence subSequence (int beginIndex, int endIndex) Bu dizinin bir alt dizisi olan yeni bir karakter dizisi döndürür. |
37 | Dize alt dizesi (int beginIndex) Bu dizenin alt dizesi olan yeni bir dize döndürür. |
38 | Dize alt dizesi (int beginIndex, int endIndex) Bu dizenin alt dizesi olan yeni bir dize döndürür. |
39 | char [] toCharArray () Bu dizeyi yeni bir karakter dizisine dönüştürür. |
40 | String toLowerCase () Varsayılan yerel ayarın kurallarını kullanarak bu Dize'deki tüm karakterleri küçük harfe dönüştürür. |
41 | String toLowerCase (Yerel ayar) Verilen Yerel Ayarın kurallarını kullanarak bu Dizedeki tüm karakterleri küçük harfe dönüştürür. |
42 | String toString () Bu nesnenin (zaten bir dizge) kendisi döndürülür. |
43 | String toUpperCase () Varsayılan yerel ayarın kurallarını kullanarak bu Dize'deki tüm karakterleri büyük harfe dönüştürür. |
44 | String toUpperCase (Yerel ayar) Verilen Yerel Ayarın kurallarını kullanarak bu Dizedeki tüm karakterleri büyük harfe dönüştürür. |
45 | Dize kırpma () Dizenin başında ve sonunda boşluk bırakılmış bir kopyasını döndürür. |
46 | statik String valueOf (ilkel veri türü x) Aktarılan veri türü bağımsız değişkeninin dize temsilini döndürür. |
Java bir veri yapısı sağlar, array, aynı türden öğelerin sabit boyutlu sıralı bir koleksiyonunu depolayan. Bir dizi, bir veri koleksiyonunu depolamak için kullanılır, ancak bir diziyi aynı türden bir değişkenler koleksiyonu olarak düşünmek genellikle daha kullanışlıdır.
Sayı0, sayı1, ... ve sayı99 gibi tek tek değişkenleri bildirmek yerine, sayılar gibi bir dizi değişkeni bildirir ve temsil etmek için sayılar [0], sayılar [1] ve ..., sayılar [99] kullanırsınız bireysel değişkenler.
Bu öğretici, dizi değişkenlerinin nasıl bildirileceğini, dizilerin nasıl oluşturulacağını ve dizinlenmiş değişkenler kullanılarak dizilerin nasıl işleneceğini açıklamaktadır.
Dizi Değişkenlerini Bildirme
Bir programda bir dizi kullanmak için, diziye başvurmak üzere bir değişken bildirmeniz ve değişkenin başvurabileceği dizi türünü belirtmeniz gerekir. İşte bir dizi değişkenini bildirmek için sözdizimi -
Sözdizimi
dataType[] arrayRefVar; // preferred way.
or
dataType arrayRefVar[]; // works but not preferred way.
Note - Tarz dataType[] arrayRefVartercih edilir. StildataType arrayRefVar[] C / C ++ dilinden gelir ve C / C ++ programcılarını barındırmak için Java'da benimsenmiştir.
Misal
Aşağıdaki kod parçacıkları bu sözdiziminin örnekleridir -
double[] myList; // preferred way.
or
double myList[]; // works but not preferred way.
Diziler Oluşturma
New operatörü aşağıdaki sözdizimi ile kullanarak bir dizi oluşturabilirsiniz -
Sözdizimi
arrayRefVar = new dataType[arraySize];
Yukarıdaki ifade iki şey yapar -
New dataType [arraySize] kullanarak bir dizi oluşturur.
Yeni oluşturulan dizinin referansını arrayRefVar değişkenine atar.
Bir dizi değişkeni bildirmek, bir dizi oluşturmak ve dizi referansını değişkene atamak, aşağıda gösterildiği gibi tek bir ifadede birleştirilebilir -
dataType[] arrayRefVar = new dataType[arraySize];
Alternatif olarak aşağıdaki gibi diziler oluşturabilirsiniz -
dataType[] arrayRefVar = {value0, value1, ..., valuek};
Dizi elemanlarına, index. Dizi indeksleri 0 tabanlıdır; yani, 0'dan başlarlararrayRefVar.length-1.
Misal
Aşağıdaki ifade, bir dizi değişkeni bildirir, myList, 10 öğelik double türünde bir dizi oluşturur ve referansını myList'e atar -
double[] myList = new double[10];
Aşağıdaki resim myList dizisini temsil eder. Burada, myList on çift değer içerir ve endeksler 0'dan 9'a kadardır.
Dizileri İşleme
Dizi öğelerini işlerken genellikle ikisinden birini kullanırız for döngü veya foreach döngü çünkü bir dizideki tüm öğeler aynı türdedir ve dizinin boyutu bilinir.
Misal
İşte dizilerin nasıl oluşturulacağını, başlatılacağını ve işleneceğini gösteren eksiksiz bir örnek:
public class TestArray {
public static void main(String[] args) {
double[] myList = {1.9, 2.9, 3.4, 3.5};
// Print all the array elements
for (int i = 0; i < myList.length; i++) {
System.out.println(myList[i] + " ");
}
// Summing all elements
double total = 0;
for (int i = 0; i < myList.length; i++) {
total += myList[i];
}
System.out.println("Total is " + total);
// Finding the largest element
double max = myList[0];
for (int i = 1; i < myList.length; i++) {
if (myList[i] > max) max = myList[i];
}
System.out.println("Max is " + max);
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
1.9
2.9
3.4
3.5
Total is 11.7
Max is 3.5
Foreach Döngüleri
JDK 1.5, foreach döngüsü olarak bilinen veya döngü için geliştirilmiş yeni bir for döngüsü sunmuştur; bu, bir indeks değişkeni kullanmadan dizinin tamamını sırayla geçmenizi sağlar.
Misal
Aşağıdaki kod, myList dizisindeki tüm öğeleri görüntüler -
public class TestArray {
public static void main(String[] args) {
double[] myList = {1.9, 2.9, 3.4, 3.5};
// Print all the array elements
for (double element: myList) {
System.out.println(element);
}
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
1.9
2.9
3.4
3.5
Dizileri Yöntemlere Geçirme
İlkel tür değerlerini yöntemlere geçirebildiğiniz gibi, dizileri de yöntemlere geçirebilirsiniz. Örneğin, aşağıdaki yöntem öğeleri birint dizi -
Misal
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
Bir dizi geçirerek onu çağırabilirsiniz. Örneğin aşağıdaki ifade, 3, 1, 2, 6, 4 ve 2'yi görüntülemek için printArray yöntemini çağırır -
Misal
printArray(new int[]{3, 1, 2, 6, 4, 2});
Bir Yöntemden Dizi Döndürme
Bir yöntem ayrıca bir dizi döndürebilir. Örneğin, aşağıdaki yöntem, başka bir dizinin tersine çevrilmesi olan bir dizi döndürür -
Misal
public static int[] reverse(int[] list) {
int[] result = new int[list.length];
for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
result[j] = list[i];
}
return result;
}
Arrays Sınıfı
Java.util.Arrays sınıfı, dizileri sıralamak ve aramak, dizileri karşılaştırmak ve dizi öğelerini doldurmak için çeşitli statik yöntemler içerir. Bu yöntemler, tüm ilkel türler için aşırı yüklenmiştir.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public static int binarySearch(Object[] a, Object key) İkili arama algoritmasını kullanarak belirtilen değer için belirtilen Object dizisini (Byte, Int, double, vb.) Arar. Bu çağrıyı yapmadan önce dizi sıralanmalıdır. Bu, listede yer alıyorsa arama anahtarının dizinini döndürür; aksi takdirde (- (ekleme noktası + 1)) döndürür. |
2 | public static boolean equals(long[] a, long[] a2) Belirtilen iki uzun dizi birbirine eşitse doğru döndürür. Her iki dizi de aynı sayıda öğe içeriyorsa ve iki dizideki karşılık gelen tüm öğe çiftleri eşitse, iki dizi eşit kabul edilir. İki dizi eşitse bu doğru döndürür. Aynı yöntem diğer tüm ilkel veri türleri (Byte, short, Int, vb.) Tarafından kullanılabilir. |
3 | public static void fill(int[] a, int val) Belirtilen int değerini, belirtilen ints dizisinin her öğesine atar. Aynı yöntem, tüm diğer ilkel veri türleri (Byte, short, Int, vb.) Tarafından kullanılabilir. |
4 | public static void sort(Object[] a) Belirtilen nesne dizisini, öğelerinin doğal sırasına göre artan bir düzende sıralar. Aynı yöntem, tüm diğer ilkel veri türleri (Byte, short, Int, vb.) Tarafından kullanılabilir. |
Java, Date sınıf mevcut java.util paket, bu sınıf geçerli tarih ve saati kapsar.
Date sınıfı, aşağıdaki tabloda gösterildiği gibi iki yapıcıyı destekler.
Sr.No. | Oluşturucu ve Açıklama |
---|---|
1 | Date( ) Bu yapıcı, nesneyi geçerli tarih ve saatle başlatır. |
2 | Date(long millisec) Bu kurucu, 1 Ocak 1970 gece yarısından bu yana geçen milisaniye sayısına eşit olan bir argümanı kabul eder. |
Tarih sınıfının yöntemleri aşağıdadır.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | boolean after(Date date) Çağrılan Date nesnesi tarihe göre belirtilenden daha sonraki bir tarih içeriyorsa true, aksi takdirde false döndürür. |
2 | boolean before(Date date) Çağrılan Date nesnesi, tarihe göre belirtilenden daha eski bir tarih içeriyorsa true, aksi takdirde false döndürür. |
3 | Object clone( ) Çağrılan Date nesnesini çoğaltır. |
4 | int compareTo(Date date) Çağrılan nesnenin değerini tarihin değeriyle karşılaştırır. Değerler eşitse 0 döndürür. Çağrılan nesne tarihten önceyse negatif bir değer döndürür. Çağrılan nesne tarihten sonraysa pozitif bir değer döndürür. |
5 | int compareTo(Object obj) Obj, Date sınıfındaysa, ComparTo (Date) ile aynı şekilde çalışır. Aksi takdirde, bir ClassCastException oluşturur. |
6 | boolean equals(Object date) Çağrılan Date nesnesi, tarihe göre belirtilenle aynı saat ve tarihi içeriyorsa true, aksi takdirde false döndürür. |
7 | long getTime( ) Returns the number of milliseconds that have elapsed since January 1, 1970. |
8 | int hashCode( ) Returns a hash code for the invoking object. |
9 | void setTime(long time) Sets the time and date as specified by time, which represents an elapsed time in milliseconds from midnight, January 1, 1970. |
10 | String toString( ) Converts the invoking Date object into a string and returns the result. |
Güncel Tarih ve Saati Alma
Bu, Java'da güncel tarih ve saati almanın çok kolay bir yöntemidir. Geçerli tarih ve saati aşağıdaki gibi yazdırmak için toString () yöntemiyle basit bir Date nesnesi kullanabilirsiniz -
Misal
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and date using toString()
System.out.println(date.toString());
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
on May 04 09:51:52 CDT 2009
Tarih Karşılaştırması
İki tarihi karşılaştırmanın üç yolu aşağıdadır -
Her iki nesne için 1 Ocak 1970 gece yarısından bu yana geçen milisaniye sayısını elde etmek ve ardından bu iki değeri karşılaştırmak için getTime () işlevini kullanabilirsiniz.
Yöntemleri önce (), sonra () ve eşittir () kullanabilirsiniz. Ayın 12'si 18'inden önce geldiğinden, örneğin, yeni Tarih (99, 2, 12) .before (yeni Tarih (99, 2, 18)) true değerini döndürür.
Comparable arabirim tarafından tanımlanan ve Date ile uygulanan CompareTo () yöntemini kullanabilirsiniz.
SimpleDateFormat Kullanarak Tarih Biçimlendirme
SimpleDateFormat, tarihleri yerel ayara duyarlı bir şekilde biçimlendirmek ve ayrıştırmak için somut bir sınıftır. SimpleDateFormat, tarih-saat biçimlendirmesi için herhangi bir kullanıcı tanımlı kalıp seçerek başlamanıza olanak tanır.
Misal
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
Date dNow = new Date( );
SimpleDateFormat ft =
new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
System.out.println("Current Date: " + ft.format(dNow));
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
Basit Tarih Biçimi Biçim Kodları
Saat biçimini belirtmek için bir zaman modeli dizesi kullanın. Bu modelde, tüm ASCII harfleri aşağıdaki gibi tanımlanan model harfleri olarak ayrılmıştır -
Karakter | Açıklama | Misal |
---|---|---|
G | Çağ belirleyici | AD |
y | Dört basamaklı yıl | 2001 |
M | Yıldaki ay | Temmuz veya 07 |
d | Aydaki gün | 10 |
h | ÖÖ / ÖS olarak saat (1 ~ 12) | 12 |
H | Gün içindeki saat (0 ~ 23) | 22 |
m | Saat cinsinden dakika | 30 |
s | Dakikada ikinci | 55 |
S | Milisaniye | 234 |
E | Hafta içi gün | Salı |
D | Yıldaki gün | 360 |
F | Ay içinde haftanın günü | 2 (Temmuz'da ikinci Çarşamba) |
w | Yıldaki hafta | 40 |
W | Aydaki hafta | 1 |
a | AM / PM işaretçisi | ÖS |
k | Gün içindeki saat (1 ~ 24) | 24 |
K | ÖÖ / ÖS olarak saat (0 ~ 11) | 10 |
z | Saat dilimi | Doğu standart zamanı |
' | Metin için kaçış | Sınırlayıcı |
" | Tek alıntı | ' |
Printf Kullanarak Tarih Biçimlendirme
Tarih ve saat biçimlendirmesi kullanılarak çok kolay bir şekilde yapılabilir printfyöntem. İki harfli bir biçim kullanıyorsunuz.t ve aşağıdaki kodda gösterildiği gibi tablonun harflerinden biriyle biter.
Misal
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and date
String str = String.format("Current Date/Time : %tc", date );
System.out.printf(str);
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
Her bölümü biçimlendirmek için tarihi birden çok kez sağlamanız gerekse biraz aptalca olurdu. Bu nedenle, bir biçim dizesi biçimlendirilecek bağımsız değişkenin dizinini gösterebilir.
Endeks hemen% işaretini takip etmeli ve $ ile sonlandırılmalıdır.
Misal
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display time and date
System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Due date: February 09, 2004
Alternatif olarak, <işaretini de kullanabilirsiniz. Önceki format belirtiminde olduğu gibi aynı argümanın tekrar kullanılması gerektiğini belirtir.
Misal
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// Instantiate a Date object
Date date = new Date();
// display formatted date
System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Due date: February 09, 2004
Tarih ve Saat Dönüştürme Karakterleri
Karakter | Açıklama | Misal |
---|---|---|
c | Tam tarih ve saat | Pazartesi 04 Mayıs 09:51:52 CDT 2009 |
F | ISO 8601 tarihi | 2004-02-09 |
D | ABD formatlı tarih (ay / gün / yıl) | 02/09/2004 |
T | 24 saatlik zaman | 18:05:19 |
r | 12 saatlik zaman | 18:05:19 |
R | 24 saatlik zaman, saniye yok | 18:05 |
Y | Dört basamaklı yıl (baştaki sıfırlarla) | 2004 |
y | Yılın son iki basamağı (başında sıfırlar ile) | 04 |
C | Yılın ilk iki hanesi (başında sıfırlar ile) | 20 |
B | Tam ay adı | Şubat |
b | Kısaltılmış ay adı | Şubat |
m | İki basamaklı ay (baştaki sıfırlarla) | 02 |
d | İki basamaklı gün (baştaki sıfırlarla) | 03 |
e | İki basamaklı gün (baştaki sıfırlar olmadan) | 9 |
Bir | Tam gün adı | Pazartesi |
a | Kısaltılmış hafta içi adı | Pzt |
j | Yılın üç basamaklı günü (baştaki sıfırlarla) | 069 |
H | 00 ile 23 arasında iki basamaklı saat (baştaki sıfırlarla) | 18 |
k | İki basamaklı saat (başında sıfır olmadan), 0 ile 23 arasında | 18 |
ben | 01 ile 12 arasında iki basamaklı saat (baştaki sıfırlarla) | 06 |
l | İki basamaklı saat (başında sıfır olmadan), 1 ile 12 arasında | 6 |
M | İki basamaklı dakika (baştaki sıfırlarla) | 05 |
S | İki basamaklı saniye (baştaki sıfırlarla) | 19 |
L | Üç basamaklı milisaniye (baştaki sıfırlarla) | 047 |
N | Dokuz basamaklı nanosaniye (önde gelen sıfırlarla) | 047000000 |
P | Büyük sabah veya öğleden sonra işaretçisi | ÖS |
p | Küçük sabah veya öğleden sonra işaretçisi | öğleden sonra |
z | GMT'den RFC 822 sayısal uzaklığı | -0800 |
Z | Saat dilimi | PST |
s | 1970-01-01 00:00:00 GMT'den beri geçen saniye sayısı | 1078884319 |
Q | 1970-01-01 00:00:00 GMT'den beri geçen milisaniye | 1078884319047 |
Tarih ve saat ile ilgili başka yararlı sınıflar da vardır. Daha fazla ayrıntı için Java Standard belgelerine bakabilirsiniz.
Dizeleri Tarihlere Ayrıştırma
SimpleDateFormat sınıfı, belirli SimpleDateFormat nesnesinde depolanan biçime göre bir dizeyi ayrıştırmaya çalışan parse () gibi bazı ek yöntemlere sahiptir.
Misal
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");
String input = args.length == 0 ? "1818-11-11" : args[0];
System.out.print(input + " Parses as ");
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
}
Yukarıdaki programın örnek bir çalıştırması aşağıdaki sonucu verecektir -
Çıktı
1818-11-11 Parses as Wed Nov 11 00:00:00 EST 1818
Bir süre uyumak
Bir milisaniyeden bilgisayarınızın kullanım ömrüne kadar herhangi bir süre uyuyabilirsiniz. Örneğin, aşağıdaki program 3 saniye uyur -
Misal
import java.util.*;
public class SleepDemo {
public static void main(String args[]) {
try {
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Sun May 03 18:04:41 GMT 2009
Sun May 03 18:04:51 GMT 2009
Geçen Süre Ölçümü
Bazen milisaniye cinsinden zamandaki noktayı ölçmeniz gerekebilir. Öyleyse yukarıdaki örneği bir kez daha yazalım -
Misal
import java.util.*;
public class DiffDemo {
public static void main(String args[]) {
try {
long start = System.currentTimeMillis( );
System.out.println(new Date( ) + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "\n");
long end = System.currentTimeMillis( );
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Sun May 03 18:16:51 GMT 2009
Sun May 03 18:16:57 GMT 2009
Difference is : 5993
GregorianCalendar Sınıfı
GregorianCalendar, aşina olduğunuz normal Gregoryen takvimini uygulayan bir Takvim sınıfının somut bir uygulamasıdır. Bu eğiticide Takvim sınıfını tartışmadık, bunun için standart Java belgelerine bakabilirsiniz.
getInstance( )Takvim yöntemi, varsayılan yerel ayarda ve saat diliminde geçerli tarih ve saatle başlatılan bir GregorianCalendar'ı döndürür. GregorianCalendar, iki alanı tanımlar: AD ve BC. Bunlar Gregoryen takvimi tarafından tanımlanan iki dönemi temsil eder.
GregorianCalendar nesneleri için de birkaç yapıcı vardır -
Sr.No. | Oluşturucu ve Açıklama |
---|---|
1 | GregorianCalendar() Varsayılan yerel ayara sahip varsayılan saat dilimindeki geçerli saati kullanarak varsayılan bir GregorianCalendar oluşturur. |
2 | GregorianCalendar(int year, int month, int date) Varsayılan yerel ayara sahip varsayılan saat diliminde belirlenen tarihe sahip bir GregorianCalendar oluşturur. |
3 | GregorianCalendar(int year, int month, int date, int hour, int minute) Varsayılan yerel ayara sahip varsayılan saat dilimi için belirlenen tarih ve saat ayarıyla bir GregorianCalendar oluşturur. |
4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) Varsayılan yerel ayara sahip varsayılan saat dilimi için belirlenen tarih ve saat ayarıyla bir GregorianCalendar oluşturur. |
5 | GregorianCalendar(Locale aLocale) Verilen yerel ayara sahip varsayılan saat dilimindeki geçerli saate göre bir GregorianCalendar oluşturur. |
6 | GregorianCalendar(TimeZone zone) Varsayılan yerel ayara sahip belirli saat dilimindeki geçerli saate göre bir GregorianCalendar oluşturur. |
7 | GregorianCalendar(TimeZone zone, Locale aLocale) Bir GregorianCalendar, verilen yerel ayara sahip verilen saat dilimindeki geçerli saate göre oluşturur. |
GregorianCalendar sınıfı tarafından sağlanan birkaç yararlı destek yönteminin listesi:
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | void add(int field, int amount) Takvimin kurallarına göre, belirtilen (imzalı) süreyi verilen zaman alanına ekler. |
2 | protected void computeFields() UTC'yi milisaniye olarak saat alanı değerlerine dönüştürür. |
3 | protected void computeTime() Takvimi Geçersiz Kılar Zaman alanı değerlerini milisaniye olarak UTC'ye dönüştürür. |
4 | boolean equals(Object obj) Bu GregorianCalendar'ı bir nesne başvurusuyla karşılaştırır. |
5 | int get(int field) Belirli bir zaman alanı için değeri alır. |
6 | int getActualMaximum(int field) Geçerli tarih verildiğinde, bu alanın sahip olabileceği maksimum değeri döndürür. |
7 | int getActualMinimum(int field) Geçerli tarih verildiğinde bu alanın sahip olabileceği minimum değeri döndürür. |
8 | int getGreatestMinimum(int field) Değişirse, verilen alan için en yüksek minimum değeri döndürür. |
9 | Date getGregorianChange() Miladi Takvim değişiklik tarihini alır. |
10 | int getLeastMaximum(int field) Değişirse, verilen alan için en düşük maksimum değeri döndürür. |
11 | int getMaximum(int field) Verilen alan için maksimum değeri döndürür. |
12 | Date getTime() Bu Takvimin geçerli saatini alır. |
13 | long getTimeInMillis() Bu Takvimin şimdiki zamanını uzun olarak alır. |
14 | TimeZone getTimeZone() Saat dilimini alır. |
15 | int getMinimum(int field) Verilen alan için minimum değeri döndürür. |
16 | int hashCode() HashCode'u geçersiz kılar. |
17 | boolean isLeapYear(int year) Verilen yılın artık yıl olup olmadığını belirler. |
18 | void roll(int field, boolean up) Daha büyük alanları değiştirmeden, verilen zaman alanında tek bir zaman birimi ekler veya çıkarır (yukarı / aşağı). |
19 | void set(int field, int value) Zaman alanını verilen değerle ayarlar. |
20 | void set(int year, int month, int date) Yıl, ay ve tarih alanlarının değerlerini ayarlar. |
21 | void set(int year, int month, int date, int hour, int minute) Yıl, ay, tarih, saat ve dakika alanlarının değerlerini ayarlar. |
22 | void set(int year, int month, int date, int hour, int minute, int second) Yıl, ay, tarih, saat, dakika ve saniye alanlarının değerlerini ayarlar. |
23 | void setGregorianChange(Date date) GregorianCalendar değişiklik tarihini ayarlar. |
24 | void setTime(Date date) Bu Takvimin geçerli saatini verilen Tarihle ayarlar. |
25 | void setTimeInMillis(long millis) Bu Takvimin şimdiki zamanını verilen uzun değerden ayarlar. |
26 | void setTimeZone(TimeZone value) Saat dilimini, verilen saat dilimi değeriyle ayarlar. |
27 | String toString() Bu takvimin dize gösterimini döndürür. |
Misal
import java.util.*;
public class GregorianCalendarDemo {
public static void main(String args[]) {
String months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
"Oct", "Nov", "Dec"};
int year;
// Create a Gregorian calendar initialized
// with the current date and time in the
// default locale and timezone.
GregorianCalendar gcalendar = new GregorianCalendar();
// Display current time and date information.
System.out.print("Date: ");
System.out.print(months[gcalendar.get(Calendar.MONTH)]);
System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
System.out.println(year = gcalendar.get(Calendar.YEAR));
System.out.print("Time: ");
System.out.print(gcalendar.get(Calendar.HOUR) + ":");
System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
System.out.println(gcalendar.get(Calendar.SECOND));
// Test if the current year is a leap year
if(gcalendar.isLeapYear(year)) {
System.out.println("The current year is a leap year");
}else {
System.out.println("The current year is not a leap year");
}
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Date: Apr 22 2009
Time: 11:25:27
The current year is not a leap year
Takvim sınıfında bulunan sabitlerin tam listesi için standart Java belgelerine bakabilirsiniz.
Java, normal ifadelerle kalıp eşleşmesi için java.util.regex paketini sağlar. Java normal ifadeleri Perl programlama diline çok benzer ve öğrenmesi çok kolaydır.
Normal ifade, bir modelde tutulan özel bir sözdizimini kullanarak diğer dizeleri veya dize kümelerini eşleştirmenize veya bulmanıza yardımcı olan özel bir karakter dizisidir. Metin ve verileri aramak, düzenlemek veya değiştirmek için kullanılabilirler.
Java.util.regex paketi öncelikle aşağıdaki üç sınıftan oluşur -
Pattern Class- Bir Desen nesnesi, bir normal ifadenin derlenmiş bir temsilidir. Pattern sınıfı, genel oluşturucular sağlamaz. Bir model oluşturmak için önce genel statiklerinden birini çağırmalısınız.compile()yöntemler, daha sonra bir Pattern nesnesi döndürür. Bu yöntemler, ilk argüman olarak bir normal ifadeyi kabul eder.
Matcher Class- Bir Matcher nesnesi, modeli yorumlayan ve bir giriş dizesine karşı eşleştirme işlemleri gerçekleştiren motordur. Pattern sınıfı gibi, Matcher hiçbir genel kurucu tanımlamaz. Bir Matcher nesnesini,matcher() Bir Pattern nesnesinde yöntem.
PatternSyntaxException - PatternSyntaxException nesnesi, normal ifade modelinde sözdizimi hatasını gösteren denetlenmemiş bir istisnadır.
Grupları Yakalama
Grupları yakalama, birden çok karakteri tek bir birim olarak ele almanın bir yoludur. Gruplanacak karakterlerin parantez içine yerleştirilmesiyle oluşturulurlar. Örneğin, normal ifade (köpek) "d", "o" ve "g" harflerini içeren tek bir grup oluşturur.
Yakalama grupları, soldan sağa açılış parantezleri sayılarak numaralandırılır. Örneğin ((A) (B (C))) ifadesinde, bu tür dört grup vardır -
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
İfadede kaç grup olduğunu öğrenmek için, bir eşleştirme nesnesinde groupCount yöntemini çağırın. GroupCount yöntemi birint eşleştiricinin modelinde bulunan yakalama gruplarının sayısını gösterir.
Ayrıca her zaman tüm ifadeyi temsil eden özel bir grup 0 vardır. Bu grup, groupCount tarafından bildirilen toplama dahil edilmemiştir.
Example
Aşağıdaki örnek, verilen alfanümerik dizeden bir rakam dizesinin nasıl bulunacağını gösterir -
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main( String args[] ) {
// String to be scanned to find the pattern.
String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d+)(.*)";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
}else {
System.out.println("NO MATCH");
}
}
}
Bu, aşağıdaki sonucu verecektir -
Output
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
Normal İfade Söz Dizimi
Java'da bulunan tüm normal ifade meta karakter sözdizimini listeleyen tablo şu şekildedir:
Alt ifade | Maçlar |
---|---|
^ | Satırın başıyla eşleşir. |
$ | Satırın sonuyla eşleşir. |
. | Yeni satır hariç herhangi bir tek karakterle eşleşir. Kullanmam seçeneği, yeni satırla da eşleşmesine izin verir. |
[...] | Parantez içindeki herhangi bir tek karakterle eşleşir. |
[^ ...] | Parantez içinde olmayan herhangi bir tek karakterle eşleşir. |
\ A | Tüm dizenin başlangıcı. |
\ z | Tüm dizenin sonu. |
\ Z | İzin verilen son satır sonlandırıcı dışında tüm dizenin sonu. |
yeniden* | Önceki ifadenin 0 veya daha fazla oluşumuyla eşleşir. |
yeniden + | Önceki şeyden 1 veya daha fazlasıyla eşleşir. |
yeniden? | Önceki ifadenin 0 veya 1 oluşumuyla eşleşir. |
yeniden {n} | Önceki ifadenin tam olarak n sayıda oluşumuyla eşleşir. |
re {n,} | Önceki ifadenin n veya daha fazla oluşumuyla eşleşir. |
re {n, m} | Önceki ifadenin en az n ve en çok m oluşumuyla eşleşir. |
a | b | A veya b ile eşleşir. |
(yeniden) | Normal ifadeleri gruplandırır ve eşleşen metni hatırlar. |
(?: yeniden) | Normal ifadeleri eşleşen metni hatırlamadan gruplar. |
(?> yeniden) | Geriye dönmeden bağımsız modelle eşleşir. |
\ w | Kelime karakterleriyle eşleşir. |
\ W | Sözcük olmayan karakterlerle eşleşir. |
\ s | Beyaz boşlukla eşleşir. [\ T \ n \ r \ f] ile eşdeğerdir. |
\ S | Beyaz olmayan boşlukla eşleşir. |
\ d | Rakamlarla eşleşir. [0-9] ile eşdeğerdir. |
\ D | Sayı olmayanlarla eşleşir. |
\ A | Dizenin başlangıcıyla eşleşir. |
\ Z | Dizenin sonuyla eşleşir. Bir satırsonu varsa, yeni satırdan hemen önce eşleşir. |
\ z | Dizenin sonuyla eşleşir. |
\ G | Son maçın bittiği noktayla eşleşir. |
\ n | Grup numarası "n" için geri referans. |
\ b | Köşeli parantezlerin dışındayken kelime sınırlarıyla eşleşir. Parantezlerin içindeyken geri boşlukla (0x08) eşleşir. |
\ B | Sözcük olmayan sınırlarla eşleşir. |
\ n, \ t vb. | Yeni satırlarla, satır başlarıyla, sekmelerle vb. Eşleşir. |
\ Q | \ E'ye kadar tüm karakterlerden kaçın (tırnak işareti). |
\ E | \ Q ile başlayan alıntı biter. |
Matcher Sınıfının Yöntemleri
İşte kullanışlı örnek yöntemlerinin bir listesi -
Dizin Yöntemleri
Dizin yöntemleri, eşleşmenin giriş dizesinde tam olarak nerede bulunduğunu gösteren yararlı dizin değerleri sağlar -
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public int start() Önceki eşleşmenin başlangıç dizinini döndürür. |
2 | public int start(int group) Önceki eşleme işlemi sırasında belirli grup tarafından yakalanan alt dizinin başlangıç dizinini döndürür. |
3 | public int end() Eşleşen son karakterden sonraki uzaklığı döndürür. |
4 | public int end(int group) Önceki maç işlemi sırasında verilen grup tarafından yakalanan alt dizinin son karakterinden sonraki ofseti döndürür. |
Çalışma Yöntemleri
Çalışma yöntemleri giriş dizesini gözden geçirir ve kalıbın bulunup bulunmadığını belirten bir Boole döndürür -
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public boolean lookingAt() Girdi sırasını, bölgenin başlangıcından başlayarak modelle eşleştirmeye çalışır. |
2 | public boolean find() Desenle eşleşen giriş dizisinin sonraki alt dizisini bulmaya çalışır. |
3 | public boolean find(int start) Bu eşleştiriciyi sıfırlar ve ardından, belirtilen dizinden başlayarak modelle eşleşen giriş dizisinin bir sonraki alt dizisini bulmaya çalışır. |
4 | public boolean matches() Kalıpla tüm bölgeyi eşleştirmeye çalışır. |
Değiştirme Yöntemleri
Değiştirme yöntemleri, bir giriş dizesindeki metni değiştirmek için kullanışlı yöntemlerdir -
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) Terminal olmayan bir ekleme ve değiştirme adımını uygular. |
2 | public StringBuffer appendTail(StringBuffer sb) Bir uçbirim ekleme ve değiştirme adımını uygular. |
3 | public String replaceAll(String replacement) Desenle eşleşen giriş dizisinin her alt dizisini verilen değiştirme dizesiyle değiştirir. |
4 | public String replaceFirst(String replacement) Desenle eşleşen giriş dizisinin ilk alt dizisini verilen değiştirme dizesiyle değiştirir. |
5 | public static String quoteReplacement(String s) Belirtilen Dize için değişmez bir değiştirme Dize döndürür. Bu yöntem, değişmez bir değiştirme olarak çalışacak bir String üretir.s Matcher sınıfının appendReplacement yönteminde. |
Başlangıç ve bitiş Yöntemleri
Giriş dizesinde "kedi" kelimesinin kaç kez göründüğünü sayan örnek aşağıdadır -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static final String REGEX = "\\bcat\\b";
private static final String INPUT = "cat cat cat cattie cat";
public static void main( String args[] ) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // get a matcher object
int count = 0;
while(m.find()) {
count++;
System.out.println("Match number "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
Bu, aşağıdaki sonucu verecektir -
Output
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22
Bu örneğin "c" "a" "t" harflerinin yalnızca uzun bir kelimenin alt dizesi olmamasını sağlamak için kelime sınırları kullandığını görebilirsiniz. Ayrıca, eşleşmenin giriş dizesinin neresinde gerçekleştiğine dair bazı yararlı bilgiler de verir.
Başlangıç yöntemi, önceki eşleme işlemi sırasında verilen grup tarafından yakalanan alt dizinin başlangıç dizinini döndürür ve son, eşleşen son karakterin dizinini artı bir döndürür.
Eşleşmeler ve Görünüm Yöntemleri
Match ve lookingAt yöntemlerinin her ikisi de bir giriş sırasını bir modelle eşleştirmeye çalışır. Ancak aradaki fark, eşleşmelerin tüm giriş sırasının eşleştirilmesini gerektirmesi, ancak lookingAt'ın bunu yapmamasıdır.
Her iki yöntem de her zaman giriş dizesinin başlangıcında başlar. İşte işlevselliği açıklayan örnek -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static final String REGEX = "foo";
private static final String INPUT = "fooooooooooooooooo";
private static Pattern pattern;
private static Matcher matcher;
public static void main( String args[] ) {
pattern = Pattern.compile(REGEX);
matcher = pattern.matcher(INPUT);
System.out.println("Current REGEX is: "+REGEX);
System.out.println("Current INPUT is: "+INPUT);
System.out.println("lookingAt(): "+matcher.lookingAt());
System.out.println("matches(): "+matcher.matches());
}
}
Bu, aşağıdaki sonucu verecektir -
Output
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
ReplaceFirst ve replaceAll Yöntemleri
ReplaceFirst ve replaceAll yöntemleri, belirli bir normal ifadeyle eşleşen metni değiştirir. Adlarından da anlaşılacağı gibi, replaceFirst ilk geçtiği yerin yerine geçer ve replaceAll tüm yinelemelerin yerini alır.
İşte işlevselliği açıklayan örnek -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static String REGEX = "dog";
private static String INPUT = "The dog says meow. " + "All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
Bu, aşağıdaki sonucu verecektir -
Output
The cat says meow. All cats say meow.
AppendReplacement ve appendTail Yöntemleri
Matcher sınıfı, metin değişimi için appendReplacement ve appendTail yöntemlerini de sağlar.
İşte işlevselliği açıklayan örnek -
Example
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
private static String REGEX = "a*b";
private static String INPUT = "aabfooaabfooabfoob";
private static String REPLACE = "-";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
while(m.find()) {
m.appendReplacement(sb, REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
Bu, aşağıdaki sonucu verecektir -
Output
-foo-foo-foo-
PatternSyntaxException Sınıf Yöntemleri
PatternSyntaxException, normal ifade deseninde sözdizimi hatasını gösteren denetlenmemiş bir istisnadır. PatternSyntaxException sınıfı, neyin yanlış gittiğini belirlemenize yardımcı olacak aşağıdaki yöntemleri sağlar -
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public String getDescription() Hatanın açıklamasını alır. |
2 | public int getIndex() Hata indeksini alır. |
3 | public String getPattern() Hatalı normal ifade modelini alır. |
4 | public String getMessage() Sözdizimi hatasının açıklamasını ve dizini, hatalı normal ifade modelini ve kalıp içindeki hata dizininin görsel bir göstergesini içeren çok satırlı bir dize döndürür. |
Java yöntemi, bir işlemi gerçekleştirmek için birlikte gruplandırılan ifadeler koleksiyonudur. System.out'u aradığınızda.println() yöntem, örneğin, sistem konsolda bir mesaj görüntülemek için gerçekte birkaç deyimi yürütür.
Şimdi, dönüş değerleri olan veya olmayan kendi yöntemlerinizi nasıl oluşturacağınızı, parametreli veya parametresiz bir yöntemi çağırmayı ve program tasarımında yöntem soyutlamasını uygulamayı öğreneceksiniz.
Yöntem Oluşturma
Bir yöntemin sözdizimini açıklamak için aşağıdaki örneği göz önünde bulundurarak -
Syntax
public static int methodName(int a, int b) {
// body
}
Buraya,
public static - değiştirici
int - dönüş türü
methodName - yöntemin adı
a, b - resmi parametreler
int a, int b - parametrelerin listesi
Yöntem tanımı, bir yöntem başlığı ve bir yöntem gövdesinden oluşur. Aynısı aşağıdaki söz diziminde gösterilmektedir -
Syntax
modifier returnType nameOfMethod (Parameter List) {
// method body
}
Yukarıda gösterilen sözdizimi şunları içerir -
modifier - Yöntemin erişim türünü tanımlar ve kullanımı isteğe bağlıdır.
returnType - Yöntem bir değer döndürebilir.
nameOfMethod- Bu yöntem adıdır. Yöntem imzası, yöntem adı ve parametre listesinden oluşur.
Parameter List- Parametrelerin listesi, bir yöntemin türü, sırası ve parametrelerinin sayısıdır. Bunlar isteğe bağlıdır, yöntem sıfır parametre içerebilir.
method body - Yöntem gövdesi, yöntemin ifadelerle ne yaptığını tanımlar.
Example
İşte adı verilen yukarıda tanımlanan yöntemin kaynak kodu min(). Bu yöntem iki parametre num1 ve num2 alır ve ikisi arasındaki maksimum değeri döndürür -
/** the snippet returns the minimum between two numbers */
public static int minFunction(int n1, int n2) {
int min;
if (n1 > n2)
min = n2;
else
min = n1;
return min;
}
Yöntem Çağırma
Bir yöntemi kullanmak için çağrılmalıdır. Bir yöntemin çağrılmasının iki yolu vardır, yani, yöntem bir değer döndürür veya hiçbir şey döndürmez (dönüş değeri yok).
Yöntem çağırma süreci basittir. Bir program bir yöntemi çağırdığında, program kontrolü çağrılan yönteme aktarılır. Bu çağrılan yöntem daha sonra iki koşulda arayana kontrolü döndürür, eğer -
- dönüş ifadesi yürütülür.
- kapanış ayracını sonlandıran yönteme ulaşır.
Void döndüren yöntemler bir ifadeye çağrı olarak kabul edilir. Bir örnek düşünelim -
System.out.println("This is tutorialspoint.com!");
Değer döndüren yöntem aşağıdaki örnekle anlaşılabilir -
int result = sum(6, 9);
Aşağıda, bir yöntemin nasıl tanımlanacağını ve nasıl çağırılacağını gösteren örnek verilmiştir -
Example
public class ExampleMinNumber {
public static void main(String[] args) {
int a = 11;
int b = 6;
int c = minFunction(a, b);
System.out.println("Minimum Value = " + c);
}
/** returns the minimum of two numbers */
public static int minFunction(int n1, int n2) {
int min;
if (n1 > n2)
min = n2;
else
min = n1;
return min;
}
}
Bu, aşağıdaki sonucu verecektir -
Output
Minimum value = 6
Boş Anahtar Kelime
Void anahtar sözcüğü, bir değer döndürmeyen yöntemler oluşturmamızı sağlar. Burada, aşağıdaki örnekte bir void method methodRankPoints düşünüyoruz . Bu yöntem, herhangi bir değer döndürmeyen void yöntemidir. Bir void yöntemine yapılan çağrı bir ifade olmalıdır, yani methodRankPoints (255.7); . Aşağıdaki örnekte gösterildiği gibi noktalı virgülle biten bir Java ifadesidir.
Example
public class ExampleVoid {
public static void main(String[] args) {
methodRankPoints(255.7);
}
public static void methodRankPoints(double points) {
if (points >= 202.5) {
System.out.println("Rank:A1");
}else if (points >= 122.4) {
System.out.println("Rank:A2");
}else {
System.out.println("Rank:A3");
}
}
}
Bu, aşağıdaki sonucu verecektir -
Output
Rank:A1
Parametreleri Değere Göre Geçirme
Çağırma süreci altında çalışırken, argümanlar iletilmelidir. Bunlar, yöntem spesifikasyonundaki ilgili parametreler ile aynı sırada olmalıdır. Parametreler değere göre veya referans olarak aktarılabilir.
Parametreleri Değere Göre Geçirme, bir parametresi olan bir yöntemi çağırmak demektir. Bu sayede argüman değeri parametreye aktarılır.
Example
Aşağıdaki program, parametreyi değere göre geçirmenin bir örneğini göstermektedir. Bağımsız değişkenlerin değerleri, yöntem çağrıldıktan sonra bile aynı kalır.
public class swappingExample {
public static void main(String[] args) {
int a = 30;
int b = 45;
System.out.println("Before swapping, a = " + a + " and b = " + b);
// Invoke the swap method
swapFunction(a, b);
System.out.println("\n**Now, Before and After swapping values will be same here**:");
System.out.println("After swapping, a = " + a + " and b is " + b);
}
public static void swapFunction(int a, int b) {
System.out.println("Before swapping(Inside), a = " + a + " b = " + b);
// Swap n1 with n2
int c = a;
a = b;
b = c;
System.out.println("After swapping(Inside), a = " + a + " b = " + b);
}
}
Bu, aşağıdaki sonucu verecektir -
Output
Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30
**Now, Before and After swapping values will be same here**:
After swapping, a = 30 and b is 45
Yöntem Aşırı Yükleme
Bir sınıf aynı ada ancak farklı parametrelere sahip iki veya daha fazla yönteme sahip olduğunda, bu yöntem aşırı yükleme olarak bilinir. Geçersiz kılmaktan farklıdır. Geçersiz kılmada, bir yöntem aynı yöntem adına, türüne, parametre sayısına vb. Sahiptir.
Minimum tam sayı türü sayısını bulmak için daha önce tartışılan örneği ele alalım. Diyelim ki minimum sayıda double türü bulmak istiyoruz. Daha sonra aynı isimde ancak farklı parametrelere sahip iki veya daha fazla yöntem oluşturmak için aşırı yükleme kavramı tanıtılacaktır.
Aşağıdaki örnek aynı şeyi açıklıyor -
Example
public class ExampleOverloading {
public static void main(String[] args) {
int a = 11;
int b = 6;
double c = 7.3;
double d = 9.4;
int result1 = minFunction(a, b);
// same function name with different parameters
double result2 = minFunction(c, d);
System.out.println("Minimum Value = " + result1);
System.out.println("Minimum Value = " + result2);
}
// for integer
public static int minFunction(int n1, int n2) {
int min;
if (n1 > n2)
min = n2;
else
min = n1;
return min;
}
// for double
public static double minFunction(double n1, double n2) {
double min;
if (n1 > n2)
min = n2;
else
min = n1;
return min;
}
}
Bu, aşağıdaki sonucu verecektir -
Output
Minimum Value = 6
Minimum Value = 7.3
Aşırı yükleme yöntemleri programı okunabilir hale getirir. Burada iki yöntem aynı isimle ancak farklı parametrelerle verilmiştir. Tam sayı ve çift türlerden minimum sayı sonuçtur.
Komut Satırı Bağımsız Değişkenlerini Kullanma
Bazen, çalıştırdığınızda bir programa bazı bilgiler aktarmak isteyebilirsiniz. Bu, komut satırı argümanlarını main () 'e ileterek gerçekleştirilir.
Komut satırı argümanı, program çalıştırıldığında komut satırında doğrudan programın adını takip eden bilgidir. Bir Java programı içindeki komut satırı argümanlarına erişmek oldukça kolaydır. Main () 'e iletilen String dizisinde dizeler olarak saklanırlar.
Example
Aşağıdaki program çağrıldığı tüm komut satırı bağımsız değişkenlerini görüntüler -
public class CommandLine {
public static void main(String args[]) {
for(int i = 0; i<args.length; i++) {
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
Bu programı burada gösterildiği gibi çalıştırmayı deneyin -
$java CommandLine this is a command line 200 -100
Bu, aşağıdaki sonucu verecektir -
Output
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
This anahtar sözcüğü
thisJava'da mevcut sınıfın nesnesine, bir örnek yöntemde veya bir kurucuda referans olarak kullanılan bir anahtar sözcüktür. Bunu kullanarak yapıcılar, değişkenler ve yöntemler gibi bir sınıfın üyelerine başvurabilirsiniz.
Note- this yalnızca örnek yöntemlerde veya yapıcılarda kullanılan anahtar sözcük
Genel olarak, bunun için kullanılan anahtar kelime -
Bir yapıcı veya yöntem içinde aynı ada sahiplerse örnek değişkenlerini yerel değişkenlerden ayırın.
class Student {
int age;
Student(int age) {
this.age = age;
}
}
Bir sınıftaki diğerinden bir tür yapıcı (Parametreli yapıcı veya varsayılan) çağırın. Açık yapıcı çağrısı olarak bilinir.
class Student {
int age
Student() {
this(20);
}
Student(int age) {
this.age = age;
}
}
Example
İşte bir sınıfın üyelerine erişmek için bu anahtar kelimeyi kullanan bir örnek . Aşağıdaki programı kopyalayıp adıyla bir dosyaya yapıştırın,This_Example.java.
public class This_Example {
// Instance variable num
int num = 10;
This_Example() {
System.out.println("This is an example program on keyword this");
}
This_Example(int num) {
// Invoking the default constructor
this();
// Assigning the local variable num to the instance variable num
this.num = num;
}
public void greet() {
System.out.println("Hi Welcome to Tutorialspoint");
}
public void print() {
// Local variable num
int num = 20;
// Printing the local variable
System.out.println("value of local variable num is : "+num);
// Printing the instance variable
System.out.println("value of instance variable num is : "+this.num);
// Invoking the greet method of a class
this.greet();
}
public static void main(String[] args) {
// Instantiating the class
This_Example obj1 = new This_Example();
// Invoking the print method
obj1.print();
// Passing a new value to the num variable through Parameterized constructor
This_Example obj2 = new This_Example(30);
// Invoking the print method again
obj2.print();
}
}
Bu, aşağıdaki sonucu verecektir -
Output
This is an example program on keyword this
value of local variable num is : 20
value of instance variable num is : 10
Hi Welcome to Tutorialspoint
This is an example program on keyword this
value of local variable num is : 20
value of instance variable num is : 30
Hi Welcome to Tutorialspoint
Değişken Bağımsız Değişkenler (var-args)
JDK 1.5, aynı türden değişken sayıda argümanı bir yönteme aktarmanıza olanak tanır. Yöntemdeki parametre aşağıdaki gibi bildirilir -
typeName... parameterName
Yöntem bildiriminde, türü ve ardından bir üç nokta (...) belirtirsiniz. Bir yöntemde yalnızca bir değişken uzunluklu parametre belirtilebilir ve bu parametre son parametre olmalıdır. Herhangi bir normal parametre ondan önce gelmelidir.
Example
public class VarargsDemo {
public static void main(String args[]) {
// Call method with variable args
printMax(34, 3, 3, 2, 56.5);
printMax(new double[]{1, 2, 3});
}
public static void printMax( double... numbers) {
if (numbers.length == 0) {
System.out.println("No argument passed");
return;
}
double result = numbers[0];
for (int i = 1; i < numbers.length; i++)
if (numbers[i] > result)
result = numbers[i];
System.out.println("The max value is " + result);
}
}
Bu, aşağıdaki sonucu verecektir -
Output
The max value is 56.5
The max value is 3.0
Finalize () Yöntemi
Çöp toplayıcı tarafından bir nesnenin nihai yıkımından hemen önce çağrılacak bir yöntem tanımlamak mümkündür. Bu yöntemefinalize( )ve bir nesnenin temiz bir şekilde sona ermesini sağlamak için kullanılabilir.
Örneğin, o nesneye ait açık bir dosyanın kapatıldığından emin olmak için finalize () kullanabilirsiniz.
Bir sınıfa bir sonlandırıcı eklemek için, finalize () yöntemini tanımlamanız yeterlidir. Java çalışma zamanı, o sınıftaki bir nesneyi geri dönüştürmek üzereyken bu yöntemi çağırır.
Finalize () yönteminin içinde, bir nesne yok edilmeden önce gerçekleştirilmesi gereken eylemleri belirteceksiniz.
Finalize () yöntemi şu genel biçime sahiptir -
protected void finalize( ) {
// finalization code here
}
Burada, korumalı anahtar sözcük, sınıfı dışında tanımlanan kodla finalize () öğesine erişimi engelleyen bir belirteçtir.
Bu, finalize () işlevinin ne zaman yürütüleceğini veya hatta çalışıp çalışmayacağını bilemeyeceğiniz anlamına gelir. Örneğin, programınız çöp toplama gerçekleşmeden önce biterse, finalize () çalışmayacaktır.
Java.io paketi, Java'da girdi ve çıktı (G / Ç) gerçekleştirmek için ihtiyaç duyabileceğiniz neredeyse her sınıfı içerir. Tüm bu akışlar bir giriş kaynağını ve bir çıkış hedefini temsil eder. Java.io paketindeki akış, ilkel öğeler, nesne, yerelleştirilmiş karakterler gibi birçok veriyi destekler.
Akış
Bir akış, bir veri dizisi olarak tanımlanabilir. İki tür Akış vardır -
InPutStream - InputStream, bir kaynaktan veri okumak için kullanılır.
OutPutStream - OutputStream, verileri bir hedefe yazmak için kullanılır.
Java, dosyalar ve ağlarla ilgili G / Ç için güçlü ancak esnek destek sağlar ancak bu eğitim, akışlar ve G / Ç ile ilgili çok temel işlevleri kapsar. En sık kullanılan örnekleri tek tek göreceğiz -
Bayt Akışları
Java bayt akışları, 8 bitlik baytların giriş ve çıkışını gerçekleştirmek için kullanılır. Bayt akışlarıyla ilgili birçok sınıf olmasına rağmen, en sık kullanılan sınıflar şunlardır:FileInputStream ve FileOutputStream. Aşağıda, bir girdi dosyasını bir çıktı dosyasına kopyalamak için bu iki sınıfı kullanan bir örnek verilmiştir -
Example
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("input.txt");
out = new FileOutputStream("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Şimdi bir dosya alalım input.txt aşağıdaki içerikle -
This is test for copy file.
Bir sonraki adım olarak, yukarıdaki programı derleyin ve çalıştırın, bu da input.txt'de olduğu gibi aynı içeriğe sahip output.txt dosyası oluşturmamıza neden olacaktır. O halde yukarıdaki kodu CopyFile.java dosyasına koyalım ve aşağıdakileri yapalım -
$javac CopyFile.java $java CopyFile
Karakter Akışları
Java Byte akışlar, 8 bitlik baytların giriş ve çıkışını gerçekleştirmek için kullanılırken, Java Characterakışlar, 16 bitlik unicode için girdi ve çıktı gerçekleştirmek için kullanılır. Karakter akışlarıyla ilgili birçok sınıf olmasına rağmen en sık kullanılan sınıflar şunlardır:FileReader ve FileWriter. FileReader dahili olarak FileInputStream kullanıyor ve FileWriter FileOutputStream kullanıyor ancak buradaki en büyük fark, FileReader'ın bir seferde iki bayt okuması ve FileWriter'ın bir seferde iki bayt yazmasıdır.
Yukarıdaki örneği yeniden yazabiliriz, bu da bu iki sınıfın bir girdi dosyasını (unicode karakterleri olan) bir çıktı dosyasına kopyalamak için kullanmasını sağlar -
Example
import java.io.*;
public class CopyFile {
public static void main(String args[]) throws IOException {
FileReader in = null;
FileWriter out = null;
try {
in = new FileReader("input.txt");
out = new FileWriter("output.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Şimdi bir dosya alalım input.txt aşağıdaki içerikle -
This is test for copy file.
Bir sonraki adım olarak, yukarıdaki programı derleyin ve çalıştırın, bu da input.txt'de olduğu gibi aynı içeriğe sahip output.txt dosyası oluşturmamıza neden olacaktır. O halde yukarıdaki kodu CopyFile.java dosyasına koyalım ve aşağıdakileri yapalım -
$javac CopyFile.java $java CopyFile
Standart Akışlar
Tüm programlama dilleri, kullanıcının programının bir klavyeden girdi alabildiği ve ardından bilgisayar ekranında bir çıktı üretebildiği standart G / Ç desteği sağlar. C veya C ++ programlama dillerinin farkındaysanız, üç standart cihaz STDIN, STDOUT ve STDERR konusunda bilgi sahibi olmalısınız. Benzer şekilde, Java aşağıdaki üç standart akışı sağlar -
Standard Input - Bu, verileri kullanıcının programına beslemek için kullanılır ve genellikle bir klavye standart giriş akışı olarak kullanılır ve şu şekilde gösterilir: System.in.
Standard Output - Bu, kullanıcının programı tarafından üretilen verilerin çıktısını almak için kullanılır ve genellikle standart çıktı akışı için bir bilgisayar ekranı kullanılır ve şu şekilde gösterilir: System.out.
Standard Error - Bu, kullanıcının programı tarafından üretilen hata verilerini çıkarmak için kullanılır ve genellikle standart hata akışı için bir bilgisayar ekranı kullanılır ve şu şekilde gösterilir: System.err.
Aşağıdaki basit bir programdır. InputStreamReader kullanıcı "q" yazana kadar standart giriş akışını okumak için -
Example
import java.io.*;
public class ReadConsole {
public static void main(String args[]) throws IOException {
InputStreamReader cin = null;
try {
cin = new InputStreamReader(System.in);
System.out.println("Enter characters, 'q' to quit.");
char c;
do {
c = (char) cin.read();
System.out.print(c);
} while(c != 'q');
}finally {
if (cin != null) {
cin.close();
}
}
}
}
Yukarıdaki kodu ReadConsole.java dosyasında tutalım ve aşağıdaki programda gösterildiği gibi derleyip çalıştırmaya çalışalım. Bu program, 'q' tuşuna basana kadar aynı karakteri okumaya ve çıktı vermeye devam eder -
$javac ReadConsole.java $java ReadConsole
Enter characters, 'q' to quit.
1
1
e
e
q
q
Dosyaları Okuma ve Yazma
Daha önce açıklandığı gibi, bir akış bir veri dizisi olarak tanımlanabilir. InputStream bir kaynaktan veri okumak için kullanılır ve OutputStream bir hedefe veri yazmak için kullanılır.
Burada, Giriş ve Çıkış akışlarıyla ilgilenmek için bir sınıf hiyerarşisi verilmiştir.
İki önemli akım FileInputStream ve FileOutputStream, bu eğitimde tartışılacak.
FileInputStream
Bu akış, dosyalardan veri okumak için kullanılır. Anahtar sözcük kullanılarak nesneler oluşturulabilirnew ve çeşitli yapıcı türleri mevcuttur.
Aşağıdaki kurucu, dosyayı okumak için bir giriş akışı nesnesi oluşturmak üzere dizge olarak bir dosya adı alır -
InputStream f = new FileInputStream("C:/java/hello");
Aşağıdaki kurucu, dosyayı okumak için bir giriş akışı nesnesi oluşturmak üzere bir dosya nesnesi alır. Önce aşağıdaki gibi File () yöntemini kullanarak bir dosya nesnesi oluşturuyoruz -
File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);
Elinizde InputStream nesnesine sahip olduğunuzda, akışa okumak veya akış üzerinde diğer işlemleri yapmak için kullanılabilecek yardımcı yöntemlerin bir listesi vardır.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public void close() throws IOException{} Bu yöntem, dosya çıkış akışını kapatır. Dosyayla ilişkili tüm sistem kaynaklarını serbest bırakır. Bir IOException oluşturur. |
2 | protected void finalize()throws IOException {} Bu yöntem, dosyaya olan bağlantıyı temizler. Bu dosya çıkış akışının kapatma yönteminin, bu akışa başka başvuru olmadığında çağrılmasını sağlar. Bir IOException oluşturur. |
3 | public int read(int r)throws IOException{} Bu yöntem, InputStream'den belirtilen veri baytını okur. Bir int döndürür. Sonraki veri baytını döndürür ve dosyanın sonu ise -1 döndürülür. |
4 | public int read(byte[] r) throws IOException{} Bu yöntem, girdi akışından r.length baytlarını bir diziye okur. Okunan toplam bayt sayısını döndürür. Dosyanın sonuysa -1 döndürülür. |
5 | public int available() throws IOException{} Bu dosya giriş akışından okunabilen bayt sayısını verir. Bir int döndürür. |
Mevcut başka önemli giriş akışları da vardır, daha fazla ayrıntı için aşağıdaki bağlantılara başvurabilirsiniz -
ByteArrayInputStream
DataInputStream
FileOutputStream
FileOutputStream, bir dosya oluşturmak ve içine veri yazmak için kullanılır. Akış, çıktı için açmadan önce, zaten mevcut değilse bir dosya oluşturur.
FileOutputStream nesnesi oluşturmak için kullanılabilecek iki yapıcı burada verilmiştir.
Aşağıdaki kurucu, dosyayı yazmak üzere bir giriş akışı nesnesi oluşturmak için dizge olarak bir dosya adı alır -
OutputStream f = new FileOutputStream("C:/java/hello")
Aşağıdaki kurucu, dosyayı yazmak üzere bir çıktı akış nesnesi oluşturmak için bir dosya nesnesi alır. Öncelikle File () yöntemini kullanarak aşağıdaki gibi bir dosya nesnesi oluşturuyoruz -
File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);
Elinizde OutputStream nesnesine sahip olduğunuzda, akışa yazmak veya akış üzerinde diğer işlemleri yapmak için kullanılabilecek yardımcı yöntemlerin bir listesi vardır.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public void close() throws IOException{} Bu yöntem, dosya çıkış akışını kapatır. Dosyayla ilişkili tüm sistem kaynaklarını serbest bırakır. Bir IOException oluşturur. |
2 | protected void finalize()throws IOException {} Bu yöntem, dosyaya olan bağlantıyı temizler. Bu dosya çıkış akışının kapatma yönteminin, bu akışa başka başvuru olmadığında çağrılmasını sağlar. Bir IOException oluşturur. |
3 | public void write(int w)throws IOException{} Bu yöntem, belirtilen baytı çıktı akışına yazar. |
4 | public void write(byte[] w) Belirtilen bayt dizisindeki w.length baytlarını OutputStream'e yazar. |
Diğer önemli çıktı akışları da mevcuttur, daha fazla ayrıntı için aşağıdaki bağlantılara başvurabilirsiniz -
ByteArrayOutputStream
DataOutputStream
Example
InputStream ve OutputStream'i gösteren örnek aşağıdadır -
import java.io.*;
public class fileStreamTest {
public static void main(String args[]) {
try {
byte bWrite [] = {11,21,3,40,5};
OutputStream os = new FileOutputStream("test.txt");
for(int x = 0; x < bWrite.length ; x++) {
os.write( bWrite[x] ); // writes the bytes
}
os.close();
InputStream is = new FileInputStream("test.txt");
int size = is.available();
for(int i = 0; i < size; i++) {
System.out.print((char)is.read() + " ");
}
is.close();
} catch (IOException e) {
System.out.print("Exception");
}
}
}
Yukarıdaki kod test.txt dosyasını oluşturacak ve verilen sayıları ikili biçimde yazacaktır. Standart çıkış ekranındaki çıktı da aynı olacaktır.
Dosyada Gezinme ve G / Ç
Dosya Gezinme ve G / Ç'nin temellerini öğrenmek için kullanacağımız birkaç sınıf daha var.
Dosya Sınıfı
FileReader Sınıfı
FileWriter Sınıfı
Java'daki dizinler
Bir dizin, diğer dosya ve dizinlerin bir listesini içerebilen bir Dosyadır. KullanFilenesne dizinler oluşturmak, bir dizinde bulunan dosyaları listelemek için kullanılır. Tam ayrıntı için, Dosya nesnesinde çağırabileceğiniz tüm yöntemlerin ve dizinlerle ilgili olanların bir listesini kontrol edin.
Dizinler Oluşturma
İki yararlı var File dizin oluşturmak için kullanılabilecek yardımcı program yöntemleri -
mkdir( )yöntem bir dizin oluşturur ve başarı durumunda true, başarısızlık durumunda false döndürür. Hata, File nesnesinde belirtilen yolun zaten mevcut olduğunu veya yolun tamamı henüz mevcut olmadığı için dizinin oluşturulamayacağını gösterir.
mkdirs() yöntem hem bir dizin hem de dizinin tüm üst öğelerini oluşturur.
Aşağıdaki örnek "/ tmp / user / java / bin" dizinini oluşturur -
Example
import java.io.File;
public class CreateDir {
public static void main(String args[]) {
String dirname = "/tmp/user/java/bin";
File d = new File(dirname);
// Create directory now.
d.mkdirs();
}
}
"/ Tmp / user / java / bin" oluşturmak için yukarıdaki kodu derleyin ve çalıştırın.
Note- Java, UNIX ve Windows'ta kurallara göre otomatik olarak yol ayırıcılarla ilgilenir. Java'nın Windows sürümünde eğik çizgi (/) kullanırsanız, yol yine de doğru şekilde çözülecektir.
Listeleme Dizinleri
Kullanabilirsiniz list( ) tarafından sağlanan yöntem File aşağıdaki gibi bir dizinde bulunan tüm dosyaları ve dizinleri listelemek için nesne -
Example
import java.io.File;
public class ReadDir {
public static void main(String[] args) {
File file = null;
String[] paths;
try {
// create new file object
file = new File("/tmp");
// array of files and directory
paths = file.list();
// for each name in the path array
for(String path:paths) {
// prints filename and directory name
System.out.println(path);
}
} catch (Exception e) {
// if any error occurs
e.printStackTrace();
}
}
}
Bu, cihazınızda bulunan dizinlere ve dosyalara göre aşağıdaki sonucu verecektir. /tmp dizin -
Output
test1.txt
test2.txt
ReadDir.java
ReadDir.class
İstisna (veya istisnai olay), bir programın yürütülmesi sırasında ortaya çıkan bir sorundur. Ne zamanException programın normal akışı bozulur ve program / Uygulama anormal şekilde sona erer, ki bu tavsiye edilmez, bu nedenle bu istisnalar ele alınmalıdır.
Birçok farklı nedenden dolayı bir istisna meydana gelebilir. Aşağıda, bir istisnanın meydana geldiği bazı senaryolar verilmiştir.
Bir kullanıcı geçersiz bir veri girdi.
Açılması gereken bir dosya bulunamıyor.
İletişimin ortasında bir ağ bağlantısı kesildi veya JVM'nin belleği doldu.
Bu istisnalardan bazıları kullanıcı hatasından, diğerleri programcı hatasından ve diğerleri bir şekilde başarısız olan fiziksel kaynaklardan kaynaklanır.
Bunlara dayanarak, üç istisna kategorimiz var. Java'da istisna işlemenin nasıl çalıştığını bilmek için onları anlamanız gerekir.
Checked exceptions- Kontrol edilen istisna, derleme zamanında derleyici tarafından kontrol edilen (bildirilen) bir istisnadır, bunlara ayrıca derleme zamanı istisnaları da denir. Bu istisnalar basitçe göz ardı edilemez, programcı bu istisnalara dikkat etmelidir (ele almalıdır).
Örneğin, kullanıyorsanız FileReaderOluşturucusunda belirtilen dosya yoksa, bir FileNotFoundException oluşur ve derleyici programcıdan istisnayı işlemesini ister.
Misal
import java.io.File;
import java.io.FileReader;
public class FilenotFound_Demo {
public static void main(String args[]) {
File file = new File("E://file.txt");
FileReader fr = new FileReader(file);
}
}
Yukarıdaki programı derlemeye çalışırsanız, aşağıdaki istisnaları alırsınız.
Çıktı
C:\>javac FilenotFound_Demo.java
FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
FileReader fr = new FileReader(file);
^
1 error
Note - Yöntemlerden beri read() ve close() of FileReader sınıfı IOException oluşturur, derleyicinin FileNotFoundException ile birlikte IOException'ı işlemek için bildirimde bulunduğunu gözlemleyebilirsiniz.
Unchecked exceptions- Denetlenmemiş bir istisna, yürütme sırasında meydana gelen bir istisnadır. Bunlar aynı zamandaRuntime Exceptions. Bunlar, mantık hataları veya bir API'nin uygunsuz kullanımı gibi programlama hatalarını içerir. Çalışma zamanı istisnaları, derleme sırasında göz ardı edilir.
Eğer programda büyüklüğü 5 dizisi beyan ve 6 aramaya çalışıyorum varsa Örneğin, inci dizinin elemanını daha sonra bir ArrayIndexOutOfBoundsExceptionexception oluşur.
Misal
public class Unchecked_Demo {
public static void main(String args[]) {
int num[] = {1, 2, 3, 4};
System.out.println(num[5]);
}
}
Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki istisnayı alırsınız.
Çıktı
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at Exceptions.Unchecked_Demo.main(Unchecked_Demo.java:8)
Errors- Bunlar hiçbir şekilde istisna değildir, ancak kullanıcının veya programcının kontrolü dışında ortaya çıkan sorunlardır. Bir hata hakkında nadiren herhangi bir şey yapabileceğiniz için, kodunuzda hatalar genellikle yok sayılır. Örneğin, bir yığın taşması meydana gelirse, bir hata ortaya çıkacaktır. Derleme sırasında da dikkate alınmazlar.
İstisna Hiyerarşisi
Tüm istisna sınıfları, java.lang.Exception sınıfının alt türleridir. İstisna sınıfı, Throwable sınıfının bir alt sınıfıdır. İstisna sınıfı dışında, Throwable sınıfından türetilen Error adında başka bir alt sınıf vardır.
Hatalar, ciddi arızalar durumunda ortaya çıkan anormal durumlardır, bunlar Java programları tarafından ele alınmaz. Çalışma zamanı ortamı tarafından oluşturulan hataları belirtmek için hatalar üretilir. Örnek: JVM bellek yetersiz. Normalde programlar hatalardan kurtulamaz.
Exception sınıfının iki ana alt sınıfı vardır: IOException sınıfı ve RuntimeException Sınıfı.
Aşağıda, en yaygın olarak kontrol edilen ve kontrol edilmeyen Java'nın Yerleşik İstisnalarının bir listesi bulunmaktadır .
İstisna Yöntemleri
Throwable sınıfında bulunan önemli yöntemlerin listesi aşağıdadır.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public String getMessage() Oluşan istisna hakkında ayrıntılı bir mesaj verir. Bu mesaj Throwable yapıcısında başlatılır. |
2 | public Throwable getCause() Throwable nesne tarafından temsil edildiği şekliyle istisnanın nedenini döndürür. |
3 | public String toString() GetMessage () sonucuyla birleştirilen sınıfın adını döndürür. |
4 | public void printStackTrace() ToString () sonucunu yığın izlemeyle birlikte System.err, hata çıktı akışı olarak yazdırır. |
5 | public StackTraceElement [] getStackTrace() Yığın izlemesindeki her bir öğeyi içeren bir dizi döndürür. 0 dizinindeki öğe, çağrı yığınının üstünü temsil eder ve dizideki son öğe, çağrı yığınının altındaki yöntemi temsil eder. |
6 | public Throwable fillInStackTrace() Bu Throwable nesnesinin yığın izlemesini, yığın izlemedeki önceki bilgilere ekleyerek geçerli yığın izlemesiyle doldurur. |
İstisnaları Yakalama
Bir yöntem, bir try ve catchanahtar kelimeler. Bir istisna oluşturabilecek kodun etrafına bir dene / yakala bloğu yerleştirilir. Bir dene / yakala bloğundaki kod korumalı kod olarak adlandırılır ve dene / yakala kullanımının sözdizimi aşağıdaki gibi görünür -
Sözdizimi
try {
// Protected code
} catch (ExceptionName e1) {
// Catch block
}
İstisnalara açık olan kod, try bloğuna yerleştirilir. Bir istisna meydana geldiğinde, bu istisna, kendisiyle ilişkilendirilmiş catch bloğu tarafından ele alınır. Her try bloğunun hemen ardından bir catch bloğu veya nihayet bloğu gelmelidir.
Bir catch deyimi, yakalamaya çalıştığınız istisna türünü bildirmeyi içerir. Korumalı kodda bir istisna meydana gelirse, denemeyi izleyen catch bloğu (veya blokları) kontrol edilir. Oluşan istisna türü bir catch bloğunda listelenirse, istisna, bir bağımsız değişken bir yöntem parametresine iletildiği gibi catch bloğuna iletilir.
Misal
Aşağıdaki 2 elemanlı bir dizidir. Daha sonra kod , bir istisna atan dizinin 3. öğesine erişmeye çalışır .
// File Name : ExcepTest.java
import java.io.*;
public class ExcepTest {
public static void main(String args[]) {
try {
int a[] = new int[2];
System.out.println("Access element three :" + a[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Exception thrown :" + e);
}
System.out.println("Out of the block");
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block
Çoklu Yakalama Blokları
Bir try bloğunun ardından birden fazla catch bloğu gelebilir. Birden çok yakalama bloğu için sözdizimi aşağıdaki gibi görünür -
Sözdizimi
try {
// Protected code
} catch (ExceptionType1 e1) {
// Catch block
} catch (ExceptionType2 e2) {
// Catch block
} catch (ExceptionType3 e3) {
// Catch block
}
Önceki ifadeler üç catch bloğunu gösterir, ancak tek bir denemeden sonra bunlardan istediğiniz kadarına sahip olabilirsiniz. Korunan kodda bir istisna oluşursa, istisna listedeki ilk catch bloğuna atılır. Atılan istisnanın veri türü ExceptionType1 ile eşleşirse, orada yakalanır. Aksi takdirde, istisna ikinci catch ifadesine aktarılır. Bu, istisna yakalanana veya tüm yakalamalardan geçene kadar devam eder, bu durumda geçerli yöntem yürütmeyi durdurur ve istisna, çağrı yığınındaki önceki yönteme atılır.
Misal
Birden çok dene / yakala ifadesinin nasıl kullanılacağını gösteren kod bölümü.
try {
file = new FileInputStream(fileName);
x = (byte) file.read();
} catch (IOException i) {
i.printStackTrace();
return -1;
} catch (FileNotFoundException f) // Not valid! {
f.printStackTrace();
return -1;
}
Birden Fazla İstisna Türünü Yakalama
Java 7'den beri, tek bir yakalama bloğu kullanarak birden fazla istisnayı işleyebilirsiniz, bu özellik kodu basitleştirir. İşte bunu nasıl yapardınız -
catch (IOException|FileNotFoundException ex) {
logger.log(ex);
throw ex;
Fırlatma / Atma Anahtar Kelimeleri
Bir yöntem kontrol edilen bir istisnayı işlemezse, yöntemin bunu kullanarak bildirmesi gerekir. throwsanahtar kelime. Throws anahtar sözcüğü bir yöntemin imzasının sonunda görünür.
Kullanarak, yeni başlatılmış bir istisna veya yeni yakaladığınız bir istisna atabilirsiniz. throw anahtar kelime.
Fırlatma ve atma anahtar sözcükleri arasındaki farkı anlamaya çalışın, fırlatmalar , kontrol edilen bir istisnanın işlenmesini ertelemek için kullanılır ve fırlatma , bir istisnayı açıkça çağırmak için kullanılır.
Aşağıdaki yöntem, bir RemoteException oluşturduğunu bildirir -
Misal
import java.io.*;
public class className {
public void deposit(double amount) throws RemoteException {
// Method implementation
throw new RemoteException();
}
// Remainder of class definition
}
Bir yöntem, birden fazla istisna attığını bildirebilir, bu durumda istisnalar virgülle ayrılmış bir listede bildirilir. Örneğin, aşağıdaki yöntem bir RemoteException ve InsufficientFundsException attığını bildirir -
Misal
import java.io.*;
public class className {
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException {
// Method implementation
}
// Remainder of class definition
}
Nihayet Blok
Nihayet bloğu, bir try bloğunu veya bir catch bloğunu takip eder. Nihayetinde bir kod bloğu, bir İstisnanın ortaya çıkmasına bakılmaksızın her zaman yürütülür.
Nihayet bloğunun kullanılması, korumalı kodda ne olursa olsun, yürütmek istediğiniz herhangi bir temizleme türü ifadesini çalıştırmanıza olanak tanır.
Catch bloklarının sonunda bir nihayet bloğu görünür ve aşağıdaki sözdizimine sahiptir -
Sözdizimi
try {
// Protected code
} catch (ExceptionType1 e1) {
// Catch block
} catch (ExceptionType2 e2) {
// Catch block
} catch (ExceptionType3 e3) {
// Catch block
}finally {
// The finally block always executes.
}
Misal
public class ExcepTest {
public static void main(String args[]) {
int a[] = new int[2];
try {
System.out.println("Access element three :" + a[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Exception thrown :" + e);
}finally {
a[0] = 6;
System.out.println("First element value: " + a[0]);
System.out.println("The finally statement is executed");
}
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed
Aşağıdakilere dikkat edin -
Bir try ifadesi olmadan catch cümlesi var olamaz.
Bir dene / yakala bloğu mevcut olduğunda nihayet cümleciklerine sahip olmak zorunlu değildir.
Try bloğu, catch yan tümcesi veya nihayet yan tümcesi olmadan mevcut olamaz.
Try, catch, nihayet blokları arasında herhangi bir kod bulunamaz.
Kaynaklarla deneme
Genel olarak, akışlar, bağlantılar vb. Gibi kaynakları kullandığımızda, bunları nihayet blok kullanarak açıkça kapatmamız gerekir. Aşağıdaki programda, bir dosyadan verileri okuyoruz.FileReader ve nihayet bloğu kullanarak kapatıyoruz.
Misal
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class ReadData_Demo {
public static void main(String args[]) {
FileReader fr = null;
try {
File file = new File("file.txt");
fr = new FileReader(file); char [] a = new char[50];
fr.read(a); // reads the content to the array
for(char c : a)
System.out.print(c); // prints the characters one by one
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
try-with-resourcesolarak da anılır automatic resource management, Java 7'de sunulan, try catch bloğu içinde kullanılan kaynakları otomatik olarak kapatan yeni bir istisna işleme mekanizmasıdır.
Bu ifadeyi kullanmak için, gerekli kaynakları parantez içinde bildirmeniz yeterlidir ve oluşturulan kaynak bloğun sonunda otomatik olarak kapatılacaktır. Kaynakla deneme ifadesinin sözdizimi aşağıdadır.
Sözdizimi
try(FileReader fr = new FileReader("file path")) {
// use the resource
} catch () {
// body of catch
}
}
Aşağıda, kaynakları dene deyimini kullanarak bir dosyadaki verileri okuyan program verilmiştir.
Misal
import java.io.FileReader;
import java.io.IOException;
public class Try_withDemo {
public static void main(String args[]) {
try(FileReader fr = new FileReader("E://file.txt")) {
char [] a = new char[50];
fr.read(a); // reads the contentto the array
for(char c : a)
System.out.print(c); // prints the characters one by one
} catch (IOException e) {
e.printStackTrace();
}
}
}
Kaynaklarla deneme ifadesiyle çalışırken aşağıdaki noktalar akılda tutulmalıdır.
Kaynakları dene deyimi olan bir sınıfı kullanmak için uygulaması gerekir AutoCloseable arayüz ve close() yöntemi çalışma zamanında otomatik olarak çağrılır.
Kaynakları dene deyiminde birden fazla sınıf bildirebilirsiniz.
Kaynakları dene deyiminin try bloğunda birden çok sınıf bildirirken, bu sınıflar ters sırada kapatılır.
Parantez içindeki kaynakların bildirimi dışında, her şey bir try bloğunun normal dene / yakala bloğuyla aynıdır.
Try'de bildirilen kaynak, try bloğunun başlamasından hemen önce somutlaştırılır.
Try bloğunda bildirilen kaynak örtük olarak nihai olarak bildirilir.
Kullanıcı Tanımlı İstisnalar
Java'da kendi istisnalarınızı oluşturabilirsiniz. Kendi istisna sınıflarınızı yazarken aşağıdaki noktaları aklınızda bulundurun -
Tüm istisnalar, Fırlatılabilir bir çocuk olmalıdır.
Tutamaç veya Bildirme Kuralı tarafından otomatik olarak zorlanan kontrol edilmiş bir istisna yazmak istiyorsanız, Exception sınıfını genişletmeniz gerekir.
Bir çalışma zamanı istisnası yazmak istiyorsanız, RuntimeException sınıfını genişletmeniz gerekir.
Kendi Exception sınıfımızı aşağıdaki gibi tanımlayabiliriz -
class MyException extends Exception {
}
Önceden tanımlanmış olanı genişletmeniz yeterlidir. Exceptionkendi İstisnanızı oluşturmak için sınıf. Bunlar istisnai durumlar olarak değerlendirilir. AşağıdakiInsufficientFundsExceptionsınıfı, Exception sınıfını genişleten ve onu kontrol edilen bir istisna yapan kullanıcı tanımlı bir istisnadır. Bir istisna sınıfı, kullanışlı alanlar ve yöntemler içeren diğer sınıflar gibidir.
Misal
// File Name InsufficientFundsException.java
import java.io.*;
public class InsufficientFundsException extends Exception {
private double amount;
public InsufficientFundsException(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
Kullanıcı tanımlı istisnamızı kullanmayı göstermek için, aşağıdaki CheckingAccount sınıfı bir InsufficientFundsException oluşturan bir withdraw () yöntemi içerir.
// File Name CheckingAccount.java
import java.io.*;
public class CheckingAccount {
private double balance;
private int number;
public CheckingAccount(int number) {
this.number = number;
}
public void deposit(double amount) {
balance += amount;
}
public void withdraw(double amount) throws InsufficientFundsException {
if(amount <= balance) {
balance -= amount;
}else {
double needs = amount - balance;
throw new InsufficientFundsException(needs);
}
}
public double getBalance() {
return balance;
}
public int getNumber() {
return number;
}
}
Aşağıdaki BankDemo programı, CheckingAccount'un deposit () ve withdraw () yöntemlerini çağırmayı gösterir.
// File Name BankDemo.java
public class BankDemo {
public static void main(String [] args) {
CheckingAccount c = new CheckingAccount(101);
System.out.println("Depositing $500..."); c.deposit(500.00); try { System.out.println("\nWithdrawing $100...");
c.withdraw(100.00);
System.out.println("\nWithdrawing $600..."); c.withdraw(600.00); } catch (InsufficientFundsException e) { System.out.println("Sorry, but you are short $" + e.getAmount());
e.printStackTrace();
}
}
}
Yukarıdaki üç dosyanın tümünü derleyin ve BankDemo'yu çalıştırın. Bu, aşağıdaki sonucu verecektir -
Çıktı
Depositing $500... Withdrawing $100...
Withdrawing $600... Sorry, but you are short $200.0
InsufficientFundsException
at CheckingAccount.withdraw(CheckingAccount.java:25)
at BankDemo.main(BankDemo.java:13)
Yaygın İstisnalar
Java'da, İstisnalar ve Hatalar olmak üzere iki kategori tanımlamak mümkündür.
JVM Exceptions- Bunlar, özel olarak veya mantıksal olarak JVM tarafından atılan istisnalar / hatalardır. Örnekler: NullPointerException, ArrayIndexOutOfBoundsException, ClassCastException.
Programmatic Exceptions- Bu istisnalar, uygulama veya API programcıları tarafından açıkça atılır. Örnekler: IllegalArgumentException, IllegalStateException.
Bu bölümde, Java'nın iç sınıflarını tartışacağız.
Yuvalanmış Sınıflar
Java'da, yöntemler gibi, bir sınıfın değişkenleri de üye olarak başka bir sınıfa sahip olabilir. Java'da başka bir sınıfın içinde yazmaya izin verilir. İçinde yazılan sınıfanested classve iç sınıfı tutan sınıfa outer class.
Syntax
İç içe bir sınıf yazmak için sözdizimi aşağıdadır. İşte sınıfOuter_Demo dış sınıf ve sınıftır Inner_Demo iç içe geçmiş sınıftır.
class Outer_Demo {
class Inner_Demo {
}
}
İç içe geçmiş sınıflar iki türe ayrılır -
Non-static nested classes - Bunlar, bir sınıfın statik olmayan üyeleridir.
Static nested classes - Bunlar bir sınıfın statik üyeleridir.
İç Sınıflar (Statik Olmayan İç İçe Sınıflar)
İç sınıflar, Java'da bir güvenlik mekanizmasıdır. Bir sınıfın erişim değiştiriciyle ilişkilendirilemeyeceğini biliyoruzprivate, ancak sınıfa başka bir sınıfın üyesi olarak sahipsek, iç sınıf özel hale getirilebilir. Bu aynı zamanda bir sınıfın özel üyelerine erişmek için de kullanılır.
İç sınıflar, onları nasıl ve nerede tanımladığınıza bağlı olarak üç türdendir. Onlar -
- İç Sınıf
- Yöntem-yerel İç Sınıf
- Anonim İç Sınıf
İç Sınıf
İçsel bir sınıf yaratmak oldukça basit. Bir sınıf içinde bir sınıf yazmanız yeterlidir. Bir sınıfın aksine, bir iç sınıf özel olabilir ve bir iç sınıfı özel olarak tanımladığınızda, sınıfın dışındaki bir nesneden ona erişilemez.
Aşağıda, bir iç sınıf oluşturmak ve ona erişmek için program verilmiştir. Verilen örnekte, iç sınıfı özel yapıyoruz ve sınıfa bir yöntemle erişiyoruz.
Example
class Outer_Demo {
int num;
// inner class
private class Inner_Demo {
public void print() {
System.out.println("This is an inner class");
}
}
// Accessing he inner class from the method within
void display_Inner() {
Inner_Demo inner = new Inner_Demo();
inner.print();
}
}
public class My_class {
public static void main(String args[]) {
// Instantiating the outer class
Outer_Demo outer = new Outer_Demo();
// Accessing the display_Inner() method.
outer.display_Inner();
}
}
Burada bunu gözlemleyebilirsiniz Outer_Demo dış sınıf, Inner_Demo iç sınıftır display_Inner() iç sınıfı örneklediğimiz yöntemdir ve bu yöntem, main yöntem.
Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki sonucu alırsınız -
Output
This is an inner class.
Özel Üyelere Erişim
Daha önce belirtildiği gibi, iç sınıflar ayrıca bir sınıfın özel üyelerine erişmek için kullanılır. Bir sınıfın kendilerine erişmek için özel üyeleri olduğunu varsayalım. İçine bir iç sınıf yazın, özel üyeleri iç sınıftaki bir yöntemden döndürün, diyelim ki,getValue()ve son olarak başka bir sınıftan (özel üyelere erişmek istediğiniz) iç sınıfın getValue () yöntemini çağırın.
İç sınıfı somutlaştırmak için, başlangıçta dış sınıfı somutlaştırmanız gerekir. Bundan sonra, dış sınıfın nesnesini kullanarak, iç sınıfı somutlaştırmanın yolu aşağıdadır.
Outer_Demo outer = new Outer_Demo();
Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();
Aşağıdaki program, iç sınıfı kullanarak bir sınıfın özel üyelerine nasıl erişileceğini gösterir.
Example
class Outer_Demo {
// private variable of the outer class
private int num = 175;
// inner class
public class Inner_Demo {
public int getNum() {
System.out.println("This is the getnum method of the inner class");
return num;
}
}
}
public class My_class2 {
public static void main(String args[]) {
// Instantiating the outer class
Outer_Demo outer = new Outer_Demo();
// Instantiating the inner class
Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();
System.out.println(inner.getNum());
}
}
Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki sonucu alırsınız -
Output
This is the getnum method of the inner class: 175
Yöntem-yerel İç Sınıf
Java'da, bir yöntem içinde bir sınıf yazabiliriz ve bu yerel bir tür olacaktır. Yerel değişkenler gibi, iç sınıfın kapsamı da yöntem içinde sınırlandırılmıştır.
Yöntem yerel bir iç sınıf, yalnızca iç sınıfın tanımlandığı yöntem içinde somutlaştırılabilir. Aşağıdaki program yerel bir yöntem iç sınıfının nasıl kullanılacağını gösterir.
Example
public class Outerclass {
// instance method of the outer class
void my_Method() {
int num = 23;
// method-local inner class
class MethodInner_Demo {
public void print() {
System.out.println("This is method inner class "+num);
}
} // end of inner class
// Accessing the inner class
MethodInner_Demo inner = new MethodInner_Demo();
inner.print();
}
public static void main(String args[]) {
Outerclass outer = new Outerclass();
outer.my_Method();
}
}
Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki sonucu alırsınız -
Output
This is method inner class 23
Anonim İç Sınıf
Sınıf adı olmadan bildirilen bir iç sınıf, anonymous inner class. Anonim iç sınıflar durumunda, bunları aynı anda bildirir ve başlatırız. Genellikle, bir sınıfın veya bir arabirimin yöntemini geçersiz kılmanız gerektiğinde kullanılırlar. Anonim bir iç sınıfın sözdizimi aşağıdaki gibidir -
Syntax
AnonymousInner an_inner = new AnonymousInner() {
public void my_method() {
........
........
}
};
Aşağıdaki program, anonim iç sınıf kullanılarak bir sınıfın yönteminin nasıl geçersiz kılınacağını gösterir.
Example
abstract class AnonymousInner {
public abstract void mymethod();
}
public class Outer_class {
public static void main(String args[]) {
AnonymousInner inner = new AnonymousInner() {
public void mymethod() {
System.out.println("This is an example of anonymous inner class");
}
};
inner.mymethod();
}
}
Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki sonucu alırsınız -
Output
This is an example of anonymous inner class
Aynı şekilde, somut sınıfın yöntemlerini ve anonim bir iç sınıf kullanarak arabirimi geçersiz kılabilirsiniz.
Bağımsız Değişken Olarak Anonim İç Sınıf
Genel olarak, bir yöntem bir arabirimin, soyut bir sınıfın veya somut bir sınıfın bir nesnesini kabul ederse, arabirimi uygulayabilir, soyut sınıfı genişletebilir ve nesneyi yönteme iletebiliriz. Eğer bu bir sınıfsa, onu doğrudan metoda geçirebiliriz.
Ancak her üç durumda da, yönteme anonim bir iç sınıfı geçirebilirsiniz. Yöntem argümanı olarak anonim bir iç sınıfı iletmenin sözdizimi:
obj.my_Method(new My_Class() {
public void Do() {
.....
.....
}
});
Aşağıdaki program, anonim bir iç sınıfın yöntem argümanı olarak nasıl geçirileceğini gösterir.
Example
// interface
interface Message {
String greet();
}
public class My_class {
// method which accepts the object of interface Message
public void displayMessage(Message m) {
System.out.println(m.greet() +
", This is an example of anonymous inner class as an argument");
}
public static void main(String args[]) {
// Instantiating the class
My_class obj = new My_class();
// Passing an anonymous inner class as an argument
obj.displayMessage(new Message() {
public String greet() {
return "Hello";
}
});
}
}
Yukarıdaki programı derler ve çalıştırırsanız, size şu sonucu verir -
Output
Hello, This is an example of anonymous inner class as an argument
Statik İç İçe Sınıf
Statik bir iç sınıf, dış sınıfın statik bir üyesi olan iç içe geçmiş bir sınıftır. Diğer statik üyeler kullanılarak dış sınıfı somutlaştırmadan erişilebilir. Tıpkı statik üyeler gibi, statik iç içe geçmiş bir sınıfın dış sınıfın örnek değişkenlerine ve yöntemlerine erişimi yoktur. Statik iç içe geçmiş sınıfın sözdizimi aşağıdaki gibidir -
Syntax
class MyOuter {
static class Nested_Demo {
}
}
Statik iç içe geçmiş bir sınıfın somutlaştırılması, bir iç sınıfın somutlaştırılmasından biraz farklıdır. Aşağıdaki program statik iç içe bir sınıfın nasıl kullanılacağını gösterir.
Example
public class Outer {
static class Nested_Demo {
public void my_method() {
System.out.println("This is my nested class");
}
}
public static void main(String args[]) {
Outer.Nested_Demo nested = new Outer.Nested_Demo();
nested.my_method();
}
}
Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki sonucu alırsınız -
Output
This is my nested class
Kalıtım, bir sınıfın diğerinin özelliklerini (yöntemleri ve alanları) elde ettiği süreç olarak tanımlanabilir. Kalıtımın kullanılmasıyla, bilgiler hiyerarşik bir sırayla yönetilebilir hale getirilir.
Diğerinin özelliklerini miras alan sınıf, alt sınıf (türetilmiş sınıf, alt sınıf) olarak bilinir ve özellikleri miras alınan sınıf, üst sınıf (temel sınıf, ana sınıf) olarak bilinir.
Anahtar Kelimeyi genişletir
extendsbir sınıfın özelliklerini devralmak için kullanılan anahtar kelimedir. Extends anahtar kelimesinin sözdizimi aşağıdadır.
Syntax
class Super {
.....
.....
}
class Sub extends Super {
.....
.....
}
Basit kod
Aşağıda, Java kalıtımını gösteren bir örnek verilmiştir. Bu örnekte, Calculation ve My_Calculation olmak üzere iki sınıfı gözlemleyebilirsiniz.
Extends anahtar sözcüğünü kullanarak, My_Calculation, Calculation sınıfının toplama () ve Çıkarma () yöntemlerini miras alır.
Aşağıdaki programı My_Calculation.java adlı bir dosyaya kopyalayıp yapıştırın
Example
class Calculation {
int z;
public void addition(int x, int y) {
z = x + y;
System.out.println("The sum of the given numbers:"+z);
}
public void Subtraction(int x, int y) {
z = x - y;
System.out.println("The difference between the given numbers:"+z);
}
}
public class My_Calculation extends Calculation {
public void multiplication(int x, int y) {
z = x * y;
System.out.println("The product of the given numbers:"+z);
}
public static void main(String args[]) {
int a = 20, b = 10;
My_Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
demo.multiplication(a, b);
}
}
Yukarıdaki kodu aşağıda gösterildiği gibi derleyin ve yürütün.
javac My_Calculation.java
java My_Calculation
Programı çalıştırdıktan sonra aşağıdaki sonucu üretecektir -
Output
The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200
Verilen programda, bir nesne My_Calculationsınıf oluşturulur, içinde üst sınıfın içeriğinin bir kopyası yapılır. Bu nedenle, alt sınıfın nesnesini kullanarak bir üst sınıfın üyelerine erişebilirsiniz.
Üst sınıf referans değişkeni alt sınıf nesnesini tutabilir, ancak bu değişkeni kullanarak yalnızca üst sınıfın üyelerine erişebilirsiniz, bu nedenle her iki sınıfın üyelerine erişmek için her zaman alt sınıfa referans değişkeni oluşturmanız önerilir.
Yukarıdaki programı düşünürseniz, sınıfı aşağıda verildiği gibi başlatabilirsiniz. Ancak üst sınıf referans değişkenini kullanarak (cal bu durumda) yöntemi çağıramazsınız multiplication()My_Calculation alt sınıfa ait olan.
Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
Note- Bir alt sınıf, tüm üyeleri (alanlar, yöntemler ve iç içe geçmiş sınıflar) üst sınıfından miras alır. Oluşturucular üye değildir, bu nedenle alt sınıflar tarafından miras alınmazlar, ancak üst sınıfın yapıcısı alt sınıftan çağrılabilir.
Süper anahtar kelime
super anahtar kelime benzer thisanahtar kelime. Aşağıda, super anahtar kelimesinin kullanıldığı senaryolar verilmiştir.
Alışkın differentiate the members aynı isimlere sahiplerse, alt sınıf üyelerinden üst sınıfın.
Alışkın invoke the superclass alt sınıftan yapıcı.
Üyelerin Farklılaştırılması
Bir sınıf başka bir sınıfın özelliklerini miras alıyorsa. Üst sınıfın üyeleri alt sınıfla aynı adlara sahipse, bu değişkenleri ayırt etmek için aşağıda gösterildiği gibi süper anahtar kelimesini kullanırız.
super.variable
super.method();
Basit kod
Bu bölüm size cihazın kullanımını gösteren bir program sunar. super anahtar kelime.
Verilen programda, Sub_class ve Super_class olmak üzere iki sınıfa sahipsiniz , her ikisi de farklı uygulamalara sahip display () adında bir yönteme ve farklı değerlere sahip num adında bir değişkene sahip. Her iki sınıfın display () yöntemini çağırıyoruz ve her iki sınıfın değişken num değerini yazdırıyoruz. Burada, süper sınıfın üyelerini alt sınıftan ayırmak için süper anahtar sözcüğünü kullandığımızı gözlemleyebilirsiniz.
Programı kopyalayıp Sub_class.java adlı bir dosyaya yapıştırın.
Example
class Super_class {
int num = 20;
// display method of superclass
public void display() {
System.out.println("This is the display method of superclass");
}
}
public class Sub_class extends Super_class {
int num = 10;
// display method of sub class
public void display() {
System.out.println("This is the display method of subclass");
}
public void my_method() {
// Instantiating subclass
Sub_class sub = new Sub_class();
// Invoking the display() method of sub class
sub.display();
// Invoking the display() method of superclass
super.display();
// printing the value of variable num of subclass
System.out.println("value of the variable named num in sub class:"+ sub.num);
// printing the value of variable num of superclass
System.out.println("value of the variable named num in super class:"+ super.num);
}
public static void main(String args[]) {
Sub_class obj = new Sub_class();
obj.my_method();
}
}
Aşağıdaki sözdizimini kullanarak yukarıdaki kodu derleyin ve yürütün.
javac Super_Demo
java Super
Programı çalıştırırken aşağıdaki sonucu alacaksınız -
Output
This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20
Superclass Constructor'ı Çağırma
Bir sınıf başka bir sınıfın özelliklerini miras alıyorsa, alt sınıf otomatik olarak üst sınıfın varsayılan yapıcısını alır. Ancak, üst sınıfın parametreli bir kurucusunu çağırmak istiyorsanız, aşağıda gösterildiği gibi super anahtar kelimesini kullanmanız gerekir.
super(values);
Basit kod
Bu bölümde verilen program, süper sınıfın Parametreli yapıcısını çağırmak için super anahtar kelimesinin nasıl kullanılacağını gösterir. Bu program, bir üst sınıf ve bir alt sınıf içerir; burada üst sınıf, bir tamsayı değerini kabul eden parametreleştirilmiş bir kurucu içerir ve süper anahtar sözcüğünü, üst sınıfın parametreli yapıcısını çağırmak için kullandık.
Aşağıdaki programı Subclass.java adlı bir dosyaya kopyalayıp yapıştırın.
Example
class Superclass {
int age;
Superclass(int age) {
this.age = age;
}
public void getAge() {
System.out.println("The value of the variable named age in super class is: " +age);
}
}
public class Subclass extends Superclass {
Subclass(int age) {
super(age);
}
public static void main(String args[]) {
Subclass s = new Subclass(24);
s.getAge();
}
}
Aşağıdaki sözdizimini kullanarak yukarıdaki kodu derleyin ve yürütün.
javac Subclass
java Subclass
Programı çalıştırırken aşağıdaki sonucu alacaksınız -
Output
The value of the variable named age in super class is: 24
IS-A İlişkisi
IS-A şunu söylemenin bir yoludur: Bu nesne, o nesnenin bir türüdür. Bakalım nasılextends anahtar kelime, kalıtım elde etmek için kullanılır.
public class Animal {
}
public class Mammal extends Animal {
}
public class Reptile extends Animal {
}
public class Dog extends Mammal {
}
Şimdi, yukarıdaki örneğe dayalı olarak, Nesne Yönelimli terimlerle, aşağıdakiler doğrudur:
- Hayvan, Memeli sınıfının üst sınıfıdır.
- Animal, Reptile sınıfının üst sınıfıdır.
- Memeli ve Sürüngen, Hayvan sınıfının alt sınıflarıdır.
- Köpek, hem Memeli hem de Hayvan sınıflarının alt sınıfıdır.
Şimdi, IS-A ilişkisini düşünürsek şunu söyleyebiliriz -
- Memeli IS-Bir Hayvandır
- Sürüngen IS-Bir Hayvandır
- Köpek Memelidir
- Dolayısıyla: Köpek de Bir Hayvandır
Extends anahtar kelimesinin kullanılmasıyla, alt sınıflar, süper sınıfın özel özellikleri dışında, üst sınıfın tüm özelliklerini devralabilir.
Örnek operatörü kullanımıyla Mammal'in aslında bir Hayvan olduğundan emin olabiliriz.
Example
class Animal {
}
class Mammal extends Animal {
}
class Reptile extends Animal {
}
public class Dog extends Mammal {
public static void main(String args[]) {
Animal a = new Animal();
Mammal m = new Mammal();
Dog d = new Dog();
System.out.println(m instanceof Animal);
System.out.println(d instanceof Mammal);
System.out.println(d instanceof Animal);
}
}
Bu, aşağıdaki sonucu verecektir -
Output
true
true
true
İyi bir anlayışa sahip olduğumuz için extends anahtar kelime, implements anahtar kelime IS-A ilişkisini elde etmek için kullanılır.
Genel olarak implementsanahtar kelime, bir arayüzün özelliklerini devralmak için sınıflarla birlikte kullanılır. Arayüzler asla bir sınıf tarafından genişletilemez.
Example
public interface Animal {
}
public class Mammal implements Animal {
}
public class Dog extends Mammal {
}
Anahtar Kelime örneği
Kullanalım instanceof Operatör, Memeli'nin gerçekten bir Hayvan olup olmadığını ve köpeğin aslında bir Hayvan olup olmadığını kontrol edecek.
Example
interface Animal{}
class Mammal implements Animal{}
public class Dog extends Mammal {
public static void main(String args[]) {
Mammal m = new Mammal();
Dog d = new Dog();
System.out.println(m instanceof Animal);
System.out.println(d instanceof Mammal);
System.out.println(d instanceof Animal);
}
}
Bu, aşağıdaki sonucu verecektir -
Output
true
true
true
HAS-A ilişkisi
Bu ilişkiler esas olarak kullanıma dayanmaktadır. Bu, belirli bir sınıfınHAS-Abelli şey. Bu ilişki, kodun yinelenmesinin yanı sıra hataların da azaltılmasına yardımcı olur.
Bir örneğe bakalım -
Example
public class Vehicle{}
public class Speed{}
public class Van extends Vehicle {
private Speed sp;
}
Bu, Van sınıfının HAS-A Speed olduğunu gösterir. Speed için ayrı bir sınıfa sahip olduğumuz için, Speed sınıfının birden çok uygulamada yeniden kullanılmasını mümkün kılan Van sınıfının içine hıza ait olan kodun tamamını koymak zorunda kalmayız.
Nesne Yönelimli özellikte, kullanıcıların gerçek işi hangi nesnenin yaptığı konusunda endişelenmelerine gerek yoktur. Bunu başarmak için Van sınıfı, uygulama ayrıntılarını Van sınıfı kullanıcılarından gizler. Yani, temelde olan, kullanıcılar Van sınıfından belirli bir eylemi yapmasını isteyecek ve Van sınıfı ya işi kendi başına yapacak ya da başka bir sınıftan eylemi gerçekleştirmesini isteyecektir.
Kalıtım Türleri
Aşağıda gösterildiği gibi çeşitli kalıtım türleri vardır.
Hatırlanması gereken çok önemli bir gerçek, Java'nın çoklu kalıtımı desteklemediğidir. Bu, bir sınıfın birden fazla sınıfı genişletemeyeceği anlamına gelir. Bu nedenle takip etmek yasa dışıdır -
Example
public class extends Animal, Mammal{}
Bununla birlikte, bir sınıf, Java'nın çoklu kalıtımın imkansızlığından kurtulmasına yardımcı olan bir veya daha fazla arabirim uygulayabilir.
Önceki bölümde, üst sınıflar ve alt sınıflar hakkında konuştuk. Bir sınıf, üst sınıfından bir yöntemi miras alırsa, son olarak işaretlenmemiş olması koşuluyla yöntemi geçersiz kılma şansı vardır.
Geçersiz kılmanın faydası şudur: alt sınıf türüne özgü bir davranış tanımlama yeteneği, yani bir alt sınıf, gereksinimine göre bir ana sınıf yöntemi uygulayabilir.
Nesneye yönelik terimlerle, geçersiz kılma, mevcut bir yöntemin işlevselliğini geçersiz kılmak anlamına gelir.
Misal
Bir örneğe bakalım.
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Dogs can walk and run");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object
a.move(); // runs the method in Animal class
b.move(); // runs the method in Dog class
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Animals can move
Dogs can walk and run
Yukarıdaki örnekte şunu görebilirsiniz: bDog sınıfında hareket yöntemini çalıştıran bir Animal türüdür. Bunun nedeni şudur: Derleme zamanında, kontrol referans türünde yapılır. Bununla birlikte, çalışma zamanında, JVM nesne türünü belirler ve bu belirli nesneye ait olan yöntemi çalıştırır.
Bu nedenle, yukarıdaki örnekte, Animal sınıfının yöntemi hareket ettiği için program düzgün bir şekilde derlenecektir. Daha sonra çalışma zamanında, o nesneye özgü yöntemi çalıştırır.
Şu örneği düşünün -
Misal
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Dogs can walk and run");
}
public void bark() {
System.out.println("Dogs can bark");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object
a.move(); // runs the method in Animal class
b.move(); // runs the method in Dog class
b.bark();
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
TestDog.java:26: error: cannot find symbol
b.bark();
^
symbol: method bark()
location: variable b of type Animal
1 error
Bu program, b'nin referans türü Animal'in bark adına göre bir metoda sahip olmadığı için bir derleme zamanı hatası atacaktır.
Yöntemi Geçersiz Kılma Kuralları
Bağımsız değişken listesi, geçersiz kılınan yöntemle tamamen aynı olmalıdır.
Dönüş türü, üst sınıftaki orijinal geçersiz kılınan yöntemde bildirilen dönüş türünün aynısı veya alt türü olmalıdır.
Erişim düzeyi, geçersiz kılınan yöntemin erişim düzeyinden daha kısıtlayıcı olamaz. Örneğin: Üst sınıf yöntemi genel olarak bildirilirse, alt sınıftaki geçersiz kılma yöntemi özel veya korumalı olamaz.
Örnek yöntemleri, yalnızca alt sınıf tarafından miras alınmışlarsa geçersiz kılınabilir.
Son olarak belirtilen bir yöntem geçersiz kılınamaz.
Statik olarak bildirilen bir yöntem geçersiz kılınamaz, ancak yeniden bildirilebilir.
Bir yöntem miras alınamıyorsa, geçersiz kılınamaz.
Örneğin üst sınıfıyla aynı pakette bulunan bir alt sınıf, özel veya son olarak bildirilmemiş herhangi bir üst sınıf yöntemini geçersiz kılabilir.
Farklı bir paketteki bir alt sınıf, yalnızca genel veya korumalı olarak ilan edilen nihai olmayan yöntemleri geçersiz kılabilir.
Geçersiz kılan bir yöntem, geçersiz kılınan yöntemin istisnalar atıp atmadığına bakılmaksızın, herhangi bir onaysız istisna atabilir. Ancak, geçersiz kılma yöntemi, geçersiz kılınan yöntem tarafından bildirilenlerden yeni veya daha geniş olan kontrol edilmiş istisnaları atmamalıdır. Geçersiz kılma yöntemi, geçersiz kılınan yönteme göre daha dar veya daha az istisna atabilir.
Oluşturucular geçersiz kılınamaz.
Süper Anahtar Kelimeyi kullanma
Geçersiz kılınmış bir yöntemin bir üst sınıf sürümünü çağırırken, super anahtar kelime kullanılır.
Misal
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
super.move(); // invokes the super class method
System.out.println("Dogs can walk and run");
}
}
public class TestDog {
public static void main(String args[]) {
Animal b = new Dog(); // Animal reference but Dog object
b.move(); // runs the method in Dog class
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Animals can move
Dogs can walk and run
Polimorfizm, bir nesnenin birçok form alma yeteneğidir. OOP'de polimorfizmin en yaygın kullanımı, bir alt sınıf nesnesine başvurmak için bir ana sınıf başvurusu kullanıldığında ortaya çıkar.
Birden fazla IS-A testini geçebilen herhangi bir Java nesnesi polimorfik olarak kabul edilir. Java'da, herhangi bir nesne kendi türü ve Object sınıfı için IS-A testini geçeceğinden tüm Java nesneleri çok biçimlidir.
Bir nesneye erişmenin tek olası yolunun bir referans değişkeni aracılığıyla olduğunu bilmek önemlidir. Bir referans değişkeni yalnızca tek tipte olabilir. Bir kez bildirildikten sonra, bir referans değişkeninin türü değiştirilemez.
Referans değişkeni, nihai olarak bildirilmemesi koşuluyla diğer nesnelere yeniden atanabilir. Referans değişkeninin türü, nesnede başlatabileceği yöntemleri belirleyecektir.
Bir referans değişkeni, bildirilen türündeki herhangi bir nesneye veya bildirilen türünün herhangi bir alt türüne başvurabilir. Bir referans değişkeni, bir sınıf veya arabirim türü olarak bildirilebilir.
Misal
Bir örneğe bakalım.
public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}
Şimdi, Deer sınıfı, çoklu kalıtıma sahip olduğu için polimorfik olarak kabul edilir. Aşağıdakiler, yukarıdaki örnekler için geçerlidir -
- Bir Geyik Bir Hayvandır
- Bir Geyik Vejetaryendir
- Bir Geyik, Bir Geyik
- Bir Geyik Bir Nesnedir
Referans değişken olguları bir Deer nesne referansına uyguladığımızda, aşağıdaki beyanlar yasaldır -
Misal
Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;
Tüm referans değişkenleri d, a, v, o, yığındaki aynı Deer nesnesine başvurur.
Sanal Yöntemler
Bu bölümde, Java'daki geçersiz kılınan yöntemlerin davranışının, sınıflarınızı tasarlarken polimorfizmden nasıl yararlanmanızı sağladığını göstereceğim.
Bir çocuk sınıfın, üst sınıfındaki bir yöntemi geçersiz kılabileceği yöntemi geçersiz kılmayı zaten tartışmıştık. Geçersiz kılınan bir yöntem esas olarak üst sınıfta gizlidir ve alt sınıf geçersiz kılma yönteminde super anahtar sözcüğünü kullanmadıkça çağrılmaz.
Misal
/* File name : Employee.java */
public class Employee {
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) {
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
public void mailCheck() {
System.out.println("Mailing a check to " + this.name + " " + this.address);
}
public String toString() {
return name + " " + address + " " + number;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public void setAddress(String newAddress) {
address = newAddress;
}
public int getNumber() {
return number;
}
}
Şimdi, Employee sınıfını aşağıdaki gibi genişlettiğimizi varsayalım -
/* File name : Salary.java */
public class Salary extends Employee {
private double salary; // Annual salary
public Salary(String name, String address, int number, double salary) {
super(name, address, number);
setSalary(salary);
}
public void mailCheck() {
System.out.println("Within mailCheck of Salary class ");
System.out.println("Mailing check to " + getName()
+ " with salary " + salary);
}
public double getSalary() {
return salary;
}
public void setSalary(double newSalary) {
if(newSalary >= 0.0) {
salary = newSalary;
}
}
public double computePay() {
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
}
Şimdi, aşağıdaki programı dikkatlice inceleyin ve çıktısını belirlemeye çalışın -
/* File name : VirtualDemo.java */
public class VirtualDemo {
public static void main(String [] args) {
Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
System.out.println("Call mailCheck using Salary reference --");
s.mailCheck();
System.out.println("\n Call mailCheck using Employee reference--");
e.mailCheck();
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0
Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0
Burada iki Salary nesnesini somutlaştırıyoruz. Maaş referansı kullanan kişisve diğeri bir Çalışan referansı kullanarak e.
S.mailCheck () çağrılırken , derleyici derleme zamanında Salary sınıfında mailCheck () 'i görür ve çalışma zamanında Salary sınıfında mailCheck ()' i çağırır.
mailCheck () açık e oldukça farklı çünkü eÇalışan referansıdır. Derleyici e.mailCheck () öğesini gördüğünde , derleyici Employee sınıfında mailCheck () yöntemini görür.
Burada, derleme zamanında, derleyici bu ifadeyi doğrulamak için Employee'de mailCheck () kullanmıştır. Bununla birlikte, çalışma zamanında JVM, Salary sınıfındaki mailCheck () öğesini çağırır.
Bu davranışa sanal yöntem çağırma denir ve bu yöntemlere sanal yöntemler denir. Derleme zamanında kaynak kodda kullanılan başvuru hangi veri türü olursa olsun, çalışma zamanında geçersiz kılınan bir yöntem çağrılır.
Sözlüğe göre, abstractionolaylardan çok fikirlerle uğraşmanın kalitesidir. Örneğin, e-postayı düşündüğünüzde, bir e-posta gönderir göndermez ne olacağı gibi karmaşık ayrıntılar, e-posta sunucunuzun kullandığı protokol kullanıcıdan gizlenir. Bu nedenle, bir e-posta göndermek için, içeriği yazmanız, alıcının adresini belirtmeniz ve gönder'i tıklamanız yeterlidir.
Aynı şekilde nesne yönelimli programlamada da soyutlama, uygulama ayrıntılarını kullanıcıdan gizleme sürecidir, kullanıcıya yalnızca işlevsellik sağlanacaktır. Başka bir deyişle, kullanıcı nesnenin nasıl yaptığı yerine ne yaptığı bilgisine sahip olacaktır.
Java'da soyutlama, Soyut sınıflar ve arayüzler kullanılarak gerçekleştirilir.
Soyut Sınıf
İçeren bir sınıf abstract bildirimindeki anahtar kelime soyut sınıf olarak bilinir.
Soyut sınıflar soyut yöntemler içerebilir veya içermeyebilir , yani gövdesiz yöntemler (public void get ();)
Ancak, bir sınıfın en az bir soyut yöntemi varsa, o zaman sınıf must soyut ilan edilecektir.
Bir sınıf soyut olarak bildirilmişse, somutlaştırılamaz.
Soyut bir sınıfı kullanmak için, onu başka bir sınıftan miras almanız, içindeki soyut yöntemlere uygulamalar sağlamanız gerekir.
Soyut bir sınıfı miras alırsanız, içindeki tüm soyut yöntemlere uygulamalar sağlamanız gerekir.
Misal
Bu bölüm size soyut sınıfın bir örneğini sunar. Soyut bir sınıf oluşturmak için,abstract sınıf bildiriminde, class anahtar sözcüğünden önce anahtar kelime.
/* File name : Employee.java */
public abstract class Employee {
private String name;
private String address;
private int number;
public Employee(String name, String address, int number) {
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
public double computePay() {
System.out.println("Inside Employee computePay");
return 0.0;
}
public void mailCheck() {
System.out.println("Mailing a check to " + this.name + " " + this.address);
}
public String toString() {
return name + " " + address + " " + number;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public void setAddress(String newAddress) {
address = newAddress;
}
public int getNumber() {
return number;
}
}
Soyut yöntemler dışında Employee sınıfının Java'daki normal sınıfla aynı olduğunu gözlemleyebilirsiniz. Sınıf artık soyuttur, ancak yine de üç alana, yedi yönteme ve bir yapıcıya sahiptir.
Şimdi Employee sınıfını aşağıdaki şekilde başlatmayı deneyebilirsiniz -
/* File name : AbstractDemo.java */
public class AbstractDemo {
public static void main(String [] args) {
/* Following is not allowed and would raise error */
Employee e = new Employee("George W.", "Houston, TX", 43);
System.out.println("\n Call mailCheck using Employee reference--");
e.mailCheck();
}
}
Yukarıdaki sınıfı derlediğinizde size şu hatayı verir -
Employee.java:46: Employee is abstract; cannot be instantiated
Employee e = new Employee("George W.", "Houston, TX", 43);
^
1 error
Soyut Sınıfı Devralma
Employee sınıfının özelliklerini, somut sınıf gibi şu şekilde miras alabiliriz -
Misal
/* File name : Salary.java */
public class Salary extends Employee {
private double salary; // Annual salary
public Salary(String name, String address, int number, double salary) {
super(name, address, number);
setSalary(salary);
}
public void mailCheck() {
System.out.println("Within mailCheck of Salary class ");
System.out.println("Mailing check to " + getName() + " with salary " + salary);
}
public double getSalary() {
return salary;
}
public void setSalary(double newSalary) {
if(newSalary >= 0.0) {
salary = newSalary;
}
}
public double computePay() {
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
}
Burada Employee sınıfını örnekleyemezsiniz, ancak Maaş Sınıfını başlatabilirsiniz ve bu örneği kullanarak aşağıda gösterildiği gibi Employee sınıfının üç alanına ve yedi yöntemine erişebilirsiniz.
/* File name : AbstractDemo.java */
public class AbstractDemo {
public static void main(String [] args) {
Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
System.out.println("Call mailCheck using Salary reference --");
s.mailCheck();
System.out.println("\n Call mailCheck using Employee reference--");
e.mailCheck();
}
}
Bu, aşağıdaki sonucu verir -
Çıktı
Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0
Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0
Soyut Yöntemler
Bir sınıfın belirli bir yöntemi içermesini istiyorsanız, ancak bu yöntemin gerçek uygulamasının alt sınıflar tarafından belirlenmesini istiyorsanız, yöntemi üst sınıfta bir soyut olarak bildirebilirsiniz.
abstract anahtar kelime yöntemi soyut olarak bildirmek için kullanılır.
Yerleştirmelisin abstract yöntem bildiriminde yöntem adından önce anahtar kelime.
Soyut bir yöntem, bir yöntem imzası içerir ancak yöntem gövdesi içermez.
Küme parantezleri yerine, soyut bir yöntemin sonunda bir semoi iki nokta üst üste (;) olacaktır.
Aşağıda soyut yönteme bir örnek verilmiştir.
Misal
public abstract class Employee {
private String name;
private String address;
private int number;
public abstract double computePay();
// Remainder of class definition
}
Bir yöntemi soyut olarak bildirmenin iki sonucu vardır:
Onu içeren sınıf, soyut olarak beyan edilmelidir.
Geçerli sınıfı miras alan herhangi bir sınıf, soyut yöntemi geçersiz kılmalıdır veya kendini soyut olarak bildirmelidir.
Note- Sonunda, bir soy sınıfının soyut yöntemi uygulaması gerekir; aksi takdirde, somutlaştırılamayan bir soyut sınıflar hiyerarşisine sahip olursunuz.
Salary sınıfının Employee sınıfını miras aldığını ve ardından computePay() aşağıda gösterildiği gibi yöntem -
/* File name : Salary.java */
public class Salary extends Employee {
private double salary; // Annual salary
public double computePay() {
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
// Remainder of class definition
}
Encapsulationdört temel OOP kavramından biridir. Diğer üçü kalıtım, çok biçimlilik ve soyutlamadır.
Java'da kapsülleme, verileri (değişkenleri) ve verileri (yöntemleri) tek bir birim olarak birlikte hareket eden kodu sarma mekanizmasıdır. Kapsüllemede, bir sınıfın değişkenleri diğer sınıflardan gizlenir ve bunlara yalnızca mevcut sınıflarının yöntemleri aracılığıyla erişilebilir. Bu nedenle, aynı zamandadata hiding.
Java'da kapsülleme elde etmek için -
Bir sınıfın değişkenlerini özel olarak bildirin.
Değişken değerlerini değiştirmek ve görüntülemek için genel ayarlayıcı ve alıcı yöntemleri sağlayın.
Misal
Aşağıda, Java'da Encapsulation'a nasıl ulaşılacağını gösteren bir örnek verilmiştir -
/* File name : EncapTest.java */
public class EncapTest {
private String name;
private String idNum;
private int age;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String getIdNum() {
return idNum;
}
public void setAge( int newAge) {
age = newAge;
}
public void setName(String newName) {
name = newName;
}
public void setIdNum( String newId) {
idNum = newId;
}
}
Genel setXXX () ve getXXX () yöntemleri, EncapTest sınıfının örnek değişkenlerinin erişim noktalarıdır. Normalde bu yöntemlere alıcılar ve ayarlayıcılar denir. Bu nedenle, değişkenlere erişmek isteyen herhangi bir sınıf, bunlara bu alıcılar ve ayarlayıcılar aracılığıyla erişmelidir.
EncapTest sınıfının değişkenlerine aşağıdaki program kullanılarak erişilebilir -
/* File name : RunEncap.java */
public class RunEncap {
public static void main(String args[]) {
EncapTest encap = new EncapTest();
encap.setName("James");
encap.setAge(20);
encap.setIdNum("12343ms");
System.out.print("Name : " + encap.getName() + " Age : " + encap.getAge());
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Name : James Age : 20
Kapsüllemenin Yararları
Bir sınıfın alanları salt okunur veya salt okunur hale getirilebilir.
Bir sınıf, alanlarında depolananlar üzerinde tam kontrole sahip olabilir.
Arayüz, Java'da bir referans türüdür. Sınıfa benzer. Soyut yöntemler koleksiyonudur. Bir sınıf bir arabirim uygular, dolayısıyla arabirimin soyut yöntemlerini miras alır.
Soyut yöntemlerin yanı sıra, bir arabirim ayrıca sabitler, varsayılan yöntemler, statik yöntemler ve iç içe türler içerebilir. Yöntem gövdeleri yalnızca varsayılan yöntemler ve statik yöntemler için mevcuttur.
Arayüz yazmak, sınıf yazmaya benzer. Ancak bir sınıf, bir nesnenin niteliklerini ve davranışlarını tanımlar. Ve bir arayüz, bir sınıfın uyguladığı davranışları içerir.
Arabirimi uygulayan sınıf soyut olmadığı sürece, arabirimin tüm yöntemlerinin sınıfta tanımlanması gerekir.
Arayüz, aşağıdaki şekillerde bir sınıfa benzer:
Bir arayüz, herhangi bir sayıda yöntem içerebilir.
Bir arayüz, bir dosyaya yazılır. .java uzantı, dosyanın adıyla eşleşen arabirimin adı ile.
Bir arayüzün bayt kodu bir .class dosya.
Arabirimler paketlerde görünür ve bunlara karşılık gelen bayt kodu dosyası, paket adıyla eşleşen bir dizin yapısında olmalıdır.
Bununla birlikte, bir arayüz bir sınıftan birkaç yönden farklıdır:
Bir arabirimi örnekleyemezsiniz.
Bir arayüz herhangi bir kurucu içermez.
Bir arayüzdeki tüm yöntemler soyuttur.
Bir arayüz, örnek alanları içeremez. Bir arabirimde görünebilecek alanların hem statik hem de son olarak bildirilmesi gerekir.
Bir arayüz bir sınıf tarafından genişletilmez; bir sınıf tarafından uygulanmaktadır.
Bir arayüz birden çok arayüzü genişletebilir.
Arayüzleri Bildirme
interfaceanahtar kelime, bir arayüz bildirmek için kullanılır. İşte bir arayüz bildirmek için basit bir örnek -
Misal
Aşağıda bir arayüz örneği verilmiştir -
/* File name : NameOfInterface.java */
import java.lang.*;
// Any number of import statements
public interface NameOfInterface {
// Any number of final, static fields
// Any number of abstract method declarations\
}
Arayüzler aşağıdaki özelliklere sahiptir -
Bir arayüz örtük olarak soyuttur. Kullanmanıza gerek yokabstract bir arayüz bildirirken anahtar kelime.
Bir arayüzdeki her yöntem de dolaylı olarak soyuttur, bu nedenle soyut anahtar sözcüğe gerek yoktur.
Bir arayüzdeki yöntemler örtük olarak geneldir.
Misal
/* File name : Animal.java */
interface Animal {
public void eat();
public void travel();
}
Arayüzlerin Uygulanması
Bir sınıf bir arabirim uyguladığında, sınıfı, arabirimin belirli davranışlarını gerçekleştirmeyi kabul ederek bir sözleşmeyi imzalar olarak düşünebilirsiniz. Bir sınıf arabirimin tüm davranışlarını gerçekleştirmezse, sınıf kendini soyut olarak bildirmelidir.
Bir sınıf, implementsbir arayüz uygulamak için anahtar kelime. İmplements anahtar sözcüğü, bildirimin extends bölümünü izleyen sınıf bildiriminde görünür.
Misal
/* File name : MammalInt.java */
public class MammalInt implements Animal {
public void eat() {
System.out.println("Mammal eats");
}
public void travel() {
System.out.println("Mammal travels");
}
public int noOfLegs() {
return 0;
}
public static void main(String args[]) {
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Mammal eats
Mammal travels
Arayüzlerde tanımlanan yöntemleri geçersiz kılarken, uyulması gereken birkaç kural vardır -
Denetlenen istisnalar, arabirim yöntemi tarafından bildirilenler veya arabirim yöntemi tarafından bildirilenlerin alt sınıfları dışındaki uygulama yöntemlerinde bildirilmemelidir.
Arayüz yönteminin imzası ve aynı dönüş türü veya alt türü, yöntemler geçersiz kılınırken korunmalıdır.
Bir uygulama sınıfının kendisi soyut olabilir ve öyleyse, arayüz yöntemlerinin uygulanmasına gerek yoktur.
Uygulama arayüzleri olduğunda, birkaç kural vardır -
Bir sınıf aynı anda birden fazla arabirim uygulayabilir.
Bir sınıf yalnızca bir sınıfı genişletebilir, ancak birçok arabirimi uygulayabilir.
Bir arabirim, bir sınıfın başka bir sınıfı genişletebilmesine benzer şekilde başka bir arabirimi genişletebilir.
Arayüzleri Genişletme
Bir arabirim, bir sınıfın başka bir sınıfı genişletebileceği şekilde başka bir arabirimi genişletebilir. extends anahtar sözcük, bir arabirimi genişletmek için kullanılır ve alt arabirim, ana arabirimin yöntemlerini miras alır.
Aşağıdaki Spor arayüzü Hokey ve Futbol arayüzleri ile genişletilmiştir.
Misal
// Filename: Sports.java
public interface Sports {
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
// Filename: Football.java
public interface Football extends Sports {
public void homeTeamScored(int points);
public void visitingTeamScored(int points);
public void endOfQuarter(int quarter);
}
// Filename: Hockey.java
public interface Hockey extends Sports {
public void homeGoalScored();
public void visitingGoalScored();
public void endOfPeriod(int period);
public void overtimePeriod(int ot);
}
Hokey arayüzünün dört yöntemi vardır, ancak iki yöntemi Sports'tan devralır; bu nedenle, Hockey'i uygulayan bir sınıfın altı yöntemi de uygulaması gerekir. Benzer şekilde, Futbolu uygulayan bir sınıfın Football'dan üç yöntemi ve Sports'tan iki yöntemi tanımlaması gerekir.
Çoklu Arayüzleri Genişletme
Bir Java sınıfı yalnızca bir ana sınıfı genişletebilir. Çoklu mirasa izin verilmez. Ancak arayüzler sınıf değildir ve bir arayüz birden fazla ana arayüzü genişletebilir.
Extends anahtar sözcüğü bir kez kullanılır ve ana arabirimler virgülle ayrılmış bir listede bildirilir.
Örneğin, Hokey arayüzü hem Spor'u hem de Etkinliği genişletirse, şu şekilde ilan edilirdi -
Misal
public interface Hockey extends Sports, Event
Arayüzleri Etiketleme
Genişletme arabirimlerinin en yaygın kullanımı, ana arabirim herhangi bir yöntem içermediğinde ortaya çıkar. Örneğin, java.awt.event paketindeki MouseListener arayüzü, genişletilmiş java.util.EventListener, şu şekilde tanımlanır:
Misal
package java.util;
public interface EventListener
{}
İçinde hiçbir yöntem bulunmayan bir arayüz, bir taggingarayüz. Arayüzleri etiketlemenin iki temel tasarım amacı vardır -
Creates a common parent- Java API'deki düzinelerce başka arabirim tarafından genişletilen EventListener arabiriminde olduğu gibi, bir arabirim grubu arasında ortak bir üst öğe oluşturmak için bir etiketleme arabirimi kullanabilirsiniz. Örneğin, bir arayüz EventListener'ı genişlettiğinde, JVM bu özel arayüzün bir olay yetkilendirme senaryosunda kullanılacağını bilir.
Adds a data type to a class- Bu durum, etiketleme teriminin geldiği yerdir. Bir etiketleme arabirimini uygulayan bir sınıfın herhangi bir yöntem tanımlaması gerekmez (arabirimde hiç olmadığı için), ancak sınıf çok biçimlilik yoluyla bir arabirim türü haline gelir.
Adlandırma çakışmalarını önlemek, erişimi kontrol etmek, sınıfların, arayüzlerin, numaralandırmaların ve ek açıklamaların aranmasını / bulunmasını ve kullanımını kolaylaştırmak için Java'da paketler kullanılır.
Bir Package erişim koruması ve ad alanı yönetimi sağlayan ilgili türlerin (sınıflar, arayüzler, numaralandırmalar ve açıklamalar) bir gruplaması olarak tanımlanabilir.
Java'daki mevcut paketlerden bazıları -
java.lang - temel sınıfları bir araya getirir
java.io - girdi, çıktı fonksiyonları için sınıflar bu pakette paketlenmiştir
Programcılar, sınıflar / arabirimler vb. Gruplarını bir araya getirmek için kendi paketlerini tanımlayabilir. Sizin tarafınızdan uygulanan ilgili sınıfları gruplamak, bir programcının sınıfların, arabirimlerin, numaralandırmaların ve ek açıklamaların ilişkili olduğunu kolayca belirleyebilmesi için iyi bir uygulamadır.
Paket yeni bir ad alanı oluşturduğundan, diğer paketlerdeki adlarla herhangi bir ad çatışması olmayacaktır. Paketleri kullanarak erişim kontrolü sağlamak daha kolaydır ve ilgili sınıfları bulmak da daha kolaydır.
Bir Paket Oluşturmak
Bir paket oluştururken, paket için bir isim seçmeli ve bir package pakete dahil etmek istediğiniz sınıfları, arabirimleri, numaralandırmaları ve açıklama türlerini içeren her kaynak dosyasının en üstünde bu adla birlikte ifade.
Paket ifadesi, kaynak dosyadaki ilk satır olmalıdır. Her kaynak dosyada yalnızca bir paket ifadesi olabilir ve dosyadaki tüm türler için geçerlidir.
Bir paket ifadesi kullanılmazsa, sınıf, arabirimler, numaralandırmalar ve açıklama türleri mevcut varsayılan pakete yerleştirilecektir.
Java programlarını paket deyimleriyle derlemek için, aşağıda gösterildiği gibi -d seçeneğini kullanmalısınız.
javac -d Destination_folder file_name.java
Ardından, belirtilen hedefte verilen paket adına sahip bir klasör oluşturulur ve derlenen sınıf dosyaları bu klasöre yerleştirilir.
Misal
Adlı bir paket oluşturan bir örneğe bakalım. animals. Sınıfların ve arabirimlerin adlarıyla herhangi bir çakışmayı önlemek için küçük harfli paket adlarını kullanmak iyi bir uygulamadır.
Aşağıdaki paket örneği, animals adlı arayüzü içerir -
/* File name : Animal.java */
package animals;
interface Animal {
public void eat();
public void travel();
}
Şimdi, yukarıdaki arayüzü aynı hayvanlar paketine uygulayalım -
package animals;
/* File name : MammalInt.java */
public class MammalInt implements Animal {
public void eat() {
System.out.println("Mammal eats");
}
public void travel() {
System.out.println("Mammal travels");
}
public int noOfLegs() {
return 0;
}
public static void main(String args[]) {
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
Şimdi java dosyalarını aşağıda gösterildiği gibi derleyin -
$ javac -d . Animal.java $ javac -d . MammalInt.java
Şimdi adı olan bir paket / klasör animals mevcut dizinde oluşturulacak ve bu sınıf dosyaları aşağıda gösterildiği gibi dizine yerleştirilecektir.
Paket içindeki sınıf dosyasını çalıştırabilir ve sonucu aşağıda gösterildiği gibi alabilirsiniz.
Mammal eats
Mammal travels
Anahtar Kelime ithal
Bir sınıf aynı pakette başka bir sınıf kullanmak isterse, paket adının kullanılmasına gerek yoktur. Aynı paketteki sınıflar, herhangi bir özel sözdizimi olmaksızın birbirlerini bulur.
Misal
Burada, zaten Employee içeren bordro paketine Boss adlı bir sınıf eklenir. Daha sonra Boss, aşağıdaki Boss sınıfında gösterildiği gibi, maaş bordrosu önekini kullanmadan Çalışan sınıfına başvurabilir.
package payroll;
public class Boss {
public void payEmployee(Employee e) {
e.mailCheck();
}
}
Çalışan sınıfı maaş bordrosu paketinde değilse ne olur? Boss sınıfı daha sonra farklı bir paketteki bir sınıfa atıfta bulunmak için aşağıdaki tekniklerden birini kullanmalıdır.
- Sınıfın tam olarak nitelenmiş adı kullanılabilir. Örneğin -
payroll.Employee
Paket, import anahtar sözcüğü ve joker karakter (*) kullanılarak içe aktarılabilir. Örneğin -
import payroll.*;
- Sınıfın kendisi import anahtar sözcüğü kullanılarak içe aktarılabilir. Örneğin -
import payroll.Employee;
Note- Bir sınıf dosyası herhangi bir sayıda içe aktarma ifadesi içerebilir. İmport ifadeleri paket ifadesinden sonra ve sınıf bildiriminden önce görünmelidir.
Paketlerin Dizin Yapısı
Bir sınıf bir pakete yerleştirildiğinde iki ana sonuç ortaya çıkar -
Paketin adı, önceki bölümde tartıştığımız gibi sınıfın adının bir parçası haline gelir.
Paketin adı, karşılık gelen bayt kodunun bulunduğu dizin yapısıyla eşleşmelidir.
Java'da dosyalarınızı yönetmenin basit yolu:
Adı türün basit adı ve uzantısı olan bir metin dosyasına sınıf, arabirim, numaralandırma veya açıklama türü için kaynak kodunu yerleştirin. .java.
Örneğin -
// File Name : Car.java
package vehicle;
public class Car {
// Class implementation.
}
Şimdi, kaynak dosyayı, adı sınıfın ait olduğu paketin adını yansıtan bir dizine koyun -
....\vehicle\Car.java
Şimdi, nitelikli sınıf adı ve yol adı aşağıdaki gibi olacaktır -
- Sınıf adı → araç. Araba
- Yol adı → araç \ Car.java (pencerelerde)
Genel olarak, bir şirket, paket adları için tersine çevrilmiş İnternet alan adını kullanır.
Example- Bir şirketin İnternet alan adı apple.com'dur, ardından tüm paket adları com.apple ile başlar. Paket adının her bileşeni bir alt dizine karşılık gelir.
Example - Şirket, Dell.java kaynak dosyası içeren bir com.apple.computers paketine sahipti, bunun gibi bir dizi alt dizinde yer alacaktı -
....\com\apple\computers\Dell.java
Derleme sırasında derleyici, içinde tanımlanan her sınıf, arabirim ve numaralandırma için farklı bir çıktı dosyası oluşturur. Çıktı dosyasının temel adı, türün adıdır ve uzantısı.class.
Örneğin -
// File Name: Dell.java
package com.apple.computers;
public class Dell {
}
class Ups {
}
Şimdi bu dosyayı -d seçeneğini kullanarak aşağıdaki gibi derleyin -
$javac -d . Dell.java
Dosyalar şu şekilde derlenecektir -
.\com\apple\computers\Dell.class
.\com\apple\computers\Ups.class
\ Com \ apple \ computer \ içinde tanımlanan tüm sınıfları veya arayüzleri aşağıdaki gibi içe aktarabilirsiniz -
import com.apple.computers.*;
.Java kaynak dosyaları gibi, derlenen .class dosyaları, paket adını yansıtan bir dizi dizinde olmalıdır. Ancak, .class dosyalarının yolu, .java kaynak dosyalarının yolu ile aynı olmak zorunda değildir. Kaynak ve sınıf dizinlerinizi ayrı ayrı düzenleyebilirsiniz:
<path-one>\sources\com\apple\computers\Dell.java
<path-two>\classes\com\apple\computers\Dell.class
Bunu yaparak, kaynaklarınızı açıklamadan diğer programcılara sınıflar dizinine erişim vermek mümkündür. Derleyicinin ve Java Sanal Makinesi'nin (JVM) programınızın kullandığı tüm türleri bulabilmesi için kaynak ve sınıf dosyalarını da bu şekilde yönetmeniz gerekir.
Sınıflar dizininin tam yolu, <yol-iki> \ sınıfları, sınıf yolu olarak adlandırılır ve CLASSPATH sistem değişkeni ile ayarlanır. Hem derleyici hem de JVM, paket adını sınıf yoluna ekleyerek .class dosyalarınızın yolunu oluşturur.
<Yol-iki> \ sınıflarının sınıf yolu olduğunu ve paket adının com.apple.computers olduğunu söyleyin, ardından derleyici ve JVM <yol-iki> \ classes \ com \ apple \ bilgisayarlarda .class dosyalarını arayacaktır.
Bir sınıf yolu birkaç yol içerebilir. Birden çok yol, noktalı virgül (Windows) veya iki nokta üst üste (Unix) ile ayrılmalıdır. Varsayılan olarak, derleyici ve JVM geçerli dizini ve Java platformu sınıflarını içeren JAR dosyasını arar, böylece bu dizinler otomatik olarak sınıf yolunda olur.
CLASSPATH Sistem Değişkenini Ayarla
Geçerli CLASSPATH değişkenini görüntülemek için Windows ve UNIX'te (Bourne kabuğu) aşağıdaki komutları kullanın -
- Windows → C: \> CLASSPATH'ı ayarlayın
- UNIX'te →% echo $ CLASSPATH
CLASSPATH değişkeninin mevcut içeriğini silmek için şunu kullanın -
- Windows → C: \> CLASSPATH =
- UNIX'de →% ayarlanmamış CLASSPATH; CLASSPATH'ı dışa aktar
CLASSPATH değişkenini ayarlamak için -
- Windows'da → CLASSPATH = C: \ users \ jack \ java \ classes ayarlayın
- UNIX'de →% CLASSPATH = / home / jack / java / classes; CLASSPATH'ı dışa aktar
Java yardımcı programı paketi tarafından sağlanan veri yapıları çok güçlüdür ve çok çeşitli işlevleri yerine getirir. Bu veri yapıları aşağıdaki arayüz ve sınıflardan oluşur -
- Enumeration
- BitSet
- Vector
- Stack
- Dictionary
- Hashtable
- Properties
Tüm bu sınıflar artık eskidir ve Java-2, bir sonraki bölümde tartışılacak olan Koleksiyon Çerçevesi adlı yeni bir çerçeve sunmuştur. -
Numaralandırma
Numaralandırma arayüzünün kendisi bir veri yapısı değildir, ancak diğer veri yapıları bağlamında çok önemlidir. Numaralandırma arabirimi, bir veri yapısından ardışık öğeleri almak için bir yol tanımlar.
Örneğin, Numaralandırma, birden çok öğe içeren bir veri yapısındaki sonraki öğeyi almak için kullanılan nextElement adlı bir yöntemi tanımlar.
Bu arayüz hakkında daha fazla ayrıntıya sahip olmak için Numaralandırmaya bakın .
BitSet
BitSet sınıfı, ayrı ayrı ayarlanabilen ve temizlenebilen bir grup bit veya bayrak uygular.
Bu sınıf, bir dizi Boolean değerine ayak uydurmanız gereken durumlarda çok kullanışlıdır; her bir değere bir bit atarsınız ve uygun şekilde ayarlar veya temizlersiniz.
Bu sınıf hakkında daha fazla ayrıntı için BitSet'e bakın .
Vektör
Vector sınıfı, yeni öğeleri barındırmak için gerektiği kadar büyüyebilmesi dışında geleneksel bir Java dizisine benzer.
Bir dizi gibi, bir Vector nesnesinin öğelerine, vektöre bir dizin yoluyla erişilebilir.
Vector sınıfını kullanmanın güzel yanı, onu oluştururken belirli bir boyuta ayarlamak konusunda endişelenmenize gerek olmamasıdır; Gerektiğinde otomatik olarak küçülür ve büyür.
Bu sınıf hakkında daha fazla ayrıntı için The Vector'e bakın .
Yığın
Stack sınıfı, son giren ilk çıkar (LIFO) öğe yığınını uygular.
Bir yığını kelimenin tam anlamıyla dikey bir nesne yığını olarak düşünebilirsiniz; yeni bir öğe eklediğinizde, diğerlerinin üzerine yığılır.
Bir öğeyi yığından çektiğinizde, üst kısımdan çıkar. Başka bir deyişle, yığına eklediğiniz son öğe geri gelen ilk öğedir.
Bu sınıf hakkında daha fazla ayrıntı için The Stack'e bakın .
Sözlük
Dictionary sınıfı, anahtarları değerlerle eşlemek için bir veri yapısını tanımlayan soyut bir sınıftır.
Bu, verilere tamsayı dizini yerine belirli bir anahtar aracılığıyla erişebilmek istediğiniz durumlarda kullanışlıdır.
Dictionary sınıfı soyut olduğundan, belirli bir uygulama yerine yalnızca anahtar eşlemeli veri yapısı için çerçeve sağlar.
Bu sınıf hakkında daha fazla ayrıntı için, The Dictionary'ye bakın .
Hashtable
Hashtable sınıfı, bazı kullanıcı tanımlı anahtar yapılarına dayalı olarak verileri düzenlemek için bir araç sağlar.
Örneğin, bir adres listesi karma tablosunda, bir kişinin adı yerine posta kodu gibi bir anahtara göre verileri depolayabilir ve sıralayabilirsiniz.
Anahtarların karma tablolarla ilgili özel anlamı, tamamen karma tablonun kullanımına ve içerdiği verilere bağlıdır.
Bu sınıf hakkında daha fazla ayrıntı için Hashtable'a bakın .
Özellikler
Özellikler, Hashtable'ın bir alt sınıfıdır. Anahtarın bir Dize olduğu ve değerin de bir Dize olduğu değer listelerini korumak için kullanılır.
Özellikler sınıfı, diğer birçok Java sınıfı tarafından kullanılır. Örneğin, çevresel değerler elde edilirken System.getProperties () tarafından döndürülen nesne türüdür.
Bu sınıf hakkında daha fazla ayrıntı için, Özellikler'e bakın .
Java 2'den önce, Java, Dictionary, Vector, Stack, ve Propertiesnesne gruplarını saklamak ve işlemek için. Bu sınıflar oldukça faydalı olsalar da, merkezi, birleştirici bir temadan yoksundu. Bu nedenle, Vektör'ü kullanma şekliniz, Özellikler'i kullanma şeklinizden farklıydı.
Tahsilat çerçevesi, aşağıdakiler gibi birkaç hedefi karşılamak için tasarlanmıştır:
Çerçeve yüksek performanslı olmalıydı. Temel koleksiyonlar (dinamik diziler, bağlantılı listeler, ağaçlar ve hashtable'lar) için uygulamalar oldukça verimli olacaktı.
Çerçeve, farklı koleksiyon türlerinin benzer şekilde ve yüksek derecede birlikte çalışabilirlikle çalışmasına izin vermeliydi.
Çerçevenin bir koleksiyonu kolayca genişletmesi ve / veya uyarlaması gerekiyordu.
Bu amaçla, tüm koleksiyon çerçevesi bir dizi standart arabirim etrafında tasarlanmıştır. Gibi çeşitli standart uygulamalarLinkedList, HashSet, ve TreeSetBu arayüzlerden, olduğu gibi kullanabileceğiniz ve isterseniz kendi koleksiyonunuzu da uygulayabileceğiniz sağlanmıştır.
Bir koleksiyon çerçevesi, koleksiyonları temsil etmek ve işlemek için birleşik bir mimaridir. Tüm koleksiyon çerçeveleri aşağıdakileri içerir -
Interfaces- Bunlar, koleksiyonları temsil eden soyut veri türleridir. Arayüzler, koleksiyonların temsillerinin ayrıntılarından bağımsız olarak manipüle edilmesine izin verir. Nesne yönelimli dillerde, arayüzler genellikle bir hiyerarşi oluşturur.
Implementations, i.e., Classes- Bunlar koleksiyon arayüzlerinin somut uygulamalarıdır. Özünde, yeniden kullanılabilir veri yapılarıdır.
Algorithms- Bunlar, koleksiyon arayüzlerini uygulayan nesneler üzerinde arama ve sıralama gibi yararlı hesaplamalar gerçekleştiren yöntemlerdir. Algoritmaların polimorfik olduğu söylenir: yani aynı yöntem, uygun toplama arayüzünün birçok farklı uygulamasında kullanılabilir.
Koleksiyonlara ek olarak, çerçeve çeşitli harita arayüzlerini ve sınıflarını tanımlar. Haritalar, anahtar / değer çiftlerini depolar. Haritalar , terimin doğru kullanımında koleksiyonlar olmasa da, koleksiyonlarla tamamen bütünleşmiştir.
Koleksiyon Arayüzleri
Koleksiyon çerçevesi birkaç arabirimi tanımlar. Bu bölüm, her arayüze genel bir bakış sağlar -
Sr.No. | Arayüz ve Açıklama |
---|---|
1 | Koleksiyon Arayüzü Bu, nesne gruplarıyla çalışmanıza olanak tanır; koleksiyon hiyerarşisinin en üstündedir. |
2 | Liste Arayüzü Bu uzar Collection ve bir List örneği, sıralı bir öğe koleksiyonunu saklar. |
3 | Set Bu, Koleksiyonu benzersiz öğeler içermesi gereken kümeleri işleyecek şekilde genişletir. |
4 | SortedSet Bu, Set'i sıralanmış kümeleri işleyecek şekilde genişletir. |
5 | Harita Bu, benzersiz anahtarları değerlerle eşler. |
6 | Harita Giriş Bu, bir haritadaki bir öğeyi (bir anahtar / değer çifti) tanımlar. Bu, Harita'nın iç sınıfıdır. |
7 | Sıralanmış Harita Bu, haritayı genişletir, böylece anahtarlar artan bir sırada tutulur. |
8 | Numaralandırma Bu eski arabirim, bir nesne koleksiyonundaki öğeleri numaralandırabileceğiniz (her seferinde bir tane elde edebileceğiniz) yöntemleri tanımlar. Bu eski arayüz, Iterator tarafından yerini almıştır. |
Koleksiyon Sınıfları
Java, Koleksiyon arabirimlerini uygulayan bir dizi standart koleksiyon sınıfı sağlar. Sınıfların bazıları olduğu gibi kullanılabilen tam uygulamalar sağlarken diğerleri soyut sınıflardır ve somut koleksiyonlar oluşturmak için başlangıç noktaları olarak kullanılan iskelet uygulamaları sağlar.
Standart koleksiyon sınıfları aşağıdaki tabloda özetlenmiştir -
Sr.No. | Sınıf ve Açıklama |
---|---|
1 | AbstractCollection Koleksiyon arayüzünün çoğunu uygular. |
2 | AbstractList AbstractCollection'ı genişletir ve List arayüzünün çoğunu uygular. |
3 | AbstractSequentialList AbstractList'i, öğelerine rastgele erişim yerine sıralı erişim kullanan bir koleksiyon tarafından kullanılmak üzere genişletir. |
4 | Bağlantılı liste AbstractSequentialList'i genişleterek bağlantılı bir liste uygular. |
5 | Dizi Listesi AbstractList'i genişleterek dinamik bir dizi uygular. |
6 | AbstractSet AbstractCollection'ı genişletir ve Set arayüzünün çoğunu uygular. |
7 | HashSet AbstractSet'i karma tabloyla kullanmak üzere genişletir. |
8 | LinkedHashSet Ekleme sırası yinelemelerine izin vermek için HashSet'i genişletir. |
9 | Ağaç Kümesi Bir ağaçta saklanan bir seti uygular. AbstractSet'i genişletir. |
10 | AbstractMap Harita arayüzünün çoğunu uygular. |
11 | HashMap AbstractMap'i karma tablo kullanacak şekilde genişletir. |
12 | Ağaç Haritası AbstractMap'i bir ağaç kullanacak şekilde genişletir. |
13 | WeakHashMap AbstractMap'i zayıf anahtarlara sahip bir karma tablo kullanacak şekilde genişletir. |
14 | LinkedHashMap Ekleme sırası yinelemelerine izin vermek için HashMap'i genişletir. |
15 | IdentityHashMap AbstractMap'i genişletir ve belgeleri karşılaştırırken referans eşitliğini kullanır. |
AbstractCollection, AbstractSet, AbstractList, AbstractSequentialList ve AbstractMap sınıfları yorulmadan çalışmak için bunlara uymak zorundadır, çekirdek toplama arayüzleri iskelet uygulamaları sağlamak.
Java.util tarafından tanımlanan aşağıdaki eski sınıflar, önceki bölümde tartışılmıştır -
Sr.No. | Sınıf ve Açıklama |
---|---|
1 | Vektör Bu dinamik bir dizi uygular. ArrayList'e benzer, ancak bazı farklılıklar vardır. |
2 | Yığın Yığın, standart bir son giren ilk çıkar yığınını uygulayan bir Vector alt sınıfıdır. |
3 | Sözlük Dictionary, bir anahtar / değer depolama havuzunu temsil eden ve daha çok Map gibi işleyen soyut bir sınıftır. |
4 | Hashtable Hashtable, orijinal java.util'in bir parçasıydı ve Dictionary'nin somut bir uygulamasıdır. |
5 | Özellikleri Özellikler, Hashtable'ın bir alt sınıfıdır. Anahtarın bir Dize olduğu ve değerin de bir Dize olduğu değer listelerini korumak için kullanılır. |
6 | BitSet Bir BitSet sınıfı, bit değerlerini tutan özel bir dizi türü oluşturur. Bu dizinin boyutu gerektiği gibi artabilir. |
Koleksiyon Algoritmaları
Koleksiyon çerçevesi, koleksiyonlara ve haritalara uygulanabilecek çeşitli algoritmaları tanımlar. Bu algoritmalar, Collections sınıfı içinde statik yöntemler olarak tanımlanır.
Yöntemlerden birkaçı bir ClassCastException, uyumsuz türleri karşılaştırma girişiminde bulunulduğunda veya bir UnsupportedOperationException, değiştirilemez bir koleksiyonu değiştirme girişiminde bulunulduğunda ortaya çıkar.
Koleksiyonlar üç statik değişken tanımlar: EMPTY_SET, EMPTY_LIST ve EMPTY_MAP. Hepsi değişmezdir.
Sr.No. | Algoritma ve Açıklama |
---|---|
1 | Koleksiyon Algoritmaları İşte tüm algoritma uygulamalarının bir listesi. |
Yineleyici Nasıl Kullanılır?
Genellikle, bir koleksiyondaki öğeler arasında geçiş yapmak isteyeceksiniz. Örneğin, her bir öğeyi görüntülemek isteyebilirsiniz.
Bunu yapmanın en kolay yolu, Yineleyici veya ListIterator arabirimini uygulayan bir nesne olan bir yineleyici kullanmaktır.
Yineleyici, bir koleksiyonda gezinmenize, öğeleri edinmenize veya kaldırmanıza olanak tanır. ListIterator, bir listenin çift yönlü geçişine ve öğelerin değiştirilmesine izin vermek için Yineleyiciyi genişletir.
Sr.No. | Yineleyici Yöntemi ve Açıklama |
---|---|
1 | Java Yineleyiciyi Kullanma Aşağıda, Iterator ve ListIterator arabirimleri tarafından sağlanan örneklerle birlikte tüm yöntemlerin bir listesi bulunmaktadır. |
Karşılaştırıcı Nasıl Kullanılır?
Hem TreeSet hem de TreeMap, öğeleri sıralı bir düzende depolar. Bununla birlikte, sıralı düzenin tam olarak ne anlama geldiğini tanımlayan karşılaştırıcıdır .
Bu arayüz, belirli bir koleksiyonu herhangi bir sayıda farklı şekilde sıralamamızı sağlar. Ayrıca bu arayüz, herhangi bir sınıfın herhangi bir örneğini (değiştiremeyeceğimiz sınıflar bile) sıralamak için kullanılabilir.
Sr.No. | Yineleyici Yöntemi ve Açıklama |
---|---|
1 | Java Karşılaştırıcıyı Kullanma Karşılaştırıcı Arayüz tarafından sağlanan örneklerle birlikte tüm yöntemlerin bir listesi. |
Özet
Java koleksiyon çerçevesi, programcıya önceden paketlenmiş veri yapılarının yanı sıra bunları işlemek için algoritmalara erişim sağlar.
Koleksiyon, diğer nesnelere referansları tutabilen bir nesnedir. Koleksiyon arabirimleri, her koleksiyon türünde gerçekleştirilebilecek işlemleri bildirir.
Koleksiyon çerçevesinin sınıfları ve arabirimleri java.util paketindedir.
Bir Integer dizisindeki, String dizisindeki veya sıralamayı destekleyen herhangi bir tipteki bir dizideki öğeleri sıralayabilen tek bir sıralama yöntemi yazabilirsek güzel olurdu.
Java Generic yöntemler ve genel sınıflar, programcıların sırasıyla tek bir yöntem bildirimiyle, bir dizi ilgili yöntemi veya tek bir sınıf bildirimiyle bir dizi ilişkili türü belirtmesini sağlar.
Generics ayrıca, programcıların derleme zamanında geçersiz türleri yakalamasına olanak tanıyan derleme zamanı tür güvenliği sağlar.
Java Generic kavramını kullanarak, bir dizi nesneyi sıralamak için genel bir yöntem yazabiliriz, ardından dizi öğelerini sıralamak için Tamsayı dizileri, Çift diziler, Dize dizileri vb. İle genel yöntemi çağırabiliriz.
Genel Yöntemler
Farklı türlerdeki argümanlarla çağrılabilen tek bir genel yöntem bildirimi yazabilirsiniz. Genel yönteme iletilen bağımsız değişkenlerin türlerine bağlı olarak, derleyici her yöntem çağrısını uygun şekilde işler. Genel Yöntemleri tanımlayan kurallar aşağıdadır -
Tüm genel yöntem bildirimleri, yöntemin dönüş türünden (sonraki örnekte <E>) önce gelen açılı ayraçlarla (<ve>) ayrılmış bir tür parametresi bölümüne sahiptir.
Her tür parametresi bölümü, virgülle ayrılmış bir veya daha fazla tür parametresi içerir. Tür değişkeni olarak da bilinen bir tür parametresi, genel bir tür adı belirten bir tanımlayıcıdır.
Tür parametreleri, dönüş türünü bildirmek ve gerçek tür bağımsız değişkenleri olarak bilinen genel yönteme iletilen bağımsız değişkenlerin türleri için yer tutucu olarak hareket etmek için kullanılabilir.
Jenerik bir yöntemin gövdesi, diğer herhangi bir yönteminki gibi bildirilir. Tür parametrelerinin yalnızca başvuru türlerini temsil edebileceğini, ilkel türleri (int, double ve char gibi) temsil edemeyeceğini unutmayın.
Misal
Aşağıdaki örnek, tek bir Genel yöntem kullanarak farklı türden bir diziyi nasıl yazdırabileceğimizi göstermektedir -
public class GenericMethodTest {
// generic method printArray
public static < E > void printArray( E[] inputArray ) {
// Display array elements
for(E element : inputArray) {
System.out.printf("%s ", element);
}
System.out.println();
}
public static void main(String args[]) {
// Create arrays of Integer, Double and Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
System.out.println("Array integerArray contains:");
printArray(intArray); // pass an Integer array
System.out.println("\nArray doubleArray contains:");
printArray(doubleArray); // pass a Double array
System.out.println("\nArray characterArray contains:");
printArray(charArray); // pass a Character array
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Array integerArray contains:
1 2 3 4 5
Array doubleArray contains:
1.1 2.2 3.3 4.4
Array characterArray contains:
H E L L O
Sınırlı Tür Parametreleri
Bir tür parametresine geçirilmesine izin verilen tür türlerini kısıtlamak isteyeceğiniz zamanlar olabilir. Örneğin, sayılar üzerinde çalışan bir yöntem, yalnızca Number veya alt sınıflarının örneklerini kabul etmek isteyebilir. Sınırlı tip parametreleri bunun içindir.
Sınırlı bir tür parametresi bildirmek için, tür parametresinin adını, ardından extends anahtar sözcüğünü ve ardından üst sınırını listeleyin.
Misal
Aşağıdaki örnek, extends'in genel anlamda "extends" (sınıflarda olduğu gibi) veya "uygulama" (arayüzlerde olduğu gibi) anlamında nasıl kullanıldığını göstermektedir. Bu örnek, Karşılaştırılabilir üç nesneden en büyüğünü döndürmek için Genel yöntemdir -
public class MaximumTest {
// determines the largest of three Comparable objects
public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
T max = x; // assume x is initially the largest
if(y.compareTo(max) > 0) {
max = y; // y is the largest so far
}
if(z.compareTo(max) > 0) {
max = z; // z is the largest now
}
return max; // returns the largest object
}
public static void main(String args[]) {
System.out.printf("Max of %d, %d and %d is %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ));
System.out.printf("Max of %.1f,%.1f and %.1f is %.1f\n\n",
6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ));
System.out.printf("Max of %s, %s and %s is %s\n","pear",
"apple", "orange", maximum("pear", "apple", "orange"));
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Max of 3, 4 and 5 is 5
Max of 6.6,8.8 and 7.7 is 8.8
Max of pear, apple and orange is pear
Genel Sınıflar
Sınıf adının ardından bir tür parametresi bölümü gelmesinin dışında, genel bir sınıf bildirimi, genel olmayan bir sınıf bildirimine benzer.
Genel yöntemlerde olduğu gibi, genel bir sınıfın tür parametresi bölümü, virgülle ayrılmış bir veya daha fazla tür parametresine sahip olabilir. Bu sınıflar, bir veya daha fazla parametre kabul ettikleri için parametreli sınıflar veya parametreli türler olarak bilinir.
Misal
Aşağıdaki örnek, genel bir sınıfı nasıl tanımlayabileceğimizi göstermektedir -
public class Box<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
Box<String> stringBox = new Box<String>();
integerBox.add(new Integer(10));
stringBox.add(new String("Hello World"));
System.out.printf("Integer Value :%d\n\n", integerBox.get());
System.out.printf("String Value :%s\n", stringBox.get());
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Integer Value :10
String Value :Hello World
Java, bir nesnenin nesnenin verilerini ve nesnenin türü ve nesnede depolanan veri türleri hakkındaki bilgileri içeren bir bayt dizisi olarak temsil edilebildiği nesne serileştirme adı verilen bir mekanizma sağlar.
Serileştirilmiş bir nesne bir dosyaya yazıldıktan sonra, dosyadan okunabilir ve serileştirilebilir, yani nesneyi temsil eden tür bilgileri ve baytlar ve verileri bellekteki nesneyi yeniden oluşturmak için kullanılabilir.
En etkileyici olanı, tüm sürecin JVM'den bağımsız olması, yani bir nesnenin tek bir platformda serileştirilebilmesi ve tamamen farklı bir platformda seri durumunun kaldırılmasıdır.
Sınıflar ObjectInputStream ve ObjectOutputStream Bir nesneyi serileştirme ve seriyi kaldırma yöntemlerini içeren yüksek seviyeli akışlardır.
ObjectOutputStream sınıfı, çeşitli veri türlerini yazmak için birçok yazma yöntemi içerir, ancak özellikle bir yöntem öne çıkar -
public final void writeObject(Object x) throws IOException
Yukarıdaki yöntem bir Nesneyi seri hale getirir ve onu çıktı akışına gönderir. Benzer şekilde, ObjectInputStream sınıfı, bir nesnenin serisini kaldırmak için aşağıdaki yöntemi içerir -
public final Object readObject() throws IOException, ClassNotFoundException
Bu yöntem, sonraki Nesneyi akıştan alır ve serisini kaldırır. Dönüş değeri Object olduğundan, onu uygun veri türüne dönüştürmeniz gerekir.
Java'da serileştirmenin nasıl çalıştığını göstermek için, kitabın başlarında tartıştığımız Employee sınıfını kullanacağım. Serileştirilebilir arabirimi uygulayan aşağıdaki Employee sınıfına sahip olduğumuzu varsayalım -
Misal
public class Employee implements java.io.Serializable {
public String name;
public String address;
public transient int SSN;
public int number;
public void mailCheck() {
System.out.println("Mailing a check to " + name + " " + address);
}
}
Bir sınıfın başarılı bir şekilde serileştirilmesi için iki koşulun karşılanması gerektiğine dikkat edin -
Sınıf, java.io.Serializable arabirimini uygulamalıdır.
Sınıftaki tüm alanlar serileştirilebilir olmalıdır. Bir alan serileştirilebilir değilse, işaretlenmelidirtransient.
Bir Java Standart Sınıfının serileştirilebilir olup olmadığını merak ediyorsanız, sınıfın belgelerine bakın. Test basittir: Eğer sınıf java.io.Serializable uyguluyorsa, o zaman serileştirilebilir; aksi takdirde değil.
Bir Nesneyi Seri Hale Getirme
ObjectOutputStream sınıfı, bir Object serileştirmek için kullanılır. Aşağıdaki SerializeDemo programı bir Employee nesnesini başlatır ve bir dosyaya serileştirir.
Programın yürütülmesi tamamlandığında, worker.ser adlı bir dosya oluşturulur. Program herhangi bir çıktı üretmez, ancak kodu inceleyin ve programın ne yaptığını belirlemeye çalışın.
Note - Bir nesneyi bir dosyaya serileştirirken, Java'daki standart kural, dosyaya bir .ser uzantı.
Misal
import java.io.*;
public class SerializeDemo {
public static void main(String [] args) {
Employee e = new Employee();
e.name = "Reyan Ali";
e.address = "Phokka Kuan, Ambehta Peer";
e.SSN = 11122333;
e.number = 101;
try {
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /tmp/employee.ser");
} catch (IOException i) {
i.printStackTrace();
}
}
}
Bir Nesnenin Serisini Kaldırma
Aşağıdaki DeserializeDemo programı, SerializeDemo programında oluşturulan Employee nesnesinin serisini kaldırır. Programı inceleyin ve çıktısını belirlemeye çalışın -
Misal
import java.io.*;
public class DeserializeDemo {
public static void main(String [] args) {
Employee e = null;
try {
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Employee class not found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Employee...");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101
Dikkat edilmesi gereken önemli noktalar şunlardır:
Try / catch bloğu, readObject () yöntemi tarafından bildirilen bir ClassNotFoundException'ı yakalamaya çalışır. Bir JVM'nin bir nesnenin serisini kaldırabilmesi için, sınıfın bayt kodunu bulabilmesi gerekir. JVM, bir nesnenin serisini kaldırırken bir sınıf bulamazsa, bir ClassNotFoundException oluşturur.
ReadObject () işlevinin dönüş değerinin bir Çalışan referansına dönüştürüldüğüne dikkat edin.
Nesne serileştirildiğinde SSN alanının değeri 11122333 idi, ancak alan geçici olduğu için bu değer çıktı akışına gönderilmedi. Serileştirilmiş Employee nesnesinin SSN alanı 0'dır.
Terimi ağ programlama cihazlarının her bir ağ kullanarak birbirine bağlı olduğu birden fazla cihaz (bilgisayarlar), karşısında yürütme program yazmaya ifade eder.
J2SE API'lerinin java.net paketi, elinizdeki sorunu çözmeye odaklanan programlar yazmanıza olanak tanıyan, düşük seviyeli iletişim ayrıntılarını sağlayan bir sınıflar ve arayüzler koleksiyonu içerir.
Java.net paketi, iki yaygın ağ protokolü için destek sağlar -
TCP- TCP, iki uygulama arasında güvenilir iletişime izin veren İletim Kontrol Protokolü anlamına gelir. TCP, tipik olarak TCP / IP olarak adlandırılan İnternet Protokolü üzerinden kullanılır.
UDP - UDP, uygulamalar arasında veri paketlerinin aktarılmasına izin veren bağlantısız bir protokol olan Kullanıcı Datagram Protokolü anlamına gelir.
Bu bölüm, aşağıdaki iki konu hakkında iyi bir anlayış sağlar -
Socket Programming - Bu, Networking'de en yaygın kullanılan kavramdır ve çok detaylı bir şekilde açıklanmıştır.
URL Processing- Bu ayrı ayrı ele alınacaktır. Java dilinde URL İşleme hakkında bilgi edinmek için burayı tıklayın .
Soket Programlama
Soketler, TCP kullanan iki bilgisayar arasındaki iletişim mekanizmasını sağlar. Bir istemci programı, iletişimin sonunda bir soket oluşturur ve bu soketi bir sunucuya bağlamayı dener.
Bağlantı yapıldığında, sunucu iletişimin sonunda bir soket nesnesi oluşturur. İstemci ve sunucu artık sokete yazıp okuyarak iletişim kurabilir.
Java.net.Socket sınıfı bir soketi temsil eder ve java.net.ServerSocket sınıfı, sunucu programının istemcileri dinlemesi ve onlarla bağlantı kurması için bir mekanizma sağlar.
Soketleri kullanarak iki bilgisayar arasında bir TCP bağlantısı kurarken aşağıdaki adımlar gerçekleşir -
Sunucu, hangi bağlantı noktası numarası iletişiminin gerçekleşeceğini belirten bir ServerSocket nesnesi başlatır.
Sunucu, ServerSocket sınıfının kabul () yöntemini çağırır. Bu yöntem, bir istemci verilen bağlantı noktasındaki sunucuya bağlanana kadar bekler.
Sunucu bekledikten sonra, bir istemci, sunucu adını ve bağlanılacak bağlantı noktası numarasını belirterek bir Socket nesnesini başlatır.
Socket sınıfının yapıcısı, istemciyi belirtilen sunucuya ve bağlantı noktası numarasına bağlamaya çalışır. İletişim kurulursa, istemcinin artık sunucuyla iletişim kurabilen bir Socket nesnesi vardır.
Sunucu tarafında, kabul () yöntemi, istemcinin soketine bağlı olan sunucudaki yeni bir sokete bir başvuru döndürür.
Bağlantılar kurulduktan sonra, I / O akışları kullanılarak iletişim gerçekleşebilir. Her soket hem bir OutputStream hem de bir InputStream'e sahiptir. İstemcinin OutputStream'i sunucunun InputStream'ine bağlanır ve istemcinin InputStream'i sunucunun OutputStream'ine bağlıdır.
TCP iki yönlü bir iletişim protokolüdür, bu nedenle veriler her iki akış üzerinden aynı anda gönderilebilir. Aşağıda, soketleri uygulamak için eksiksiz bir yöntem seti sağlayan kullanışlı sınıflar yer almaktadır.
ServerSocket Sınıf Yöntemleri
java.net.ServerSocket sınıfı, sunucu uygulamaları tarafından bir bağlantı noktası elde etmek ve istemci isteklerini dinlemek için kullanılır.
ServerSocket sınıfının dört kurucusu vardır -
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public ServerSocket(int port) throws IOException Belirtilen bağlantı noktasına bağlı bir sunucu soketi oluşturma girişimleri. Bağlantı noktası zaten başka bir uygulama tarafından bağlanmışsa bir istisna oluşur. |
2 | public ServerSocket(int port, int backlog) throws IOException Önceki kurucuya benzer şekilde, bekleme listesi parametresi, bir bekleme kuyruğunda kaç gelen istemcinin depolanacağını belirtir. |
3 | public ServerSocket(int port, int backlog, InetAddress address) throws IOException Önceki kurucuya benzer şekilde, InetAddress parametresi bağlanılacak yerel IP adresini belirtir. InetAddress, birden çok IP adresine sahip olabilen sunucular için kullanılır ve sunucunun, hangi IP adreslerinin istemci isteklerini kabul edeceğini belirlemesine izin verir. |
4 | public ServerSocket() throws IOException Bağlantısız bir sunucu soketi oluşturur. Bu yapıcıyı kullanırken, sunucu soketini bağlamaya hazır olduğunuzda bind () yöntemini kullanın. |
ServerSocket yapıcısı bir istisna oluşturmazsa, bu, uygulamanızın belirtilen bağlantı noktasına başarıyla bağlandığı ve istemci istekleri için hazır olduğu anlamına gelir.
Aşağıda, ServerSocket sınıfının yaygın yöntemlerinden bazıları verilmiştir -
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public int getLocalPort() Sunucu soketinin dinlediği bağlantı noktasını döndürür. Bir kurucuda port numarası olarak 0'ı geçtiyseniz ve sunucunun sizin için bir port bulmasına izin verdiyseniz, bu yöntem kullanışlıdır. |
2 | public Socket accept() throws IOException Gelen bir müşteriyi bekler. Bu yöntem, zaman aşımı değerinin setSoTimeout () yöntemi kullanılarak ayarlandığını varsayarak, bir istemci sunucuya belirtilen bağlantı noktasında bağlanana kadar veya soket zaman aşımına uğrayıncaya kadar engeller. Aksi takdirde, bu yöntem süresiz olarak engellenir. |
3 | public void setSoTimeout(int timeout) Kabul () sırasında sunucu soketinin bir istemciyi ne kadar beklediğine ilişkin zaman aşımı değerini ayarlar. |
4 | public void bind(SocketAddress host, int backlog) Soketi, SocketAddress nesnesindeki belirtilen sunucuya ve bağlantı noktasına bağlar. No-argument yapıcısını kullanarak ServerSocket örneğini oluşturduysanız, bu yöntemi kullanın. |
ServerSocket accept () işlevini çağırdığında, istemci bağlanana kadar yöntem geri dönmez. Bir istemci bağlandıktan sonra, ServerSocket belirtilmemiş bir bağlantı noktasında yeni bir Soket oluşturur ve bu yeni Sokete bir başvuru döndürür. İstemci ile sunucu arasında artık bir TCP bağlantısı mevcuttur ve iletişim başlayabilir.
Soket Sınıfı Yöntemleri
java.net.Socketclass, hem istemcinin hem de sunucunun birbiriyle iletişim kurmak için kullandığı soketi temsil eder. İstemci, bir Socket nesnesini örnekleyerek elde eder, oysa sunucu, accept () yönteminin dönüş değerinden bir Socket nesnesi alır.
Socket sınıfı, bir istemcinin bir sunucuya bağlanmak için kullandığı beş kurucuya sahiptir -
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public Socket(String host, int port) throws UnknownHostException, IOException. Bu yöntem, belirtilen bağlantı noktasında belirtilen sunucuya bağlanmaya çalışır. Bu kurucu bir istisna oluşturmazsa, bağlantı başarılı olur ve istemci sunucuya bağlanır. |
2 | public Socket(InetAddress host, int port) throws IOException Bu yöntem, ana bilgisayarın bir InetAddress nesnesi tarafından belirtilmesi dışında önceki kurucu ile aynıdır. |
3 | public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. Belirtilen ana bilgisayara ve bağlantı noktasına bağlanarak yerel ana bilgisayarda belirtilen adreste ve bağlantı noktasında bir soket oluşturur. |
4 | public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. Bu yöntem, ana bilgisayarın String yerine bir InetAddress nesnesi tarafından belirtilmesi dışında önceki kurucu ile aynıdır. |
5 | public Socket() Bağlantısız bir soket oluşturur. Bu soketi bir sunucuya bağlamak için connect () yöntemini kullanın. |
Socket yapıcısı döndüğünde, yalnızca bir Socket nesnesini başlatmaz, aynı zamanda belirtilen sunucuya ve bağlantı noktasına bağlanmaya çalışır.
Socket sınıfındaki bazı ilgi çekici yöntemler burada listelenmiştir. Hem istemcinin hem de sunucunun bir Socket nesnesine sahip olduğuna dikkat edin, bu nedenle bu yöntemler hem istemci hem de sunucu tarafından çağrılabilir.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public void connect(SocketAddress host, int timeout) throws IOException Bu yöntem, soketi belirtilen ana bilgisayara bağlar. Bu yönteme yalnızca, bağımsız değişken olmayan yapıcıyı kullanarak Soketi başlattığınızda gereklidir. |
2 | public InetAddress getInetAddress() Bu yöntem, bu soketin bağlı olduğu diğer bilgisayarın adresini döndürür. |
3 | public int getPort() Uzak makinede soketin bağlı olduğu bağlantı noktasını döndürür. |
4 | public int getLocalPort() Yerel makinede soketin bağlı olduğu bağlantı noktasını döndürür. |
5 | public SocketAddress getRemoteSocketAddress() Uzak soketin adresini verir. |
6 | public InputStream getInputStream() throws IOException Soketin giriş akışını döndürür. Giriş akışı, uzak soketin çıkış akışına bağlanır. |
7 | public OutputStream getOutputStream() throws IOException Soketin çıkış akışını döndürür. Çıkış akışı, uzak soketin giriş akışına bağlanır. |
8 | public void close() throws IOException Soketi kapatarak bu Socket nesnesinin artık herhangi bir sunucuya yeniden bağlanmasını engeller. |
InetAddress Sınıf Yöntemleri
Bu sınıf bir İnternet Protokolü (IP) adresini temsil eder. Soket programlama yaparken ihtiyaç duyacağınız faydalı yöntemleri aşağıda bulabilirsiniz -
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | static InetAddress getByAddress(byte[] addr) Ham IP adresi verilen bir InetAddress nesnesi döndürür. |
2 | static InetAddress getByAddress(String host, byte[] addr) Sağlanan ana bilgisayar adı ve IP adresine göre bir InetAddress oluşturur. |
3 | static InetAddress getByName(String host) Ana bilgisayarın adı verilen bir ana bilgisayarın IP adresini belirler. |
4 | String getHostAddress() Metinsel sunumda IP adresi dizesini döndürür. |
5 | String getHostName() Bu IP adresi için ana bilgisayar adını alır. |
6 | static InetAddress InetAddress getLocalHost() Yerel ana bilgisayarı döndürür. |
7 | String toString() Bu IP adresini bir String'e dönüştürür. |
Soket İstemci Örneği
Aşağıdaki TebrikClient, bir yuva kullanarak bir sunucuya bağlanan ve bir karşılama mesajı gönderen ve ardından bir yanıt bekleyen bir istemci programıdır.
Misal
// File Name GreetingClient.java
import java.net.*;
import java.io.*;
public class GreetingClient {
public static void main(String [] args) {
String serverName = args[0];
int port = Integer.parseInt(args[1]);
try {
System.out.println("Connecting to " + serverName + " on port " + port);
Socket client = new Socket(serverName, port);
System.out.println("Just connected to " + client.getRemoteSocketAddress());
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hello from " + client.getLocalSocketAddress());
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
System.out.println("Server says " + in.readUTF());
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Soket Sunucusu Örneği
Aşağıdaki Selamlama Sunucusu programı, bir komut satırı bağımsız değişkeni tarafından belirtilen bir bağlantı noktası numarasındaki istemcileri dinlemek için Socket sınıfını kullanan bir sunucu uygulaması örneğidir -
Misal
// File Name GreetingServer.java
import java.net.*;
import java.io.*;
public class GreetingServer extends Thread {
private ServerSocket serverSocket;
public GreetingServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(10000);
}
public void run() {
while(true) {
try {
System.out.println("Waiting for client on port " +
serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("Just connected to " + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
+ "\nGoodbye!");
server.close();
} catch (SocketTimeoutException s) {
System.out.println("Socket timed out!");
break;
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
public static void main(String [] args) {
int port = Integer.parseInt(args[0]);
try {
Thread t = new GreetingServer(port);
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
İstemciyi ve sunucuyu derleyin ve ardından sunucuyu aşağıdaki gibi başlatın -
$ java GreetingServer 6066
Waiting for client on port 6066...
İstemci programını aşağıdaki şekilde kontrol edin -
Çıktı
$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!
Java Uygulamanızı kullanarak bir e-posta göndermek yeterince basittir, ancak başlamak için JavaMail API ve Java Activation Framework (JAF) makinenize kurulur.
JavaMail'in en son sürümünü (Sürüm 1.2) Java'nın standart web sitesinden indirebilirsiniz .
JAF'ın en son sürümünü (Sürüm 1.1.1) Java'nın standart web sitesinden indirebilirsiniz .
Bu dosyaları indirin ve açın, yeni oluşturulan üst düzey dizinlerde her iki uygulama için bir dizi jar dosyası bulacaksınız. Eklemeniz gerekiyormail.jar ve activation.jar CLASSPATH dosyanızdaki dosyalar.
Basit Bir E-posta Gönderin
İşte makinenizden basit bir e-posta göndermenin bir örneği. Senin olduğu varsayılmaktadırlocalhost İnternete bağlı ve bir e-posta gönderebilecek kadar yetenekli.
Misal
// File Name SendEmail.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendEmail {
public static void main(String [] args) {
// Recipient's email ID needs to be mentioned.
String to = "[email protected]";
// Sender's email ID needs to be mentioned
String from = "[email protected]";
// Assuming you are sending email from localhost
String host = "localhost";
// Get system properties
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session session = Session.getDefaultInstance(properties);
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Now set the actual message
message.setText("This is actual message");
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
Basit bir e-posta göndermek için bu programı derleyin ve çalıştırın -
Çıktı
$ java SendEmail
Sent message successfully....
Birden çok alıcıya bir e-posta göndermek istiyorsanız, birden çok e-posta kimliğini belirtmek için aşağıdaki yöntemler kullanılacaktır -
void addRecipients(Message.RecipientType type, Address[] addresses)
throws MessagingException
İşte parametrelerin açıklaması -
type- Bu TO, CC veya BCC olarak ayarlanacaktır. Burada CC, Carbon Copy'yi ve BCC, Black Carbon Copy'yi temsil eder. Örnek: Message.RecipientType.TO
addresses- Bu bir dizi e-posta kimliğidir. E-posta kimliklerini belirlerken InternetAddress () yöntemini kullanmanız gerekir.
HTML E-posta Gönderin
Makinenizden bir HTML e-posta göndermek için bir örnek. Burada sizinlocalhost İnternete bağlı ve bir e-posta gönderebilecek kadar yetenekli.
Bu örnek öncekine çok benzer, ancak burada, mesaja HTML içeriğinin dahil edildiğini belirtmek için ikinci argümanı "text / html" olan içeriği ayarlamak için setContent () yöntemini kullanıyoruz.
Bu örneği kullanarak, istediğiniz kadar büyük HTML içeriği gönderebilirsiniz.
Misal
// File Name SendHTMLEmail.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendHTMLEmail {
public static void main(String [] args) {
// Recipient's email ID needs to be mentioned.
String to = "[email protected]";
// Sender's email ID needs to be mentioned
String from = "[email protected]";
// Assuming you are sending email from localhost
String host = "localhost";
// Get system properties
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session session = Session.getDefaultInstance(properties);
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Send the actual HTML message, as big as you like
message.setContent("<h1>This is actual message</h1>", "text/html");
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
HTML e-postası göndermek için bu programı derleyin ve çalıştırın -
Çıktı
$ java SendHTMLEmail
Sent message successfully....
Eki E-posta ile Gönder
İşte makinenizden ekli bir e-posta göndermeye bir örnek. Burada sizinlocalhost internete bağlı ve e-posta gönderebilecek kadar yetenekli.
Misal
// File Name SendFileEmail.java
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendFileEmail {
public static void main(String [] args) {
// Recipient's email ID needs to be mentioned.
String to = "[email protected]";
// Sender's email ID needs to be mentioned
String from = "[email protected]";
// Assuming you are sending email from localhost
String host = "localhost";
// Get system properties
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", host);
// Get the default Session object.
Session session = Session.getDefaultInstance(properties);
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Create the message part
BodyPart messageBodyPart = new MimeBodyPart();
// Fill the message
messageBodyPart.setText("This is message body");
// Create a multipar message
Multipart multipart = new MimeMultipart();
// Set text message part
multipart.addBodyPart(messageBodyPart);
// Part two is attachment
messageBodyPart = new MimeBodyPart();
String filename = "file.txt";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// Send the complete message parts
message.setContent(multipart );
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
HTML e-postası göndermek için bu programı derleyin ve çalıştırın -
Çıktı
$ java SendFileEmail
Sent message successfully....
Kullanıcı Kimlik Doğrulama Bölümü
Kimlik doğrulama amacıyla e-posta sunucusuna kullanıcı kimliği ve Parola sağlamanız gerekiyorsa, bu özellikleri aşağıdaki gibi ayarlayabilirsiniz -
props.setProperty("mail.user", "myuser");
props.setProperty("mail.password", "mypwd");
E-posta gönderme mekanizmasının geri kalanı yukarıda açıklandığı gibi kalacaktır.
Java, çok iş parçacıklı bir programlama dilidir , yani Java kullanarak çok iş parçacıklı program geliştirebiliriz. Çok iş parçacıklı bir program, eşzamanlı olarak çalışabilen iki veya daha fazla parça içerir ve her bir parça, aynı anda farklı bir görevi yerine getirerek, bilgisayarınızda birden fazla CPU'ya sahip olduğunda mevcut kaynakların en iyi şekilde kullanılmasını sağlayabilir.
Tanım olarak, çoklu görev, birden çok işlemin bir CPU gibi ortak işlem kaynaklarını paylaşmasıdır. Çoklu iş parçacığı, çoklu görev fikrini, tek bir uygulama içindeki belirli işlemleri ayrı iş parçacıklarına ayırabileceğiniz uygulamalara genişletir. İpliklerin her biri paralel çalışabilir. İşletim sistemi, işlem süresini yalnızca farklı uygulamalar arasında değil, aynı zamanda bir uygulama içindeki her iş parçacığı arasında da böler.
Çoklu iş parçacığı, aynı programda birden çok etkinliğin aynı anda ilerleyebileceği şekilde yazmanıza olanak tanır.
Bir İpliğin Yaşam Döngüsü
Bir iplik, yaşam döngüsünde çeşitli aşamalardan geçer. Örneğin, bir iplik doğar, başlar, çalışır ve sonra ölür. Aşağıdaki diyagram, bir dişin tüm yaşam döngüsünü göstermektedir.
Aşağıdakiler yaşam döngüsünün aşamalarıdır -
New- Yeni bir iş parçacığı, yeni durumda yaşam döngüsüne başlar. Program iş parçacığını başlatana kadar bu durumda kalır. Aynı zamanda birborn thread.
Runnable- Yeni doğan bir iplik başlatıldıktan sonra, iplik çalıştırılabilir hale gelir. Bu durumdaki bir iş parçacığının görevini yürüttüğü kabul edilir.
Waiting- Bazen, iş parçacığı başka bir iş parçacığının bir görevi gerçekleştirmesini beklerken bir iş parçacığı bekleme durumuna geçer. Bir iş parçacığı, yalnızca başka bir iş parçacığı beklemede iş parçacığının yürütülmeye devam etmesi için sinyal verdiğinde çalıştırılabilir duruma geri döner.
Timed Waiting- Çalıştırılabilir bir iş parçacığı, belirli bir zaman aralığı için zamanlı bekleme durumuna girebilir. Bu durumdaki bir iş parçacığı, bu zaman aralığı sona erdiğinde veya beklediği olay meydana geldiğinde çalıştırılabilir duruma geri döner.
Terminated (Dead) - Çalıştırılabilir bir iş parçacığı, görevini tamamladığında veya başka şekilde sona erdiğinde sonlandırılmış duruma girer.
Konu Öncelikleri
Her Java iş parçacığının, işletim sisteminin iş parçacıklarının zamanlanacağı sırayı belirlemesine yardımcı olan bir önceliği vardır.
Java iş parçacığı öncelikleri MIN_PRIORITY (1 sabit) ve MAX_PRIORITY (10 sabit) arasındadır. Varsayılan olarak, her iş parçacığına NORM_PRIORITY (5 sabit) önceliği verilir.
Daha yüksek önceliğe sahip iş parçacıkları bir program için daha önemlidir ve daha düşük öncelikli iş parçacıklarından önce işlemci zamanı tahsis edilmelidir. Bununla birlikte, iş parçacığı öncelikleri iş parçacıklarının yürütüldüğü sırayı garanti edemez ve büyük ölçüde platforma bağlıdır.
Çalıştırılabilir Bir Arayüz Uygulayarak Bir İş Parçacığı Oluşturun
Sınıfınızın bir iş parçacığı olarak çalıştırılması amaçlanıyorsa, bunu bir Runnablearayüz. Üç temel adımı izlemeniz gerekecek -
Aşama 1
İlk adım olarak, bir tarafından sağlanan run () yöntemini uygulamanız gerekir. Runnablearayüz. Bu yöntem, iş parçacığı için bir giriş noktası sağlar ve tüm iş mantığınızı bu yöntemin içine koyacaksınız. Aşağıda, run () yönteminin basit bir sözdizimi verilmiştir -
public void run( )
Adım 2
İkinci bir adım olarak, bir Thread aşağıdaki yapıcıyı kullanan nesne -
Thread(Runnable threadObj, String threadName);
Nerede, threadObj bir sınıfın bir örneği olup bu uygularRunnable arayüz ve threadName yeni konuya verilen isimdir.
Aşama 3
Bir Thread nesnesi oluşturulduktan sonra, onu arayarak başlatabilirsiniz. start()run () yöntemine bir çağrı yürüten yöntem. Aşağıda, start () yönteminin basit bir sözdizimi verilmiştir -
void start();
Misal
İşte yeni bir iş parçacığı oluşturan ve onu çalıştırmaya başlayan bir örnek -
class RunnableDemo implements Runnable {
private Thread t;
private String threadName;
RunnableDemo( String name) {
threadName = name;
System.out.println("Creating " + threadName );
}
public void run() {
System.out.println("Running " + threadName );
try {
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// Let the thread sleep for a while.
Thread.sleep(50);
}
} catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
RunnableDemo R1 = new RunnableDemo( "Thread-1");
R1.start();
RunnableDemo R2 = new RunnableDemo( "Thread-2");
R2.start();
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.
Bir İş Parçacığı Sınıfını Genişleterek Bir İş Parçacığı Oluşturun
Bir iş parçacığı oluşturmanın ikinci yolu, genişleyen yeni bir sınıf oluşturmaktır. Threadaşağıdaki iki basit adımı kullanarak sınıf. Bu yaklaşım, Thread sınıfındaki mevcut yöntemler kullanılarak oluşturulan birden çok iş parçacığı işlemede daha fazla esneklik sağlar.
Aşama 1
Geçersiz kılmanız gerekecek run( )Thread sınıfında mevcut yöntem. Bu yöntem, iş parçacığı için bir giriş noktası sağlar ve tüm iş mantığınızı bu yöntemin içine koyacaksınız. Aşağıda, run () yönteminin basit bir sözdizimi verilmiştir -
public void run( )
Adım 2
Thread nesnesi oluşturulduktan sonra, onu arayarak başlatabilirsiniz. start()run () yöntemine bir çağrı yürüten yöntem. Aşağıda, start () yönteminin basit bir sözdizimi verilmiştir -
void start( );
Misal
İşte İpliği uzatmak için yeniden yazılmış önceki program -
class ThreadDemo extends Thread {
private Thread t;
private String threadName;
ThreadDemo( String name) {
threadName = name;
System.out.println("Creating " + threadName );
}
public void run() {
System.out.println("Running " + threadName );
try {
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// Let the thread sleep for a while.
Thread.sleep(50);
}
} catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo T1 = new ThreadDemo( "Thread-1");
T1.start();
ThreadDemo T2 = new ThreadDemo( "Thread-2");
T2.start();
}
}
Bu, aşağıdaki sonucu verecektir -
Çıktı
Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.
Konu Yöntemleri
Aşağıda, Thread sınıfında bulunan önemli yöntemlerin listesi bulunmaktadır.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public void start() İş parçacığını ayrı bir yürütme yolunda başlatır, ardından bu Thread nesnesinde run () yöntemini çağırır. |
2 | public void run() Bu Thread nesnesi ayrı bir Runnable hedefi kullanılarak başlatılmışsa, bu Runnable nesnesinde run () yöntemi çağrılır. |
3 | public final void setName(String name) Thread nesnesinin adını değiştirir. Adı almak için bir getName () yöntemi de vardır. |
4 | public final void setPriority(int priority) Bu Thread nesnesinin önceliğini ayarlar. Olası değerler 1 ile 10 arasındadır. |
5 | public final void setDaemon(boolean on) True parametresi, bu Thread'ı bir arka plan iş parçacığı olarak gösterir. |
6 | public final void join(long millisec) Geçerli iş parçacığı bu yöntemi ikinci bir iş parçacığı üzerinde çağırır ve mevcut iş parçacığının ikinci iş parçacığı sona erene veya belirtilen milisaniye sayısı geçene kadar engellenmesine neden olur. |
7 | public void interrupt() Bu iş parçacığını keserek herhangi bir nedenle engellenmişse yürütmeye devam etmesine neden olur. |
8 | public final boolean isAlive() İş parçacığı canlıysa true döndürür; bu, iş parçacığı başlatıldıktan sonra ancak tamamlanmadan önce çalıştırılır. |
Önceki yöntemler, belirli bir Thread nesnesinde çağrılır. Thread sınıfındaki aşağıdaki yöntemler statiktir. Statik yöntemlerden birini çağırmak, şu anda çalışan iş parçacığı üzerinde işlemi gerçekleştirir.
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public static void yield() Şu anda çalışan iş parçacığının planlanmayı bekleyen aynı önceliğe sahip diğer tüm iş parçacıklarını vermesine neden olur. |
2 | public static void sleep(long millisec) Şu anda çalışan iş parçacığının en azından belirtilen milisaniye kadar engellenmesine neden olur. |
3 | public static boolean holdsLock(Object x) Mevcut iş parçacığı verilen Nesnedeki kilidi tutuyorsa doğru döndürür. |
4 | public static Thread currentThread() Bu yöntemi çağıran iş parçacığı olan şu anda çalışan iş parçacığına bir başvuru döndürür. |
5 | public static void dumpStack() Çok iş parçacıklı bir uygulamada hata ayıklarken yararlı olan, şu anda çalışan iş parçacığı için yığın izlemeyi yazdırır. |
Misal
Aşağıdaki ThreadClassDemo programı, Thread sınıfının bu yöntemlerinden bazılarını göstermektedir. Bir sınıf düşününDisplayMessage hangi uygular Runnable -
// File Name : DisplayMessage.java
// Create a thread to implement Runnable
public class DisplayMessage implements Runnable {
private String message;
public DisplayMessage(String message) {
this.message = message;
}
public void run() {
while(true) {
System.out.println(message);
}
}
}
Aşağıdaki, Thread sınıfını genişleten başka bir sınıftır -
// File Name : GuessANumber.java
// Create a thread to extentd Thread
public class GuessANumber extends Thread {
private int number;
public GuessANumber(int number) {
this.number = number;
}
public void run() {
int counter = 0;
int guess = 0;
do {
guess = (int) (Math.random() * 100 + 1);
System.out.println(this.getName() + " guesses " + guess);
counter++;
} while(guess != number);
System.out.println("** Correct!" + this.getName() + "in" + counter + "guesses.**");
}
}
Aşağıda, yukarıda tanımlanan sınıfları kullanan ana program yer almaktadır -
// File Name : ThreadClassDemo.java
public class ThreadClassDemo {
public static void main(String [] args) {
Runnable hello = new DisplayMessage("Hello");
Thread thread1 = new Thread(hello);
thread1.setDaemon(true);
thread1.setName("hello");
System.out.println("Starting hello thread...");
thread1.start();
Runnable bye = new DisplayMessage("Goodbye");
Thread thread2 = new Thread(bye);
thread2.setPriority(Thread.MIN_PRIORITY);
thread2.setDaemon(true);
System.out.println("Starting goodbye thread...");
thread2.start();
System.out.println("Starting thread3...");
Thread thread3 = new GuessANumber(27);
thread3.start();
try {
thread3.join();
} catch (InterruptedException e) {
System.out.println("Thread interrupted.");
}
System.out.println("Starting thread4...");
Thread thread4 = new GuessANumber(75);
thread4.start();
System.out.println("main() is ending...");
}
}
Bu, aşağıdaki sonucu verecektir. Bu örneği tekrar tekrar deneyebilirsiniz ve her seferinde farklı bir sonuç alırsınız.
Çıktı
Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Goodbye
Goodbye
Goodbye
Goodbye
Goodbye
.......
Başlıca Java Çoklu Okuma Kavramları
Java'da Multithreading programlama yaparken, aşağıdaki kavramları çok kullanışlı bir şekilde kullanmanız gerekir -
İş parçacığı senkronizasyonu nedir?
Interthread iletişimi yönetme
İş parçacığı kilitlenmesinin ele alınması
Başlıca iş parçacığı işlemleri
Bir appletWeb tarayıcısında çalışan bir Java programıdır. Bir uygulama, tam olarak işlevsel bir Java uygulaması olabilir, çünkü emrinde tüm Java API'sine sahiptir.
Bir uygulama ile bağımsız bir Java uygulaması arasında aşağıdakiler dahil bazı önemli farklılıklar vardır:
Bir uygulama, java.applet.Applet sınıfını genişleten bir Java sınıfıdır.
Bir uygulamada main () yöntemi çağrılmaz ve uygulama sınıfı main () öğesini tanımlamaz.
Applet'ler bir HTML sayfasına gömülecek şekilde tasarlanmıştır.
Bir kullanıcı, bir uygulama içeren bir HTML sayfasını görüntülediğinde, uygulamanın kodu, kullanıcının makinesine indirilir.
Bir uygulamayı görüntülemek için bir JVM gereklidir. JVM, Web tarayıcısının bir eklentisi veya ayrı bir çalışma zamanı ortamı olabilir.
Kullanıcının makinesindeki JVM, uygulama sınıfının bir örneğini yaratır ve uygulamanın ömrü boyunca çeşitli yöntemleri çağırır.
Applet'ler, Web tarayıcısı tarafından zorunlu kılınan katı güvenlik kurallarına sahiptir. Bir uygulamanın güvenliğine genellikle sanal alan güvenliği olarak atıfta bulunulur ve uygulamayı bir sanal alanda oynayan bir çocukla, uyulması gereken çeşitli kurallarla karşılaştırır.
Uygulamanın ihtiyaç duyduğu diğer sınıflar tek bir Java Arşivi (JAR) dosyasında indirilebilir.
Bir Applet'in Yaşam Döngüsü
Applet sınıfındaki dört yöntem, üzerine ciddi bir uygulama geliştirdiğiniz çerçeveyi verir -
init- Bu yöntem, uygulamanız için gerekli olan başlatma için tasarlanmıştır. Uygulama etiketi içindeki param etiketleri işlendikten sonra çağrılır.
start- Bu yöntem, tarayıcı başlatma yöntemini çağırdıktan sonra otomatik olarak çağrılır. Ayrıca, kullanıcı diğer sayfalara gittikten sonra uygulamayı içeren sayfaya her döndüğünde çağrılır.
stop- Bu yöntem, kullanıcı uygulamanın bulunduğu sayfadan çıktığında otomatik olarak çağrılır. Bu nedenle, aynı uygulamada tekrar tekrar çağrılabilir.
destroy- Bu yöntem yalnızca tarayıcı normal şekilde kapandığında çağrılır. Applet'lerin bir HTML sayfasında yaşaması amaçlandığından, normalde bir kullanıcı uygulamayı içeren sayfadan ayrıldıktan sonra kaynakları geride bırakmamalısınız.
paint- start () yönteminden hemen sonra ve ayrıca uygulamanın tarayıcıda kendini yeniden boyaması gerektiğinde çağrılır. Paint () yöntemi aslında java.awt'tan miras alınır.
Bir "Merhaba Dünya" Uygulaması
Aşağıda HelloWorldApplet.java adlı basit bir uygulama yer almaktadır -
import java.applet.*;
import java.awt.*;
public class HelloWorldApplet extends Applet {
public void paint (Graphics g) {
g.drawString ("Hello World", 25, 50);
}
}
Bu import ifadeleri, sınıfları uygulama sınıfımızın kapsamına getirir -
- java.applet.Applet
- java.awt.Graphics
Bu içe aktarma ifadeleri olmadan, Java derleyicisi, uygulama sınıfının başvurduğu Applet ve Graphics sınıflarını tanımaz.
Applet Sınıfı
Her uygulama, java.applet.Applet sınıfının bir uzantısıdır . Temel Applet sınıfı, türetilmiş bir Applet sınıfının tarayıcı bağlamından bilgi ve hizmetler elde etmek için çağırabileceği yöntemler sağlar.
Bunlar, aşağıdakileri yapan yöntemleri içerir -
- Uygulama parametrelerini alın
- Uygulamayı içeren HTML dosyasının ağ konumunu alın
- Uygulama sınıfı dizininin ağ konumunu alın
- Tarayıcıda bir durum mesajı yazdırın
- Bir görüntü getir
- Bir ses klibi getir
- Bir ses klibi oynatın
- Uygulamayı yeniden boyutlandırın
Ek olarak, Applet sınıfı, görüntüleyicinin veya tarayıcının uygulama hakkında bilgi aldığı ve uygulamanın yürütülmesini kontrol ettiği bir arayüz sağlar. İzleyici şunları yapabilir:
- Uygulamanın yazarı, sürümü ve telif hakkı hakkında bilgi isteyin
- Uygulamanın tanıdığı parametrelerin açıklamasını isteyin
- Uygulamayı başlatın
- Uygulamayı yok edin
- Uygulamanın yürütmesini başlatın
- Uygulamanın yürütülmesini durdurun
Applet sınıfı, bu yöntemlerin her birinin varsayılan uygulamalarını sağlar. Bu uygulamalar gerektiğinde geçersiz kılınabilir.
"Merhaba, Dünya" uygulaması olduğu haliyle tamamlanmıştır. Geçersiz kılınan tek yöntem boyama yöntemidir.
Bir Applet Çağırmak
Bir uygulama, yönergelerin bir HTML dosyasına gömülmesi ve dosyanın bir uygulama görüntüleyicisi veya Java'nın etkin olduğu bir tarayıcı aracılığıyla görüntülenmesi yoluyla çağrılabilir.
<applet> etiketi, bir uygulamayı bir HTML dosyasına yerleştirmenin temelidir. Aşağıda, "Merhaba, Dünya" uygulamasını çağıran bir örnek verilmiştir -
<html>
<title>The Hello, World Applet</title>
<hr>
<applet code = "HelloWorldApplet.class" width = "320" height = "120">
If your browser was Java-enabled, a "Hello, World"
message would appear here.
</applet>
<hr>
</html>
Note- HTML'den applet çağırma hakkında daha fazla bilgi edinmek için HTML Applet Etiketine başvurabilirsiniz .
<applet> etiketinin kod niteliği gereklidir. Çalıştırılacak Applet sınıfını belirtir. Bir uygulamanın çalıştığı panelin başlangıç boyutunu belirtmek için genişlik ve yükseklik de gereklidir. Uygulama yönergesi bir </applet> etiketiyle kapatılmalıdır.
Bir uygulama parametre alırsa, <applet> ile </applet> arasına <param> etiketleri eklenerek parametreler için değerler geçirilebilir. Tarayıcı, uygulama etiketleri arasındaki metni ve diğer etiketleri göz ardı eder.
Java içermeyen tarayıcılar <applet> ve </applet> 'i işlemez. Bu nedenle, uygulama ile ilgili olmayan etiketler arasında görünen her şey, Java'nın etkin olmadığı tarayıcılarda görülebilir.
Görüntüleyici veya tarayıcı, belgenin konumunda derlenmiş Java kodunu arar. Aksini belirtmek için, gösterildiği gibi <applet> etiketinin kod tabanı niteliğini kullanın -
<applet codebase = "https://amrood.com/applets" code = "HelloWorldApplet.class"
width = "320" height = "120">
Bir uygulama, varsayılandan farklı bir pakette bulunuyorsa, paket / sınıf bileşenlerini ayırmak için tutma paketi, nokta karakteri (.) Kullanılarak kod özniteliğinde belirtilmelidir. Örneğin -
<applet = "mypackage.subpackage.TestApplet.class"
width = "320" height = "120">
Uygulama Parametrelerini Alma
Aşağıdaki örnek, bir uygulamanın belgede belirtilen kurulum parametrelerine nasıl yanıt vereceğini gösterir. Bu uygulama siyah ve ikinci bir renk dama tahtası desenini gösterir.
Her karenin ikinci rengi ve boyutu, belge içindeki uygulamaya parametreler olarak belirtilebilir.
CheckerApplet parametrelerini init () yönteminde alır. Paint () yönteminde parametrelerini de alabilir. Bununla birlikte, değerleri her yenilemede değil, uygulamanın başlangıcında bir kez almak ve ayarları kaydetmek uygun ve etkilidir.
Uygulama görüntüleyicisi veya tarayıcı, çalıştırdığı her uygulamanın init () yöntemini çağırır. İzleyici, uygulamayı yükledikten hemen sonra init () 'i çağırır. (Applet.init () hiçbir şey yapmamak için uygulanır.) Özel başlatma kodunu eklemek için varsayılan uygulamayı geçersiz kılın.
Applet.getParameter () yöntemi, parametrenin adı verilen bir parametreyi getirir (bir parametrenin değeri her zaman bir dizedir). Değer sayısal veya karakter olmayan başka bir veriyse, dizenin ayrıştırılması gerekir.
Aşağıdaki CheckerApplet.java'nın bir iskeletidir -
import java.applet.*;
import java.awt.*;
public class CheckerApplet extends Applet {
int squareSize = 50; // initialized to default size
public void init() {}
private void parseSquareSize (String param) {}
private Color parseColor (String param) {}
public void paint (Graphics g) {}
}
İşte CheckerApplet init () ve özel parseSquareSize () yöntemleri -
public void init () {
String squareSizeParam = getParameter ("squareSize");
parseSquareSize (squareSizeParam);
String colorParam = getParameter ("color");
Color fg = parseColor (colorParam);
setBackground (Color.black);
setForeground (fg);
}
private void parseSquareSize (String param) {
if (param == null) return;
try {
squareSize = Integer.parseInt (param);
} catch (Exception e) {
// Let default value remain
}
}
Uygulama, squareSize parametresini ayrıştırmak için parseSquareSize () öğesini çağırır. parseSquareSize (), bir dizeyi ayrıştıran ve bir tamsayı döndüren Integer.parseInt () kitaplık yöntemini çağırır. Integer.parseInt (), argümanı geçersiz olduğunda bir istisna atar.
Bu nedenle, parseSquareSize (), uygulamanın hatalı girdide başarısız olmasına izin vermek yerine istisnaları yakalar.
Uygulama, color parametresini bir Color değerine ayrıştırmak için parseColor () öğesini çağırır. parseColor (), parametre değerini önceden tanımlanmış bir rengin adıyla eşleştirmek için bir dizi dize karşılaştırması yapar. Bu uygulamanın çalışması için bu yöntemleri uygulamanız gerekir.
Applet Parametrelerini Belirtme
Aşağıda, içinde CheckerApplet'in gömülü olduğu bir HTML dosyası örneği yer almaktadır. HTML dosyası, <param> etiketi aracılığıyla her iki parametreyi de uygulamaya belirtir.
<html>
<title>Checkerboard Applet</title>
<hr>
<applet code = "CheckerApplet.class" width = "480" height = "320">
<param name = "color" value = "blue">
<param name = "squaresize" value = "30">
</applet>
<hr>
</html>
Note - Parametre adları büyük / küçük harfe duyarlı değildir.
Apletlere Uygulama Dönüşümü
Grafiksel bir Java uygulamasını (yani, AWT'yi kullanan ve Java program başlatıcısı ile başlayabileceğiniz bir uygulama) bir web sayfasına yerleştirebileceğiniz bir uygulamaya dönüştürmek kolaydır.
Aşağıda, bir uygulamayı bir uygulamaya dönüştürmek için belirli adımlar yer almaktadır.
Uygulama kodunu yüklemek için uygun etiketi içeren bir HTML sayfası oluşturun.
JApplet sınıfının bir alt sınıfını sağlayın. Bu sınıfı herkese açık yapın. Aksi takdirde, uygulama yüklenemez.
Uygulamadaki ana yöntemi ortadan kaldırın. Uygulama için bir çerçeve penceresi oluşturmayın. Uygulamanız tarayıcının içinde görüntülenecektir.
Herhangi bir başlatma kodunu çerçeve penceresi yapıcısından uygulamanın init yöntemine taşıyın. Uygulama nesnesini açıkça oluşturmanıza gerek yoktur. Tarayıcı sizin için somutlaştırır ve init yöntemini çağırır.
SetSize çağrısını kaldırın; apletler için boyutlandırma, HTML dosyasındaki genişlik ve yükseklik parametreleriyle yapılır.
SetDefaultCloseOperation çağrısını kaldırın. Bir uygulama kapatılamaz; tarayıcı çıktığı zaman sona erer.
Uygulama setTitle'ı çağırırsa, yönteme yapılan çağrıyı ortadan kaldırın. Applet'lerin başlık çubukları olamaz. (Elbette, HTML başlık etiketini kullanarak web sayfasının kendisine başlık verebilirsiniz.)
SetVisible (true) 'yu çağırmayın. Uygulama otomatik olarak görüntülenir.
Olay işleme
Applet'ler Container sınıfından bir grup olay işleme yöntemini devralır. Container sınıfı, belirli olay türlerini işlemek için processKeyEvent ve processMouseEvent gibi çeşitli yöntemleri ve ardından processEvent adlı bir tümünü yakalama yöntemini tanımlar.
Bir olaya tepki vermek için, bir uygulama, uygun olaya özgü yöntemi geçersiz kılmalıdır.
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.applet.Applet;
import java.awt.Graphics;
public class ExampleEventHandling extends Applet implements MouseListener {
StringBuffer strBuffer;
public void init() {
addMouseListener(this);
strBuffer = new StringBuffer();
addItem("initializing the apple ");
}
public void start() {
addItem("starting the applet ");
}
public void stop() {
addItem("stopping the applet ");
}
public void destroy() {
addItem("unloading the applet");
}
void addItem(String word) {
System.out.println(word);
strBuffer.append(word);
repaint();
}
public void paint(Graphics g) {
// Draw a Rectangle around the applet's display area.
g.drawRect(0, 0,
getWidth() - 1,
getHeight() - 1);
// display the string inside the rectangle.
g.drawString(strBuffer.toString(), 10, 20);
}
public void mouseEntered(MouseEvent event) {
}
public void mouseExited(MouseEvent event) {
}
public void mousePressed(MouseEvent event) {
}
public void mouseReleased(MouseEvent event) {
}
public void mouseClicked(MouseEvent event) {
addItem("mouse clicked! ");
}
}
Şimdi bu uygulamayı şu şekilde adlandıralım -
<html>
<title>Event Handling</title>
<hr>
<applet code = "ExampleEventHandling.class"
width = "300" height = "300">
</applet>
<hr>
</html>
Başlangıçta, uygulama "uygulamayı başlatıyor. Uygulamayı başlatıyor." Dikdörtgenin içine tıkladığınızda "fare tıklandı" da görüntülenecektir.
Görüntüleri Görüntüleme
Bir uygulama, GIF, JPEG, BMP ve diğerleri formatındaki görüntüleri gösterebilir. Uygulama içinde bir görüntüyü görüntülemek için, java.awt.Graphics sınıfında bulunan drawImage () yöntemini kullanırsınız.
Aşağıda, resimleri göstermek için tüm adımları gösteren bir örnek verilmiştir -
import java.applet.*;
import java.awt.*;
import java.net.*;
public class ImageDemo extends Applet {
private Image image;
private AppletContext context;
public void init() {
context = this.getAppletContext();
String imageURL = this.getParameter("image");
if(imageURL == null) {
imageURL = "java.jpg";
}
try {
URL url = new URL(this.getDocumentBase(), imageURL);
image = context.getImage(url);
} catch (MalformedURLException e) {
e.printStackTrace();
// Display in browser status bar
context.showStatus("Could not load image!");
}
}
public void paint(Graphics g) {
context.showStatus("Displaying image");
g.drawImage(image, 0, 0, 200, 84, null);
g.drawString("www.javalicense.com", 35, 100);
}
}
Şimdi bu uygulamayı şu şekilde adlandıralım -
<html>
<title>The ImageDemo applet</title>
<hr>
<applet code = "ImageDemo.class" width = "300" height = "200">
<param name = "image" value = "java.jpg">
</applet>
<hr>
</html>
Ses Çalma
Bir uygulama, java.applet paketinde AudioClip arayüzü tarafından temsil edilen bir ses dosyasını oynatabilir. AudioClip arayüzünün aşağıdakiler dahil üç yöntemi vardır:
public void play() - Ses klibini baştan itibaren bir kez çalar.
public void loop() - Ses klibinin sürekli olarak yeniden oynatılmasına neden olur.
public void stop() - Ses klibini oynatmayı durdurur.
Bir AudioClip nesnesi elde etmek için, Applet sınıfının getAudioClip () yöntemini çağırmanız gerekir. URL gerçek bir ses dosyasına çözümlense de çözümlenmesin getAudioClip () yöntemi hemen geri döner. Ses dosyası, ses klibini oynatma girişiminde bulunulana kadar indirilmez.
Aşağıda, bir ses çalmak için tüm adımları gösteren bir örnek verilmiştir -
import java.applet.*;
import java.awt.*;
import java.net.*;
public class AudioDemo extends Applet {
private AudioClip clip;
private AppletContext context;
public void init() {
context = this.getAppletContext();
String audioURL = this.getParameter("audio");
if(audioURL == null) {
audioURL = "default.au";
}
try {
URL url = new URL(this.getDocumentBase(), audioURL);
clip = context.getAudioClip(url);
} catch (MalformedURLException e) {
e.printStackTrace();
context.showStatus("Could not load audio file!");
}
}
public void start() {
if(clip != null) {
clip.loop();
}
}
public void stop() {
if(clip != null) {
clip.stop();
}
}
}
Şimdi bu uygulamayı şu şekilde adlandıralım -
<html>
<title>The ImageDemo applet</title>
<hr>
<applet code = "ImageDemo.class" width = "0" height = "0">
<param name = "audio" value = "test.wav">
</applet>
<hr>
</html>
Yukarıdaki örneği test etmek için PC'nizde test.wav'ı kullanabilirsiniz.
Java dili üç tür yorumu destekler -
Sr.No. | Yorum ve Açıklama |
---|---|
1 | /* text */ Derleyici / * ile * / arasındaki her şeyi yok sayar. |
2 | //text Derleyici // satırın sonuna kadar her şeyi yok sayar. |
3 | /** documentation */ Bu bir dokümantasyon açıklamasıdır ve genel olarak doc comment. JDK javadocaracı, otomatik olarak oluşturulan belgeleri hazırlarken belge açıklamalarını kullanır . |
Bu bölüm tamamen Javadoc'u açıklamakla ilgili. Java kodu için yararlı belgeler oluşturmak üzere Javadoc'u nasıl kullanabileceğimizi göreceğiz.
Javadoc nedir?
Javadoc, JDK ile birlikte gelen bir araçtır ve önceden tanımlanmış bir formatta dokümantasyon gerektiren Java kaynak kodundan HTML formatında Java kodu dokümantasyonu oluşturmak için kullanılır.
Aşağıda /*….*/ içindeki satırların Java'nın çok satırlı yorumları olduğu basit bir örnek verilmiştir. Benzer şekilde, önceki satır Java tek satırlı yorumdur.
Misal
/**
* The HelloWorld program implements an application that
* simply displays "Hello World!" to the standard output.
*
* @author Zara Ali
* @version 1.0
* @since 2014-03-31
*/
public class HelloWorld {
public static void main(String[] args) {
// Prints Hello, World! on standard output.
System.out.println("Hello World!");
}
}
Açıklama kısmına gerekli HTML etiketlerini ekleyebilirsiniz. Örneğin, aşağıdaki örnekte başlık için <h1> .... </h1> ve paragraf sonu oluşturmak için <p> kullanılmıştır -
Misal
/**
* <h1>Hello, World!</h1>
* The HelloWorld program implements an application that
* simply displays "Hello World!" to the standard output.
* <p>
* Giving proper comments in your program makes it more
* user friendly and it is assumed as a high quality code.
*
*
* @author Zara Ali
* @version 1.0
* @since 2014-03-31
*/
public class HelloWorld {
public static void main(String[] args) {
// Prints Hello, World! on standard output.
System.out.println("Hello World!");
}
}
Javadoc Etiketleri
Javadoc aracı aşağıdaki etiketleri tanır -
Etiket | Açıklama | Sözdizimi |
---|---|---|
@yazar | Bir sınıfın yazarını ekler. | @author adı-metin |
{@code} | Metni HTML biçimlendirmesi veya yuvalanmış javadoc etiketleri olarak yorumlamadan, metni kod yazı tipinde görüntüler. | {@code text} |
{@docRoot} | Oluşturulan herhangi bir sayfadan oluşturulan belgenin kök dizininin göreli yolunu temsil eder. | {@docRoot} |
@deprecated | Bu API'nin artık kullanılmaması gerektiğini belirten bir yorum ekler. | @deprecated kullanımdan kaldırılmış metin |
@istisna | Bir ekler Throws sınıf adı ve açıklama metni ile oluşturulan dokümantasyonun alt başlığı. | @exception sınıf adı açıklaması |
{@inheritDoc} | Şuradan bir yorum devralır: nearest devralınabilir sınıf veya uygulanabilir arayüz. | En yakın üst sınıftan bir yorum alır. |
{@link} | Başvurulan bir sınıfın belirtilen paket, sınıf veya üye adı için belgelere işaret eden görünür metin etiketli bir satır içi bağlantı ekler. | {@link package.class # üye etiketi} |
{@linkplain} | Bağlantının etiketinin kod yazı tipinden ziyade düz metin olarak görüntülenmesi dışında {@link} ile aynıdır. | {@linkplain package.class # üye etiketi} |
@param | Belirtilen parametre adı ve ardından belirtilen açıklamayı "Parametreler" bölümüne içeren bir parametre ekler. | @param parametre adı açıklaması |
@dönüş | Açıklama metniyle bir "İadeler" bölümü ekler. | @return açıklaması |
@görmek | Referansa işaret eden bir bağlantı veya metin girişi içeren bir "Ayrıca Bkz." Başlığı ekler. | @ bkz. referans |
@seri | Varsayılan serileştirilebilir alan için belge yorumunda kullanılır. | @ seri alan açıklaması | dahil | hariç tutmak |
@serialData | WriteObject () veya writeExternal () yöntemleriyle yazılan verileri belgeler. | @serialData veri açıklaması |
@serialField | Bir ObjectStreamField bileşenini belgeler. | @serialField alan-adı alan-türü alan-açıklaması |
@dan beri | Oluşturulan belgelere belirtilen başlangıç metni ile bir "Başlangıç" başlığı ekler. | @since release |
@throws | @Throws ve @exception etiketleri eşanlamlıdır. | @ sınıf adı açıklamasını atar |
{@value} | Statik bir alanın belge yorumunda {@value} kullanıldığında, bu sabitin değerini görüntüler. | {@value package.class # alanı} |
@version | -Version seçeneği kullanıldığında, oluşturulan dokümanlara belirtilen sürüm metniyle bir "Sürüm" alt başlığı ekler. | @version sürüm metni |
Misal
Aşağıdaki program, dokümantasyon yorumları için mevcut olan birkaç önemli etiketi kullanır. Gereksinimlerinize göre diğer etiketleri kullanabilirsiniz.
AddNum sınıfıyla ilgili dokümantasyon, AddNum.html HTML dosyasında üretilecek ancak aynı zamanda index.html adlı bir ana dosya da oluşturulacaktır.
import java.io.*;
/**
* <h1>Add Two Numbers!</h1>
* The AddNum program implements an application that
* simply adds two given integer numbers and Prints
* the output on the screen.
* <p>
* <b>Note:</b> Giving proper comments in your program makes it more
* user friendly and it is assumed as a high quality code.
*
* @author Zara Ali
* @version 1.0
* @since 2014-03-31
*/
public class AddNum {
/**
* This method is used to add two integers. This is
* a the simplest form of a class method, just to
* show the usage of various javadoc Tags.
* @param numA This is the first paramter to addNum method
* @param numB This is the second parameter to addNum method
* @return int This returns sum of numA and numB.
*/
public int addNum(int numA, int numB) {
return numA + numB;
}
/**
* This is the main method which makes use of addNum method.
* @param args Unused.
* @return Nothing.
* @exception IOException On input error.
* @see IOException
*/
public static void main(String args[]) throws IOException {
AddNum obj = new AddNum();
int sum = obj.addNum(10, 20);
System.out.println("Sum of 10 and 20 is :" + sum);
}
}
Şimdi, yukarıdaki AddNum.java dosyasını javadoc yardımcı programını kullanarak aşağıdaki gibi işleyin -
$ javadoc AddNum.java
Loading source file AddNum.java...
Constructing Javadoc information...
Standard Doclet version 1.7.0_51
Building tree for all the packages and classes...
Generating /AddNum.html...
AddNum.java:36: warning - @return tag cannot be used in method with void return type.
Generating /package-frame.html...
Generating /package-summary.html...
Generating /package-tree.html...
Generating /constant-values.html...
Building index for all the packages and classes...
Generating /overview-tree.html...
Generating /index-all.html...
Generating /deprecated-list.html...
Building index for all classes...
Generating /allclasses-frame.html...
Generating /allclasses-noframe.html...
Generating /index.html...
Generating /help-doc.html...
1 warning
$
Oluşturulan tüm belgeleri buradan kontrol edebilirsiniz - EkNum . JDK 1.7 kullanıyorsanız, javadoc harika birstylesheet.css, bu nedenle standart stil sayfasını şuradan indirmenizi ve kullanmanızı öneririz: https://docs.oracle.com/javase/7/docs/api/stylesheet.css