Aşağıdaki adresi yeni keşfettim. Gerçekten ilgi çekici HTML5 uygulamaları mevcut.
Bir göz atın derim
Aşağıdaki adresi yeni keşfettim. Gerçekten ilgi çekici HTML5 uygulamaları mevcut.
Bir göz atın derim
Bir kaç aydır android programlama ile ilgileniyorum. Google, android plugini Eclipse için çıkarmıştı bildiğiniz gibi. Bu yüzden android uygulama denemelerimi Eclipse üzerinde gerçekleştiriyordum. Tabi java uygulamaları için de aynı ideyi kullanıyordum. Java Teknolojileri ve Programcıları Derneği’nin Bahçeşehir Üniversitesinde gerçekleştirdiği bir etkinlikte muhabbet arasında IntelliJ IDEA yı da tavsiye edenler olmuştu. Geçenlerde merak edip IntelliJ IDEA Community Edition kurdum ve denedim. İzlenim olarak şunu söyleyebilirim, gerçekten kullanıcı dostu bir ide. Intellisense özelliği Eclipse’e göre çok daha hızlı çalışıyor, bu durumda siz de daha hızlı kod yazıyorsunuz ve sizi kod yazmaya teşvik ediyor. Diğer yandan, izlenimlerime göre, performans olarak Eclipse e göre daha yavaş çalışıyor. Bir projeyi load etmesi biraz uzun sürüyor. Ayrıca bazı forumlarda hafızayı çok kullandığı yönünde de eleştiriler okudum. Çok fazla Eclipse vs IntelliJ IDEA olayına girmeden konuya gireyim.
IntelliJ IDEA aynı zamanda android geliştirmeye de destek veriyor (Araştırdığıma göre Eclipsedeki gibi plugin olarak değil, Ant scriptleri ile bunu sağlıyormuş). Ben de basit bir android uygulaması denemek istedim ve proje oluşturmaya başladım. Sıra android sdknın yerini belirlemeye geldi ve “..Android/android-sdk” classpath ini tanımladım. Ama IntelliJ şu hatayı verdi -> “cannot find any android targets in this sdk”. Ne yaparsam yapayım, bilgisayarımda android sdk kurulu olmasına rağmen, bir türlü intellij android sdkyı görmüyordu. Yabancı forumlarda gezinip araştırdıktan sonra sorunun çözümünü buldum.
Ayarlar şekildeki gibi olmalı->
Artık IntelliJ IDEA da android-sdk nın yerini belirleyebilirsiniz. Umarım bu sorunla karşılaşanlar için faydalı bir yazı olmuştur.
Netbeans de basit bir midleti çalıştırırken, Execution failed with error code 1 hatası aldım. Biraz araştırdıktan sonra öğrendim ki sorun jdknın 64-bit olmasından kaynaklanıyor. Nedeni ise mobil cihazlar 32-bit mimariyi destekliyorlar. Çözüm için yapılması gereken 64-bit jdk yı kaldırıp 32-bit jdk kullanmak.
Bu yazıda javada abstract class ve interface kullanımından bahsedeceğim. Öncelikle bu kavramlardan kısaca bahsetmek istiyorum.
Java’da interface, bir class’ta olması gereken methodları ve dataları tanımlayan yapıdır. İçinde herhangi bir implementasyon barındırmaz, sadece methodların prototype larını yani “ne yapılacağını” gösterirler. Yani interfaceleri bir nevi kılavuz gibi düşünebiliriz. Bir class’ın interface’deki bütün method’ları içerdiğini, gerçekleştirdiğini belirtmesine implementation denir ve ‘implements‘ keyword’üyle kullanılır. Peki ne işe yarar bu interfaceler?
Örnekte gördüğümüz üzere Airplane, Bird ve Superman classları Flyer interface ini implement ediyorlar. Böylece 3 class için de ortak olan methodların bodylerini classlarda implement etmiş oluyoruz. Ayrıca bir class, bir classdan hem türetilip hem de birden fazla interface i implement edebilir. Çünkü interface implement edince class’a eklenen bişey yoktur. Class sadece interfacedeki methodları ve dataları içereceğini belirtir ve methodların implementasyonlarını sağlar.
Java’da abstract classlar, bazı methodların implementasyonu sağlayan, diğer methodların implementasyonlarını ise subclasslara bırakan classlardır. Bu implement edilmesi alt classlara bırakılan methodlara da abstract method denir. Abstract classlar, subclassların ortak özelliklerini taşırlar. Abstract methodların da subclasslarda kullanımı ortak olup, implementasyonları farklıdır. Örneğin “hacim hesaplama” ortak bir methodken, küp ve küre hacimi hesaplaması farklıdır. Bu yüzden hacim hesaplama methodu abstract olarak tanımlanır ve alt classlar kendilerince bu methodu implement ederler.
Şimdi bütün bu anlattıklarımı bir örnek üzerinden pekiştirelim. Örneğimiz hayvanlar üzerine olacak J Önce abstract olarak Animal classını yazalım. Bu class bütün hayvanlar için bir super class olacak.
public abstract class Animal {
protected int legs;
protected Animal(int legs) {
this.legs = legs;
}
public abstract void eat();
public void walk() {
System.out.println("This animal walks on " + legs + " legs.");
}
}
Animal classından Spider classını türetelim. Örümceğin 8 bacaklı olduğunu constructorda belirtelim ve abstract method olan eat() methoduna body yazalım.
public class Spider extends Animal {
public Spider() {
super(8);
}
public void eat() {
System.out.println("Spiders catch flies in their webs to eat.");
}
}
Şimdi Pet interface i yazalım. Bu interface i evcil hayvanlar implement edecek. Interfacelerin herhangi bir implementasyon içermediğini sadece bir kılavuz olduklarını tekrar hatırlatayım. Evcil hayvanın ismi olur ve oyun oynarlar diyelim.
public interface Pet {
public void setName(String name);
public String getName();
public void play();
}
Daha sonra Cat classını yazalım. Cat classı Animal classını extend edip, Pet classını da implement edecek.
public class Cat extends Animal implements Pet {
private String name;
public Cat(String name) {
super(4);
this.name = name;
}
public Cat() {
this("");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void play() {
System.out.println(name + " likes to play with string.");
}
public void eat() {
System.out.println("Cats like to eat spiders and mice.");
}
}
Aynı şekilde Fish class ı da yazalım.
public class Fish extends Animal implements Pet {
private String name;
public Fish() {
super(0); // this line must be here
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void play() {
System.out.println("Fish swim in their tanks all day.");
}
public void walk() {
super.walk();
System.out.println("Fish, of course, can't walk; they swim.");
}
public void eat() {
System.out.println("Fish eat pond scum.");
}
}
Main methodunu barındıran TestAnimals classını yazalım ve programımızı çalıştıralım.
public class TestAnimals {
public static void main(String[] args) {
Fish f = new Fish();
Cat c = new Cat("Fluffy");
Animal a = new Fish();
Animal e = new Spider();
// Demonstrate different implementations of an interface
f.play();
c.play();
// Demonstrate virtual method invocation
e.eat();
e.walk();
// Demonstrate calling super methods
a.walk();
}
}
Ekran çıktımız şu şekilde olacak:
Merhaba arkadaşlar. Bu yazıda method overriding nedir, javada method overriding nasıl yapılır konularından bahsedeceğim. Bildiğimiz üzere inheritance ile birlikte, türetilen class türetildiği classın bütün özelliklerini taşır. Genelde bu inherit edilen methodlar düzgün çalışır ama bazen türettiğimiz classa göre o methodları değiştirmek isteyebiliriz. İşte bu işleme “method overriding” deniyor.
Bir örnek üzerinden gidelim. Elimizde “Employee” ve “Manager” classları olsun. Manager classı Employee classından türetilsin ( Manager is an Employee ).
public class Employee {
protected double salary;
protected String name;
protected Date birthDate;
public String getDetails(){
return "Name: " + name + "\n"
+ "Salary: " + salary;
}
}
public class Manager extends Employee {
protected String department;
public String getDetails(){
return "Name: " + name + "\n"
+ "Salary: " + salary + "\n"
+ "Manager of: " + department;
}
}
Manager classı Employee classından farklı olarak String tipinde “department” adında bir değişkene sahip ve getDetails() methodu da override edilmiş durumda. Böylece Manager classının kendisine ait bir getDetails() methodu olmuş oluyor ve override edildiği methoda ek olarak Manager’in department değişkenini de geri döndürüyor.
Gördüğünüz gibi kolay bir işlem ama method overriding yaparken bazı temel kurallar var. Bir subclass, parent classın methodunu şu koşullar altında override edebilir:
Son madde biraz karışık oldu ama şöyle açıklayayım. Mesela yukarıdaki örnekte Employee classındaki getDetails() methodu public olarak tanımlanmış. Bu demek oluyor ki Manager classındaki override edilmiş getDetails() methodu protected, private veya default olamaz! Çünkü bu 3 erişim belirleyici methodun erişimini daha kısıtlı hale getirir. Bu yüzden override ettiğimiz getDetails() methodunu da public olarak tanımladık. Bu konuyla ilgili olarak şu yazıma bakmanızı öneririm.
Ayrıca bu noktada super kullanımından da bahsedeyim. Eğer override edeceğimiz methodu tamamen değiştirmek istemiyorsak, sadece geliştirmek ekleme yapmak istiyorsak ( yukarıdaki örnekteki gibi ), ozaman super anahtar sözcüğünü kullanabiliriz. Bu sayede parent class ın methodlarını ya da datalarını çekebiliyoruz. Bir küçük ayrıntı olarak şunu da söyleyeyim, extend ettiğimiz class, başka bir classdan inherit edilmişse o en tepedeki classa da super anahtar sözcüğü ile ulaşabiliyoruz. Kullanımı şu şekilde:
public class Manager extends Employee {
protected String department;
public String getDetails(){
return super.getDetails() +
"\nManager of: " + department;
}
}
Merhaba arkadaşlar. Paket kavramından bahsettikten sonra bu yazıda da java erişim belirleyicileri konusuna göz atalım. Javada 4 tane erişim belirleme yöntemi var. Bunlar private, default, protected ve public. Bu belirleyicilerle javada erişim kontrolü sağlanmış oluyor. Bir örnek üzerinden anlatmaya çalışacağım.
Elimizde kendi yarattığımız “alpha” ve “beta” isminde iki tane paketimiz olsun. Alpha paketinin içinde A ve B classları var. A classının foo() adında bir methodu var. Beta paketinde ise C ve D classları var. C classı, A classından inherit edilmiş(türetilmiş) durumda.
Şimdi bahsettiğim 4 belirleyiciyi A classının foo() methodu üzerinde değerlendirmeye başlayalım.
1 – foo() methodu private olarak tanımlanırsa:
A classı kendi methoduna erişebilir. Aynı pakette bulunan B classı A classının foo() methoduna erişemez. A classından inherit edilmiş C classı da foo() methoduna erişemez. Ayrıca D classının da foo() methoduna erişimi sağlanamaz.
2 – Aslında Javada default diye bir access specifier yok. Burda bahsedilen default, boş bırakıp hiçbir specifier kullanmama durumu. Şimdi foo() default olarak tanımlanırsa erişime bir bakalım:
Bu sefer B classı foo() methoduna erişebilir. Yani aynı paketten erişim sağlanabilir. Subclassdan ve dışarıdan erişim sağlanamaz.
3 – Eğer foo() methodu protected olarak tanımlanırsa:
Aynı paketteki B classı ve A classından inherit edilmiş olan C classı, foo() methoduna erişim sağlayabilir. Bunun dışında dışarıdan erişim sağlanamaz.
4 – Son olarak methodu public olarak tanımlarsak erişime bir bakalım:
Bu sefer foo() methoduna heryerden erişim sağlanabiliyor. Adı üstünde public hale geliyor.
Java API bir yazılım kütüphanesidir. Java technology API içinde yüzlerce önceden tanımlanmış class var. Bu classları organize bir şekilde saklamak ve sağlamak “paket” kavramını ortaya çıkartıyor. Paket kullanımı konusunda örnek için önceki yazılarıma bakabilirsiniz.
Bu önceden tanımlanmış hazır Java classları gruplar halinde paketlenmiştir. Mesela database classları bir pakette, dosya okuma için gereken I/O classları başka bir pakette, network için gereken classlar ise bir diğer pakette duruyor gibi düşünebiliriz.
Mesela String classı, Math classı, System classı java.lang paketinin içindedir. java.lang paketi, programcının bişey yapmasına gerek kalmadan, otomatik olarak java programına eklenir. Bunun sebebi bu classların yaygın olarak kullanılmasıdır.
Diğer classları kullanmak için onları kodumuza eklememiz gerekecek( import ile ). Örneğin kodumuza pencere, buton, scroll bar eklemek için java.awt paketinden import etmemiz lazım.
kullanımda genel syntax ise şu şekilde;
eğer bir paketteki bütün classları kullanmak istiyorsak class name yerine * kullanıyoruz.
Peki nedir bu nesneye yönelik programlama. Temel olarak programlamaya iki yaklaşım mevcut. Birisi yordamsal (procedural) programlama diğeri ise nesneye yönelik (object oriented) programlama.
Procedural programlamadan kabaca bahsedecek olursak, program steplere bölünür ve sırasıyla bütün stepler gerçekleştirilir.
Tabi yordamsal programlamanın zayıf noktaları var. Zaten bu noktada “object oriented programming” kavramına ihtiyaç doğuyor. Bu zaafları maddeler halinde sıralayacak olursak;
Nesneye yönelik programlamada ise adından da anlaşılacağı gibi bütün dikkat nesnelerin üzerine verilir. Yazılımlar birbirleriyle iletişim kurabilen nesneler topluluğu olarak tasarlanır ve gerçekleştirilirler. Nesneler metodlar (methods) ve nitelikler’den (attributes) oluşur. Nitelikler, nesnelerin sahip oldukları verilere, metodlar ise bunlar üzerinde yapılabilecek işlemlere karşılık gelir. OOP kavramına yabancı arkadaşların kafasında bir şeyler canlanması adına örnek verecek olursak, sipariş veren bir müşteri objesi ya da hesap açan bir banka objesini düşünebiliriz.
Kısaca yordamsal programlamada odak noktası basamaklar iken, nesneye yönelik programlamada ise programın operasyonlarını gerçekleştiren nesnelerdir.
Java programlama dili dağınık yapıda olması için tasarlanmıştır. Eski programlama dillerinde, programın çalıştırılmasının başında bütün program parçaları bir arada bulunuyordu. Javada ise programın bütün parçaları heryere dağılmış halde. Hatta internet üzerine bile dağıtılmış olabilir. Programın koşturulması sırasında ihtiyaç duyulan bütün bu parçacıklar bir araya toplanıyor. Bu özellik ile Java, distrubuted network teknolojilerine destek sağlamış oluyor.
Burada “basit” derken kastettiğim Javayı öğrenmenin kolay olduğu değil
Bahsettiğim şey Java nın programcı için her şeyi basitleştirmiş olması. Bu noktada kabaca bir Java vs C++ yapalım. Açıkçası C++ da başınızı belaya sokma olasılığınızın çok yüksek olduğu noktalar var. Mesela memory e direkt erişim(pointer), memory de yer ayırma(memory allocate), çoklu kalıtım (multiple inheritance) vs gibi gerçekten çok dikkat edilmesi gereken konular var. Javayı tasarlayanlar Javada, C++ dan daha sonra ortaya çıkmış bir dil olarak, programcının tehlikeye düşebileceği bu konuları göz önüne almış olacak ki riskleri minimize etmek için çeşitli yöntemler geliştirmişler. Peki neler bu riskleri azaltıyor?
Javada
Javayı tasarlayanlar çok kanallı (multithreaded) olmasına önem vermişler. Bu özellik Java programının aynı anda birden fazla işi gerçekleştirmesine olanak sağlıyor. Mesela şekilde bir kanal database e bağlanıyor, diğeri yazıcıya bağlanıyor, bir diğeri ise user interface i update ediyor. Java için çok önemli olan bu özellik web server ve database serverlarda kullanılıyor.
Javanın en önemli özelliklerinden bir tanesi olan güvenlik konusu javanın built-in olarak sağladığı bir özellik. Bütün Java programları JVM( Java Virtual Machine) üzerinden çalıştırılır. JVM java kodunu yorumlar(interprets) ve çalıştırır. Ama çalıştırmadan önce kodu, içinde güvensiz ya da sorun yaratabilecek içerik var mı diye kontrol eder. Mesela programın direkt olarak memory i manipule etmesine izin vermez. Ayrıca kodların geçerliliğini kontrol eder ve olmaması gereken şeyleri koddan çıkartır.
Javanın bence en önemli özelliklerinden bir diğeri ise platformlardan bağımsız olması. Resimde eskiden bir programın nası compile ve execute edildiğine bir bakalım. Mesela C diline bakacak olursak, önce source kodunuzu alıp C compiler ında compile ediyorsunuz. Bu compiler Solaris, Linux, Windows gibi farklı platformlar üstünde olabilir. Compiler işlem sonucunda bize bir binary dosyası verir. Bu binary dosyası platforma bağlıdır ve sadece o platform üzerinde çalıştırılabilir. Binary kod koşturulmadan önce link işlemine girer. Linker larda platforma bağlıdır. Sizin binary dosyanızla başka binary dosyalarını ve kütüphaneleri bir araya getirir ve çalıştırılabilir bir dosya oluşturur( executable file). Bu executable file da platforma bağlıdır ve sadece o platform üzerinde çalıştırılabilir. Yani Solaris Executable sadece Solaris Workstationda, Linux Executable sadece Linux Workstationda, Windows Executable sadece Windows Workstationda çalıştırılabilir.
C den farklı olarak Java programlama dili platformlarda bağımsızlık sağlar. Kodu yazıp compile edip istediğimiz platformda çalıştırabiliriz. Bu işlem nasıl gerçekleşiyor kısaca bahsedeyim. Source kodumuzu java compilerında run edip Java Bytecode elde ediyoruz. Bu bytecode herhangi bir platforma ait değil, bütün platformlarda JVM tarafından yorumlanarak çalıştırılabilir.
Javanın temel özelliklerini kısaca toparlamaya çalıştım. Umarım faydalı bir yazı olmuştur.
Şöyle bir baktım da en son yazımı 2 ay önce yazmışım. Bunun sebebi malumunuz her öğrencinin derdi olan vizeler ve projelerdi. Vizelerin bitmesiyle nihayet artık bir nebze rahatladık ve tekrar buraya yoğunlaşmaya karar verdim. Data structure ve system analysis projelerinden vakit bulduğum sürece finallere kadar yazılar yayınlamayı düşünüyorum. Peki neler yazacağım? Önceki yazılarımda niyetim sadece javaya çok basit bir giriş yapmak ve java programlama dilini tanıtmaktı. Açıkçası bundan sonraki yazılarımda javayı diğer oop dillerinden ayıran, javayı java yapan özellikler üstüne yoğunlaşmak istiyorum. Bu yüzden programlamaya yeni başlamış arkadaşlar için anlaması güç yazılar olabilir. Yani hedef kitle herhangi bir object oriented programlama diliyle daha önce uygulama geliştirmiş arkadaşlar olacak diyebilirim. Uzun vadede planım burada bir “temel java öğrenim kaynağı” oluşturmak. Şimdiden takip edenlere teşekkür ederim..