Java'ya yeni başlayanların karşılaştığı sorunlar

Bunun için yaz metodundaki self parametresini silmek yeterli.

1 Beğeni

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");
 }
}

:+1:

1 Beğeni

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ş.

2 Beğeni

Evet var. Map yapılarını kullanabilirsiniz.

1 Beğeni

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 :smile: . . .

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 :slight_smile:

1 Beğeni

Şö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.

2 Beğeni

Python’dan Java’ya geçiş yapanlar için yazılmış şu kaynağı da okumak isteyebilirsiniz.

http://interactivepython.org/runestone/static/java4python/index.html

2 Beğeni

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 :smiley:

Ama verdiğiniz kaynağı da iyice inceleyeceğim inşallah.

1 Beğeni

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 :wink:

Umarım hayallerinize kavuşursunuz :slight_smile:

2 Beğeni

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 :blush:

Deneyeceğiz bakalım hayırlısı. Ama artık biraz dinlensem iyi olacak. İyi akşamlar :wink:

1 Beğeni

Size de iyi akşamlar kolay gelsin.

2 Beğeni

İki sekme açın. Birini çevirtin. Diğerinden de kodlara bakın

1 Beğeni

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 :slight_smile:

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; 
    }
}
1 Beğeni

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. :smile: Bu arada Java’da kafanız karışmış, JavaScript öğrenmeye çalışsanız çok daha kötü bir this olduğunu göreceksiniz orada. :slight_smile: Şaka maka this meselesi iyi öğrenilmesi gereken karışık bir mesele.

3 Beğeni

Hocam kolay mı öyle Python’ı unutmak :joy: 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 :slight_smile:

Öğrenmenin zevki çok başka… Java öğrenirken sanki daha yeni python öğrendiğim günlerde gibiyim :blush:

:thinking: Ben bunu ilk gördüğümde ne işime yarayacak ki demiştim. Demek bu işe yarıyormuş :smile: