Saya menulis penjelasan untuk beberapa kode untuk kursus, dan secara tidak sengaja menggunakan kata-kata tersebut method
dan function
secara bergantian. Saya memutuskan untuk kembali dan memperbaiki kata-katanya, tetapi mengalami lubang dalam pemahaman saya.
Dari apa yang saya pahami, subrutin adalah function
jika tidak bertindak pada turunan kelas (efeknya dibatasi pada input / output eksplisitnya), dan method
jika beroperasi pada instance kelas (mungkin membawa efek samping pada contoh yang membuatnya tidak murni).
Ada diskusi bagus di sini tentang topik tersebut. Perhatikan bahwa dengan definisi jawaban yang diterima, statis method
seharusnya menjadi fungsi karena sebuah instance tidak pernah diteruskan secara implisit, dan tidak memiliki akses ke anggota instance mana pun.
Dengan pikiran ini, bukankah seharusnya statis methods
menjadi fungsi?
Menurut definisi mereka, mereka tidak bertindak atas contoh kelas tertentu; mereka hanya "terikat" dengan kelas karena hubungan. Saya telah melihat beberapa situs berpenampilan bagus yang merujuk pada subrutin statis sebagai "metode" ( Oracle , Fredosaurus , ProgrammingSimplified ), jadi entah mereka semua mengabaikan terminologi, atau saya melewatkan sesuatu (tebakan saya adalah yang terakhir) .
Saya ingin memastikan bahwa saya menggunakan kata-kata yang benar.
Adakah yang bisa membereskan ini?
sumber
Jawaban:
Kutipan dari 8.4.3.2 ini dapat membantu:
Java hanya ingin Anda "berpikir berorientasi objek". Selain itu, metode statis memiliki akses ke cakupan sekitarnya yang mungkin mencakup status. Di satu sisi, kelas itu seperti objek itu sendiri.
sumber
@FunctionalInterface
anotasi dan dengan 1 metode di bawah tenda. Lambda hanyalah gula sintaksis dan dalam hal ini tidak ada yang baru.Jawaban sederhananya adalah ketika Java memutuskan untuk menyebut semuanya sebagai "metode", mereka tidak peduli tentang perbedaan antara fungsi dan metode dalam ilmu komputer teoretis.
sumber
Metode statis bukanlah fungsi yang tepat, perbedaannya halus, tetapi penting.
Metode statis yang hanya menggunakan parameter masukan yang diberikan pada dasarnya adalah sebuah fungsi.
Tetapi metode statis dapat mengakses variabel statis dan fungsi statis lainnya (juga menggunakan variabel statis) sehingga metode statis dapat memiliki status yang secara fundamental berbeda dengan fungsi yang menurut definisi stateless . (TAMBAHAN: Meskipun programmer sering tidak terlalu ketat dalam menggunakan "fungsi" sebagai definisi, fungsi ketat dalam ilmu komputer hanya dapat mengakses parameter input). Jadi mendefinisikan kasus mengakses bidang statis ini, tidak valid untuk mengatakan bahwa metode statis selalu berfungsi.
Perbedaan lain yang membenarkan penggunaan "metode statis" adalah Anda dapat mendefinisikan dalam C turunan fungsi global dan variabel global yang dapat diakses di mana saja. Jika Anda tidak dapat mengakses kelas yang berisi metode statis, metode tersebut juga tidak dapat diakses. Jadi "metode statis" dibatasi dalam ruang lingkupnya dengan desain berbeda dengan fungsi global.
sumber
Di Java, kelas yang ditentukan pengguna sebenarnya adalah turunan dari subkelas java.lang.Class.
Dalam hal ini, metode statis yang melekat pada sebuah instance dari kelas konseptual: mereka melekat ke sebuah contoh dari subclass dari java.lang.Class.
Dengan pemikiran ini, istilah "metode kelas" (nama alternatif untuk metode statis Java) mulai masuk akal. Dan istilah "metode kelas" dapat ditemukan di banyak tempat: Objective C, Smalltalk, dan JLS - untuk menyebutkan beberapa saja.
sumber
Dalam fungsi ilmu komputer dengan jelas memetakan ke metode statis. Tapi "metode" kelas agak umum, seperti "anggota" (anggota lapangan, anggota metode). Ada kata-kata seperti
Jadi alasannya, seperti yang dikatakan oleh filosof Ludwig Wittgenstein, Bahasa adalah alat dengan konteks yang berbeda. "Metode" adalah moniker yang bagus dalam kutipan di atas untuk mengkategorikan "anggota".
sumber
Pemikiran Anda benar dan masuk akal. Hanya saja terminologi belum mapan di masyarakat Jawa. Izinkan saya menjelaskan beberapa internal yang dapat membantu memahami mengapa terminologi itu ada.
Java adalah bahasa berorientasi objek berbasis kelas. Metode selalu menjadi anggota kelas atau instance (Ini adalah pernyataan umum yang juga berlaku untuk bahasa pemrograman lain). Kami memikirkan kelas dan instance sebagai kedua objek.
Metode instance (dinamis)
Anda tidak dapat memanggil metode ini dari kelas secara langsung, Anda harus membuat sebuah instance. Setiap contoh mereferensikan metode itu. Anda dapat menimpa definisi metode dengan tanda tangan metode yang sama persis (saat membuat subclass), yaitu referensi menunjuk ke metode yang berbeda (yang memiliki tanda tangan yang sama, tetapi dapat memiliki badan metode yang berbeda). Metodenya dinamis.
Metode kelas (statis)
Anda hanya dapat memanggil metode ini dari kelas secara langsung, misalnya Anda tidak perlu membuat turunan dari kelas itu. Hanya ada satu definisi global dari metode itu di seluruh program. Anda tidak dapat menimpa tanda tangan metode yang sama persis jika metode tersebut dinyatakan statis, karena hanya ada satu definisi yang valid untuk keseluruhan program. Perhatikan bahwa metode ini adalah anggota dari objek kelas itu sendiri, semua instance memiliki referensi unik (dan perbaikan) yang sama ke metode itu.
sumber
Berikut adalah pandangan lain tentang terminologi, menggunakan Scala sebagai mnemonik:
Di Scala Anda memiliki
object
s, yang merupakan instance tunggal dari kelas yang didefinisikan secara implisit1 .Sesuai definisi Anda, kami dapat memanggil subrutin ini milik
object
metode , karena mereka beroperasi pada satu instance kelas.Selain itu objek juga akan mendefinisikan kelas A, dan membuat semua metode di objek A sebagai metode statis pada kelas A (untuk berinteraksi dengan Java) [2] .
Oleh karena itu kita dapat mengatakan bahwa metode statis kelas A Java mengakses anggota yang sama dengan instance tunggal Scala, yang menurut definisi Anda layak disebut metode (statis) kelas A.
sumber
object
referensi Anda sangat masuk akal. Terima kasih.Tentu saja, perbedaan utamanya adalah - metode dapat menggunakan bidang statis, tidak hanya parameter metode. Tetapi ada satu tambahan - polimorfisme! Hasil evaluasi Kelas A. doTheSameStaticMethod () dan ClassB.doTheSameStaticMehod () akan bergantung pada kelas. Dalam hal ini fungsinya tidak berdaya.
sumber
Setiap kelas memiliki objek untuk mewakilinya yang merupakan turunan dari subkelas
Class
kelas. Metode statis sebenarnya adalah metode contoh pada objek ini yang merupakan turunan dari subkelas Kelas. Mereka memiliki akses ke status dalam bentuk bidang statis, jadi mereka tidak terbatas hanya pada fungsi (tanpa negara). Itu adalah metode.sumber