Bunun için yaz
metodundaki self
parametresini silmek yeterli.
Evet bunu biliyorum. Ancak self
ön eki ile erişilebilir yazınca bunun nasıl olduğunu merak ettim. Yine de teşekkürler.
dedim ya, java’da sınıf içerisinden de olsa örnek oluşturmadan metodu çağıramazsınız.
Python’da:
import random
chars = "abcdefgh"
class deneme:
def __init__(self):
a = self.MyMethod() #Buraya dikkat! self kullanarak sınıf metodumuza eriştik
print(a.upper())
def MyMethod(self):
return random.choice(chars)
def MyMethod2(self):
return self.MyMethod().title() # ve yine self kullanarak eriştik . . .
Java’da:
public class Denemelerim{
public static void main(String args[]) {
Denemelerim nesne = new Denemelerim(); // Bunu yapmak zorundayız
nesne.metod();
}
void metod() {
System.out.println("Coderistan");
}
}
Java’da python’daki sözlük benzeri yapılar var mı?
Anahtar-değer yapısına sahip?
Şimdi anlaşıldı. Aynı olay elbette Java’da da var. Şimdi Java örneğinde nesne oluşturduğunuz yere dikkat edin.
public static void main(String[] args){
...
}
Bu metot static bir metotdur. Yani nesne oluşturularak erişilemez. Peki bu metot ne işe yarar? Bir Java programı başladığı zaman ilk olarak main() metodundan başlar. Bu metot static’dir, nesneye ait değildir.
Yani nesneye ait olmaması ne demek? Yani bu main() metodu içerisinden, sınıfın diğer metotlarına erişme denemeleriniz başarısız olacaktır. Peki bir sınıfta diğer metotlara ulaşılamıyor mu? Elbette ulaşılabiliyor. this
anahtar kelimesi, tam olarak Python’da bulunan self
anahtar kelimesinin karşılığıdır.
Yazdığınız Python örneğinin Java’da benzerini yazalım ve görelim
public class Coderistan {
public Coderistan(){ // Sınıfın kurucu metodu
int a = this.MyMethod(); // <- self anahtarı ile aynı işi yapıyor
System.out.println(a);
}
public int MyMethod(){
return (int)(100*Math.random()); // random sayı
}
public int MyMethod2(){
return this.MyMethod()*5;
}
}
Yani her seferinde nesne oluşturmak diye birşey olamaz. Bir sınıfta this
anahtar kelimesi ile sınıfın static olmayan her elemanına erişebilirsiniz. Siz static bir alan içerisinden, static olmayan diğer alanlara erişemediğiniz için böyle bir algı oluşmuş.
Evet var. Map yapılarını kullanabilirsiniz.
Tamam, işte şimdi anladım! Çok kolaymış! Python’daki __init__
ile java’daki constructor, Sınıflarda öntanımlı toString()
metodu ile python’da __str__
metodu, hepsi aslında aynı! Java’ya ısınmaya başlıyorum. Durmak yok, çalışmaya devam . . .
Her ne kadar böyle desem de hatalarla cebelleşmeden olmuyor.
package myjavaproject;
import java.util.Scanner;
public class MyJavaProject {
public static void main(String arg[]) {
System.out.print("Nasılsın?");
Scanner ham_veri = new Scanner(System.in);
String veri = ham_veri.nextLine();
switch(veri.equals()) { // Hata!
case("iyiyim"):
System.out.println("Buna çok sevindim!");
case("kötüyüm"):
System.out.println("Buna çok üzüldüm!");
default:
System.out.println("Hatalı giriş!");
}
}
}
Nasılsın?iyiyim
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: java.lang.String.equals
at myjavaproject.MyJavaProject.main(MyJavaProject.java:9)
C:\Users\acer\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 4 seconds)
Bakın python’daki RunTimeError
Şöyle bir yanlışlık var. veri.equals()
bir parametre almak zorundadır. Ayrıca bu metot geriye, switch-case ile kullanabileceğiniz bir String döndürmez. Şöyle yapabilirsiniz ancak;
public static void main(String[] args) {
System.out.print("Nasılsın?");
Scanner ham_veri = new Scanner(System.in);
String veri = ham_veri.nextLine();
switch (veri) { // Hata!
case ("iyiyim"):
System.out.println("Buna çok sevindim!");
break;
case ("kötüyüm"):
System.out.println("Buna çok üzüldüm!");
break;
default:
System.out.println("Hatalı giriş!");
}
}
Aynı zamanda bir case bloğunda iş bittikten sonra break koymazsanız, alta geçecek ve geri kalan tüm koşulları çalıştıracaktır.
Python’dan Java’ya geçiş yapanlar için yazılmış şu kaynağı da okumak isteyebilirsiniz.
http://interactivepython.org/runestone/static/java4python/index.html
Bende ingilizce ne arar . . .
Okuldan öğrendiğim 7. sınıf ingilizcesi var sadece. Büyüyünce iyi bir ingilizce kursuna gideceğim ya da mütercim tercümanlık bölümünü okuyacağım ve iyi bir üniversitede (odtü gibi …) Yazılım mühendisliği bölümünü okuyacağım!! Hayali bile o kadar güzel ki
Ama verdiğiniz kaynağı da iyice inceleyeceğim inşallah.
Kaynağı ingilizce bilmeseniz bile az biraz anlayabilirsiniz sanırım. Çünkü örnekler üzerinden anlatılmış karşılaştırmalar. Ayrıca google translate ne güne duruyor
Umarım hayallerinize kavuşursunuz
Bilgisayarla ilgili olmayan ingilizce’leri çevirebiliyor ama kod barındıran bir sitede bazen saçma sapan bir şekilde kodları çeviriyor. Açıkçası yazılımla ile ilgiliyse okuyacağım kaynak çok girmiyorum o işe.
İnşallah
Deneyeceğiz bakalım hayırlısı. Ama artık biraz dinlensem iyi olacak. İyi akşamlar
Size de iyi akşamlar kolay gelsin.
İki sekme açın. Birini çevirtin. Diğerinden de kodlara bakın
Merhaba;
Şu this deyimi ile ilgili sorun yaşadım.
Aşağıdaki python programıyla aynı işi yapan java programını yazmaya çalışıyordum:
class Deneme:
def __init__(self, sayi):
self.sayi = sayi
def carp(self, sayi):
return self.sayi * sayi
def topla(self, sayi):
return self.sayi + sayi
veri = input("Lütfen sayı girin: ")
nesne = Deneme(int(veri))
print("Toplama: "+str(nesne.topla(10)))
print("Çarpma: "+str(nesne.carp(10))
Ve şunu yazdım:
package myproject;
import java.util.Scanner;
public class MyProject {
public static void main(String[] args) {
System.out.print("Lütfen Sayı girin: ");
Scanner s = new Scanner(System.in);
int veri = s.nextInt();
Deneme nesne = new Deneme(veri);
System.out.println("Çarpma: "+nesne.carp(10)); } }
class Deneme {
public Deneme(int arg) {
int sayi = arg; } // Burada sayi yerine this.sayi yazmayı da denedim ama olmuyor
int carp(int arg) {
return arg * this.sayi; } // Hata
int topla(int arg) {
return arg + this.sayi; } } // Hata
Hatayı paylaşma gereksinimi duymadım, sorunu anlamışsınızdır zaten.
Yardımlarınızı bekliyorum, iyi günler
Deneme classını main classının dışına yazar mısınız.Emin değilim ama ondan dolayı olabilir belki
Siz kurucu metot içerisinde bir değişken tanımlamışsınız ve bu değişkene başka metotlar üzerinden erişmeye çalışmışsınız.
Bir değişken, tanımlandığı bloklar {}
arasında geçerlidir. Bu yüzden değişkeninizin tüm sınıf tarafından erişilir olması için, sınıf tanımladığınız satırın hemen altına değişkenleri eklemeniz gerekir. En alta da yazabilirsiniz, önemli olan metotların blokları dışında tanımlamaktır.
class Sinif{
String degisken;
public Sinif(){
this.degisken = "değer";
this.sayi = this.sayi+10;
}
int sayi = 0; // burada da tanımlanabilir.
}
Kodun düzeltilmiş hali
import java.util.Scanner;
public class MyProject {
public static void main(String[] args) {
System.out.print("Lütfen Sayı girin: ");
Scanner s = new Scanner(System.in);
int veri = s.nextInt();
Deneme nesne = new Deneme(veri);
System.out.println("Çarpma: "+nesne.carp(10));
}
}
class Deneme {
int sayi;
public Deneme(int arg) {
this.sayi = arg;
}
int carp(int arg) {
return arg * this.sayi;
}
int topla(int arg) {
return arg + this.sayi;
}
}
Java, isim alanları konusunda Python’dan biraz farklıdır, bu sebeple karşılaştırma yapmanızı önermem. Mümkünse Java’yı Python’dan bağımsız bir şekilde öğrenin; Java öğrenmeden önce Python’ı unutun. Bu arada Java’da kafanız karışmış, JavaScript öğrenmeye çalışsanız çok daha kötü bir
this
olduğunu göreceksiniz orada. Şaka maka
this
meselesi iyi öğrenilmesi gereken karışık bir mesele.
Hocam kolay mı öyle Python’ı unutmak Yani o sınıf yapıcısını yazarken “Şu anda Python’da
__init__
metodunu yazıyorum.” diye düşünüyorum. Farklılıklar da sürekli karışıklığa sebep oluyor. Belki ilk başta Java öğrensem bu kadar sorun yaşamazdım…
Python’da öyle değil ama başka programlama dillerinde öyle galiba
Öğrenmenin zevki çok başka… Java öğrenirken sanki daha yeni python öğrendiğim günlerde gibiyim
Ben bunu ilk gördüğümde ne işime yarayacak ki demiştim. Demek bu işe yarıyormuş