Pertanyaan Mengapa saya tidak bisa merujuk ke metode instan sementara secara eksplisit memohon konstruktor?


Apakah ada yang tahu mengapa Anda bisa referensi a static metode di baris pertama konstruktor menggunakan this() atau super(), tetapi bukan metode non-statis?

Pertimbangkan pekerjaan berikut:

public class TestWorking{
    private A a = null;
    public TestWorking(A aParam){
       this.a = aParam;
    }

    public TestWorking(B bParam)
    {
        this(TestWorking.getAFromB(bParam));
    }

    //It works because its marked static.
    private static A getAFromB(B param){
        A a = new A();
        a.setName(param.getName());
        return a;
    }
}

Dan contoh Non-Kerja berikut:

public class TestNotWorking{
    private A a = null;
    public TestNotWorking(A aParam){
       this.a = aParam;
    }

    public TestNotWorking(B bParam)
    {
        this(this.getAFromB(bParam));
    }

    //This does not work. WHY???
    private A getAFromB(B param){
        A a = new A();
        a.setName(param.getName());
        return a;
    }
}

32
2017-09-10 14:40


asal


Jawaban:


Metode non-statis adalah metode instan. Ini hanya dapat diakses dalam contoh yang ada, dan contoh belum ada saat Anda berada dalam konstruktor (masih dalam pembangunan).

Mengapa demikian? Karena metode instance dapat mengakses bidang instance (non-statis), yang dapat memiliki nilai yang berbeda dalam berbagai contoh, jadi tidak masuk akal untuk memanggil metode tersebut pada sesuatu yang lain daripada instance yang sudah ada dan selesai.


16
2017-09-10 14:44



Lihat Spesifikasi Bahasa Jawa 8.8.7.1. Ini menyatakan itu

Pernyataan pemanggilan konstruktor eksplisit dalam badan konstruktor tidak boleh merujuk ke variabel instan apa pun atau metode instance atau kelas batin yang dideklarasikan di kelas ini atau superclass apa pun, atau penggunaan this atau super dalam ekspresi apa pun; jika tidak, kesalahan waktu kompilasi terjadi.

Ini karena Anda tidak dapat memanggil metode instan sebelum instance dibuat. By the way, mungkin untuk memanggil metode instan nanti di konstruktor (meskipun bukan solusi untuk Anda).


11
2017-09-10 14:52



Saya pikir itu karena variabel instan final belum ditetapkan (jadi Anda belum memiliki contoh) dan metode instan dapat mengaksesnya. Padahal semua inisialisasi statis telah dilakukan sebelum konstruktor memanggil.

Greetz, GHad


1
2017-09-10 14:45



karena ketika Anda memanggil ini atau super dalam konstruktor, objek Anda belum dikonstruksi. (instance Anda belum diinisialisasi sepenuhnya). jadi memanggil metode instan tidak membuat keributan.


1
2017-09-10 14:45



TestNotWorking tidak diinisialisasi pada saat itu. Masalahnya adalah: konstruktor pertama (TestNotWorking (A aParam)) mungkin memanggil super () (internal selalu), yang berarti Anda akan memanggil metode sebelum konstruktor superclass dipanggil. Itu ilegal.


1
2017-09-10 14:51



Jika suatu metode tidak statis maka Anda harus memanggilnya pada objek.

Dalam contoh kedua, Anda perlu membuat objek kelas TestNotWorking dan telepon getAFromB pada objek itu.

Sesuatu seperti:

object = new TestNotWorking();
object.getAFromB(bParam);

0
2017-09-10 14:46