Mendefinisikan kelas abstrak tanpa metode abstrak

114

Bisakah saya mendefinisikan kelas abstrak tanpa menambahkan metode abstrak?

VisaMasterCard
sumber
1
Contoh yang baik dapat ditemukan di pola dekorator, lihat di sini . Keduanya WindowDecoratordan CoffeeDecoratormerupakan abstractkelas, tetapi tidak ada yang menyertakan abstractmetode.
MS Dousti

Jawaban:

168

Tentu saja.

Mendeklarasikan abstrak kelas hanya berarti Anda tidak mengizinkannya dibuat instance-nya sendiri.

Mendeklarasikan abstrak metode berarti bahwa subclass harus menyediakan implementasi untuk metode itu.

Keduanya adalah konsep yang terpisah, meskipun jelas Anda tidak dapat memiliki metode abstrak di kelas non-abstrak. Anda bahkan dapat memiliki kelas abstrak dengan finalmetode tetapi tidak pernah sebaliknya.

biziclop
sumber
14

Ya kamu bisa melakukannya. Mengapa Anda tidak mencoba melakukan itu?

Marc W.
sumber
6
Dan bukan hanya OP. Lihat semua suara positif yang didapat pertanyaan itu!
Marc W
54
@ karim79 Tidak perlu kuda tinggi dan semua hal yang menuang saus. Mencoba tidak cukup mengungkapkan mengapa hal itu diizinkan, sementara menanyakannya mungkin.
biziclop
7
@bizclop - Mencoba sendiri mungkin akan menghasilkan pertanyaan yang lebih produktif. Tidak ada kuda yang tinggi. Ini sangat mudah. Pertanyaannya adalah 'Bisakah saya' daripada 'Mengapa melakukan ini ...'.
karim79
8
Jika pertanyaan dapat dijawab dengan ya atau tidak, maka penanya harus mempertimbangkan untuk mengubah kalimat, menggunakan Google, atau sekadar mencobanya.
Tyler Treat
3
@ Karim79 Ya, pertanyaannya bisa saja diungkapkan dengan lebih baik, tetapi saya rasa tidak perlu banyak usaha untuk melihat selangkah lebih maju.
biziclop
8

Ya kamu bisa. Kelas abstrak yang digunakan di java menandakan bahwa Anda tidak dapat membuat objek kelas. Dan metode abstrak subclass harus menyediakan implementasi untuk metode itu.

Jadi, Anda dapat dengan mudah menentukan kelas abstrak tanpa metode abstrak apa pun.

Adapun Contoh:

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

Ini bagus.

Shreyos Adikari
sumber
6

YA Anda dapat membuat kelas abstrak tanpa metode abstrak. Contoh terbaik kelas abstrak tanpa metode abstrak adalah HttpServlet
Metode Abstrak adalah metode yang tidak memiliki isi, Jika Anda mendeklarasikan setidaknya satu metode ke dalam kelas, kelas tersebut harus dideklarasikan sebagai abstract its mandatory TAPI jika Anda mendeklarasikan class abstrak, tidak wajib mendeklarasikan metode abstrak di dalam class.

Anda tidak dapat membuat objek kelas abstrak, yang berarti tidak dapat dibuat instance-nya.

JegsVala
sumber
4

Ya, Anda bisa mendeklarasikan kelas yang tidak bisa dibuat sendiri dengan hanya metode yang sudah memiliki implementasi. Ini akan berguna jika Anda ingin menambahkan metode abstrak di masa mendatang, atau jika Anda tidak ingin kelas dibuat secara langsung meskipun tidak memiliki properti abstrak.

Gordon Gustafson
sumber
Pertanyaannya bukan tentang kelas abstrak kosong, hanya kelas abstrak tanpa metode abstrak. Sejauh yang saya bisa lihat, tidak ada alasan yang valid untuk menggunakan kelas abstrak yang benar-benar kosong.
biziclop
1
Jawaban diperbaiki. Menggunakan kelas abstrak kosong dapat berguna jika Anda memiliki alasan kuat untuk ingin menambahkan metode abstrak nanti dan tidak harus berurusan dengan pemfaktoran ulang kelas induk lainnya.
Gordon Gustafson
1
Di tengah hierarki, kelas abstrak yang benar-benar kosong (kecuali untuk spesifikasi warisan) mungkin masuk akal jika turunan dari kelas itu akan memiliki kewajiban kontrak yang berbeda dari turunan lain dari induk.
supercat
3

ya, kita dapat mendeklarasikan kelas abstrak tanpa metode abstrak apa pun. tujuan mendeklarasikan kelas sebagai abstrak bukan untuk membuat instance kelas tersebut.

jadi dua kasus

1) kelas abstrak dengan metode abstrak.

jenis kelas ini, kita harus mewarisi kelas dari kelas abstrak ini dan harus mengganti metode abstrak di kelas kita, mis: kelas GenricServlet

2) kelas abstrak tanpa metode abstrak.

kelas jenis ini, kita harus mewarisi kelas dari kelas abstrak ini, misalnya: tujuan kelas HttpServlet lakukan adalah meskipun Anda jika Anda tidak mengimplementasikan logika Anda di kelas anak Anda bisa mendapatkan logika induk

silakan periksa kode sumber HttpServlet

Manoj Kalluri
sumber
2

Ya, kita dapat memiliki kelas abstrak tanpa Metode Abstrak karena keduanya merupakan konsep independen. Mendeklarasikan abstrak kelas berarti ia tidak dapat dibuat instance-nya sendiri dan hanya dapat dibuat sub-kelas. Mendeklarasikan abstrak metode berarti Metode akan didefinisikan di subkelas.

Vivek Vermani
sumber
Mengapa saya tidak ingin kelas tersebut tidak dapat dipakai? Ada alasan bagus, misalnya?
karlihnos
1

ya kamu bisa melakukan itu.

mendeklarasikan class abstract berarti bahwa class tidak akan dibuat instance-nya oleh class lain.

dan harus ada setidaknya satu metode abstrak di dalamnya dan artinya Anda dapat mendeklarasikan metode abstrak di kelas itu jika Anda tidak mendeklarasikan metode daripada ok.

contoh:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

ini pasti akan berhasil.

Kishan Dhamat
sumber
1

Ya kamu bisa. Kadang-kadang Anda mungkin ditanyai pertanyaan ini bahwa apa tujuan melakukan ini? Jawabannya adalah: terkadang kita harus membatasi class agar tidak membuat instance sendiri. Dalam hal ini, kami ingin pengguna memperluas kelas Abstrak kami dan membuat instance kelas anak

Nandkishor Gokhe
sumber
1

Ya, Anda dapat menentukan kelas abstrak tanpa metode abstrak. Namun, jika tidak ada metode di dalam Anda mungkin lebih baik menggunakan antarmuka

fmucar
sumber
4
Ide bagus untuk menggunakan batas minimal 30 karakter.
Marc W
1
Jika tidak ada metode abstrak lalu bagaimana sebuah antarmuka dapat digunakan? Antarmuka memiliki semua metode abstrak secara default.
Usman Rana
1

Anda bisa, pertanyaan dalam pikiran saya adalah lebih banyak tentang Anda. Sejak awal, saya akan mengatakan bahwa tidak ada jawaban yang tegas dan cepat. Lakukan hal yang benar untuk situasi Anda saat ini.

Bagi saya warisan menyiratkan hubungan 'is-a'. Bayangkan sebuah kelas anjing, yang dapat diperluas dengan sub jenis yang lebih terspesialisasi (Alsatian, Pudel, dll). Dalam hal ini membuat abstrak kelas anjing mungkin adalah hal yang benar untuk dilakukan karena sub-tipe adalah anjing. Sekarang mari kita bayangkan anjing membutuhkan kalung. Dalam hal ini, warisan tidak masuk akal: tidak masuk akal untuk memiliki hubungan 'is-a' antara anjing dan kerah. Ini jelas merupakan hubungan 'has-a', collar adalah objek yang berkolaborasi. Membuat kerah abstrak hanya agar anjing dapat memilikinya tidak masuk akal.

Saya sering menemukan bahwa kelas abstrak tanpa metode abstrak benar-benar mengekspresikan hubungan 'has-a'. Dalam kasus ini saya biasanya menemukan bahwa kode dapat difaktorkan dengan lebih baik tanpa menggunakan pewarisan. Saya juga menemukan bahwa kelas abstrak tanpa metode abstrak sering kali merupakan bau kode dan setidaknya harus mengarah pada pertanyaan yang diajukan dalam tinjauan kode.

Sekali lagi, ini sepenuhnya subjektif. Mungkin ada situasi ketika kelas abstrak tanpa metode abstrak masuk akal, itu sepenuhnya tergantung pada interpretasi dan pembenaran. Buat keputusan terbaik untuk apa pun yang Anda kerjakan.

Jeremy
sumber
1

Sebenarnya tidak ada artinya jika kelas abstrak tidak memiliki metode abstrak. Kelas abstrak seperti seorang ayah. Ayah ini memiliki beberapa sifat dan perilaku, ketika Anda sebagai seorang anak ingin menjadi anak dari ayah, ayah mengatakan anak itu (Anda) harus begini, itu MOTO kami, dan jika Anda tidak mau, Anda bukan anak saya.

Mohammad Davari
sumber