-
Antarmuka mung nggambarake prilaku. Ora ana negara. Nanging kelas abstrak kalebu negara: nggambarake loro.
Contone, njupuk
Bird
kelas abstrak lanCanFly
antarmuka:public abstract class Bird { private String species; private int age; public abstract void fly(); public String getSpecies() { return species; } public void setSpecies(String species) { this.species = species; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Ayo nggawe
MockingJay
kelas manuk lan dadi warisanBird
:public class MockingJay extends Bird { @Override public void fly() { System.out.println("Fly, bird!"); } public static void main(String[] args) { MockingJay someBird = new MockingJay(); someBird.setAge(19); System.out.println(someBird.getAge()); } }
Kaya sing sampeyan ngerteni, kita bisa kanthi gampang ngakses status kelas abstrak - sawijining
species
lanage
variabel.Nanging yen kita nyoba nindakake perkara sing padha karo antarmuka, gambar kasebut beda. Kita bisa nyoba nambah variabel kasebut:
public interface CanFly { String species = new String(); int age = 10; public void fly(); } public interface CanFly { private String species = new String(); // Error private int age = 10; // Another error public void fly(); }
Kita malah ora bisa ngumumake variabel pribadi ing antarmuka. Kenging punapa? Amarga modifier pribadi digawe kanggo ndhelikake implementasine saka pangguna. Lan antarmuka ora ana implementasine ing njero: ora ana sing didhelikake.
Antarmuka mung nggambarake prilaku. Dadi, kita ora bisa ngetrapake getter lan setter ing antarmuka. Iki minangka sifat antarmuka: dibutuhake kanggo nggarap prilaku, dudu negara.
Java 8 ngenalaken cara standar kanggo antarmuka sing duwe implementasine. Sampeyan wis ngerti babagan iki, mula kita ora bakal mbaleni maneh.
-
Kelas abstrak nyambungake lan nggabungake kelas sing raket banget. Ing wektu sing padha, antarmuka siji bisa dileksanakake dening kelas sing pancen ora ana sing padha.
Ayo bali menyang conto karo manuk.
Kelas abstrak kita
Bird
dibutuhake kanggo nggawe manuk sing adhedhasar kelas kasebut. Mung manuk lan ora liya! Mesthi, bakal ana macem-macem jinis manuk.Kanthi
CanFly
antarmuka, saben wong bisa mlaku kanthi cara dhewe. Iku mung nggambarake prilaku (mabur) sing digandhengake karo jenenge. Akeh perkara sing ora ana gandhengane 'bisa mabur'.4 entitas iki ora ana hubungane karo siji liyane. Dheweke ora kabeh urip. Nanging, kabeh mau
CanFly
.Kita ora bisa nerangake kanthi nggunakake kelas abstrak. Dheweke ora nuduhake negara utawa lapangan sing padha. Kanggo nemtokake pesawat, kita bisa uga mbutuhake lapangan kanggo model, taun produksi, lan jumlah penumpang maksimal. Kanggo Carlson, kita butuh lapangan kanggo kabeh permen sing dipangan dina iki, lan dhaptar game sing bakal dimainake karo adhine. Kanggo nyamuk, ...eh... Aku malah ora ngerti ... Mungkin, 'tingkat gangguan'? :)
Intine kita ora bisa nggunakake kelas abstrak kanggo njlèntrèhaké. Padha banget beda. Nanging padha duwe prilaku sing padha: bisa mabur. Antarmuka iku sampurna kanggo njlèntrèhaké kabeh ing donya sing bisa mabur, nglangi, mlumpat, utawa nuduhake sawetara prilaku liyane.
-
Kelas bisa ngleksanakake akeh antarmuka sing dikarepake, nanging mung bisa oleh warisan siji kelas.
Kita wis kasebut luwih saka sepisan. Jawa ora duwe sawetara warisan kelas, nanging ndhukung macem-macem warisan antarmuka. Titik iki nderek sebagéyan saka siji sadurungé: antarmuka nyambungake akeh kelas beda sing asring ora ana liyane ing umum, nalika kelas abstrak digawe kanggo klompok kelas raket banget. Mulane, iku ndadekake pangertèn sing mung bisa oleh warisan siji kelas kuwi. Kelas abstrak nggambarake hubungan 'is-a'.
Antarmuka standar: InputStream lan OutputStream
Kita wis ngliwati macem-macem kelas sing tanggung jawab kanggo aliran input lan output. Ayo nimbangInputStream
lan OutputStream
. Umumé, iki dudu antarmuka, nanging kelas abstrak sing asli. Saiki sampeyan ngerti apa tegese, supaya bakal luwih gampang kanggo bisa karo wong-wong mau :) InputStream
iku kelas abstrak tanggung jawab kanggo input bait. Jawa nduweni pirang-pirang golongan kang diwarisake InputStream
. Saben wong dirancang kanggo nampa data saka macem-macem sumber. Amarga InputStream
iku wong tuwa, menehi sawetara cara sing gampang kanggo nggarap aliran data. Saben keturunan InputStream
duwe cara iki:
int available()
ngasilake jumlah bita sing kasedhiya kanggo maca;close()
nutup aliran input;int read()
ngasilake perwakilan integer saka byte kasedhiya sabanjuré ing stream. Yen mburi stream wis tekan, -1 bakal bali;int read(byte[] buffer)
nyoba maca bita menyang buffer, lan ngasilake jumlah bita sing diwaca. Nalika tekan mburi file, bali -1;int read(byte[] buffer, int byteOffset, int byteCount)
nyerat bagean saka blok byte. Iki digunakake nalika array byte bisa uga ora diisi kabeh. Nalika tekan mburi file, bali -1;long skip(long byteCount)
skips byteCount byte ing stream input, lan ngasilake jumlah bita digatèkaké.
FileInputStream
: jinis sing paling umumInputStream
. Iki digunakake kanggo maca informasi saka file;StringBufferInputStream
: Jinis liyane mbiyantuInputStream
. Ngonversi string menyangInputStream
;BufferedInputStream
: A stream input buffered. Paling asring digunakake kanggo nambah kinerja.
BufferedReader
lan ngandika sing ora kudu nggunakake? Nalika kita nulis:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
…sampeyan ora kudu nggunakake BufferedReader
: An InputStreamReader
bisa nindakake pakaryan. Nanging BufferedReader
nambah kinerja lan uga bisa maca kabeh baris data tinimbang karakter individu. Bab sing padha ditrapake kanggo BufferedInputStream
! Kelas accumulates data input ing buffer khusus tanpa terus-terusan ngakses piranti input. Ayo nimbang conto:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
public class BufferedInputExample {
public static void main(String[] args) throws Exception {
InputStream inputStream = null;
BufferedInputStream buffer = null;
try {
inputStream = new FileInputStream("D:/Users/UserName/someFile.txt");
buffer = new BufferedInputStream(inputStream);
while(buffer.available()>0) {
char c = (char)buffer.read();
System.out.println("Character read: " + c);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
inputStream.close();
buffer.close();
}
}
}
Ing conto iki, kita maca data saka file sing ana ing komputer ing ' D:/Users/UserName/someFile.txt '. Kita nggawe 2 obyek - a FileInputStream
lan a BufferedInputStream
sing 'bungkus'. Banjur kita maca bita saka file lan ngowahi dadi karakter. Lan kita nindakake nganti file rampung. Kaya sing sampeyan ngerteni, ora ana sing rumit ing kene. Sampeyan bisa nyalin kode iki lan mbukak ing file nyata ing komputer :) Kelas OutputStream
punika kelas abstrak sing nggantosi stream output saka bita. Minangka sampeyan wis ngerti, iki minangka kebalikan saka InputStream
. Ora tanggung jawab kanggo maca data saka ngendi wae, nanging ngirim data ing endi wae . Kaya InputStream
, kelas abstrak iki menehi kabeh turunane cara sing trep:
void close()
nutup aliran output;void flush()
mbusak kabeh buffer output;abstract void write(int oneByte)
nyerat 1 bait menyang stream output;void write(byte[] buffer)
nyerat array byte menyang stream output;void write(byte[] buffer, int offset, int count)
nyerat sawetara bita count saka Uploaded, miwiti ing posisi nutup kerugian.
OutputStream
:
-
DataOutputStream
. A stream output sing kalebu cara kanggo nulis jinis data Jawa standar.Kelas banget prasaja kanggo nulis jinis data Jawa primitif lan strings. Sampeyan mbokmenawa bakal ngerti kode ing ngisor iki sanajan tanpa panjelasan:
import java.io.*; public class DataOutputStreamExample { public static void main(String[] args) throws IOException { DataOutputStream dos = new DataOutputStream(new FileOutputStream("testFile.txt")); dos.writeUTF("SomeString"); dos.writeInt(22); dos.writeDouble(1.21323); dos.writeBoolean(true); } }
Wis cara kapisah kanggo saben jinis —
writeDouble()
,writeLong()
,writeShort()
, lan ing. FileOutputStream
. Kelas iki ngetrapake mekanisme kanggo ngirim data menyang file ing disk. Miturut cara, kita wis digunakake ing conto pungkasan. Apa sampeyan ngeweruhi? We ngirim menyang DataOutputStream, kang tumindak minangka 'wrapper'.BufferedOutputStream
. A stream output buffered. Ora ana sing rumit ing kene. Tujuane padha karoBufferedInputStream
(utawaBufferedReader
). Tinimbang maca urut-urutan data biasa, nulis data nggunakake buffer 'kumulatif' khusus. Buffer ndadekake iku bisa kanggo nyuda nomer kaping sink data diakses, mangkono nambah kinerja.import java.io.*; public class DataOutputStreamExample { public static void main(String[] args) throws IOException { FileOutputStream outputStream = new FileOutputStream("D:/Users/Username/someFile.txt"); BufferedOutputStream bufferedStream = new BufferedOutputStream(outputStream); String text = "I love Java!"; // We'll convert this string to a byte array and write it to a file byte[] buffer = text.getBytes(); bufferedStream.write(buffer, 0, buffer.length); } }
Maneh, sampeyan bisa muter-muter nganggo kode iki lan verifikasi manawa bakal bisa digunakake ing file nyata ing komputer sampeyan.
FileInputStream
, FileOutputStream
lan BuffreredInputStream
, supaya iki cukup informasi kanggo kenalan pisanan. Mekaten! Muga-muga sampeyan ngerti bedane antar muka lan kelas abstrak lan siap mangsuli pitakon apa wae, sanajan pitakonan trick :)