-
Antarmuka mung nggambarake prilaku. Dheweke ora duwe rejeki. Nanging kelas abstrak nduweni negara: nggambarake loro-lorone.
Ayo njupuk kelas abstrak
Bird
lan antarmuka minangka contoFlyable
: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 kelas manuk
Mockingjay
(mockingjay) lan warisan sakaBird
:public class Mockingjay extends Bird { @Override public void fly() { System.out.println("Fly, birdie!"); } 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 kahanan kelas abstrak - variabel
species
(jinis) lanage
(umur).Nanging yen kita nyoba kanggo nindakake padha karo antarmuka, gambar bakal beda. Kita bisa nyoba nambah variabel kasebut:
public interface Flyable { String species = new String(); int age = 10; public void fly(); } public interface Flyable { private String species = new String(); // error private int age = 10; // also an error public void fly(); }
Kita malah ora bakal bisa nggawe variabel pribadi ing antarmuka. Kenging punapa? Amarga modifier pribadi digawe kanggo ndhelikake implementasine saka pangguna. Nanging ora ana implementasine ing antarmuka: ora ana sing bisa didhelikake.
Antarmuka mung nggambarake prilaku. Patut, kita ora bakal bisa kanggo ngleksanakake getter lan setter nang antarmuka. Sing sifat antarmuka: iku temenan kanggo menehi hasil karo prilaku, ora negara.
Java8 ngenalake metode antarmuka standar sing duwe implementasine. Sampeyan wis ngerti babagan iki, mula kita ora bakal mbaleni maneh.
-
Kelas abstrak ngubungake lan nggabungake kelas sing nduweni hubungan sing raket banget. Ing wektu sing padha, antarmuka sing padha bisa dileksanakake dening kelas sing ora ana sing padha.
Ayo bali menyang conto karo manuk.
Kelas abstrak kita
Bird
dibutuhake kanggo nggawe manuk adhedhasar. Mung manuk lan ora ana wong liya! Mesthine bakal beda.Kanthi antarmuka
Flyable
kabeh beda. Iku mung nggambarake prilaku sing cocog karo jenenge - "mabur". Definisi "mabur", "bisa mabur" kalebu akeh obyek sing ora ana hubungane karo siji liyane.4 entitas iki ora ana hubungane karo siji liyane. Apa sing bisa dakkandhakake, ora kabeh mau malah animasi. Nanging, kabeh padha
Flyable
bisa mabur.Kita ora bakal bisa njlèntrèhaké mau nggunakake kelas abstrak. Dheweke ora duwe negara umum utawa lapangan sing padha. Kanggo menehi ciri pesawat, kita bakal mbutuhake lapangan "model", "taun pabrik" lan "jumlah penumpang maksimal". Kanggo Carlson, ana lapangan kanggo kabeh permen sing dipangan dina iki, lan dhaptar game sing bakal diputer karo Kid. Kanggo nyamuk ... uh-uh ... kita malah ora ngerti ... Mungkin "tingkat gangguan"? :)
Ingkang utama yaiku kita ora bisa njlèntrèhaké kanthi nggunakake kelas abstrak. Padha banget beda. Nanging ana prilaku umum: padha bisa mabur. Antarmuka becik kanggo njlèntrèhaké kabeh ing donya sing bisa mabur, nglangi, mlumpat, utawa duwe prilaku liyane.
-
Kelas bisa ngleksanakake akeh antarmuka sing dikarepake, nanging mung bisa diwenehi warisan saka siji kelas.
Kita wis ngomong babagan iki luwih saka sepisan. Ora ana pirang-pirang warisan ing Jawa, nanging ana sawetara implementasine. Titik iki sebagéyan nderek saka sadurunge: antarmuka nyambungake akeh kelas beda sing asring ora ana ing umum, lan kelas abstrak digawe kanggo klompok kelas sing banget cedhak saben liyane. Mulane, iku logis sing bisa oleh warisan saka mung siji kelas kuwi. Kelas abstrak nggambarake hubungan "iku".
Antarmuka InputStream & OutputStream Standar
Kita wis ngliwati macem-macem kelas sing tanggung jawab kanggo streaming input lan output. Ayo ndelengInputStream
lan OutputStream
. Umumé, iki dudu antarmuka, nanging kelas abstrak nyata. Saiki sampeyan ngerti apa iku, supaya bisa karo wong-wong mau bakal luwih gampang :) InputStream
- iki kelas abstrak sing tanggung jawab kanggo input byte. Jawa nduweni rerangkening kelas kang diwarisake saka InputStream
. Saben wong wis diatur kanggo nampa data saka macem-macem sumber. Amarga InputStream
iku wong tuwa, menehi sawetara cara kanggo gampang nggarap aliran data. Saben bocah duwe cara iki InputStream
:
int available()
ngasilake jumlah bita sing kasedhiya kanggo maca;close()
nutup sumber input;int read()
ngasilake perwakilan integer saka byte kasedhiya sabanjuré ing stream. Yen pungkasan stream wis tekan, nomer -1 bakal bali;int read(byte[] buffer)
nyoba maca bita menyang buffer, ngasilake jumlah bita sing diwaca. Nalika tekan mburi file, bali -1;int read(byte[] buffer, int byteOffset, int byteCount)
maca bagean saka blok byte. Digunakake nalika ana kemungkinan pemblokiran data ora rampung diisi. Nalika tekan mburi file, ngasilake -1;long skip(long byteCount)
skipsbyteCount
, bait saka input, bali nomer bita digatèkaké.
FileInputStream
: jinis sing paling umumInputStream
. Digunakake kanggo maca informasi saka file;StringBufferInputStream
: jinis liyane migunaniInputStream
. Iku dadi senar menyang stream data inputInputStream
;BufferedInputStream
: stream input buffered. Paling asring digunakake kanggo nambah efisiensi.
BufferedReader
lan ujar manawa kita ora kudu nggunakake? Nalika kita nulis:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
... BufferedReader
ora perlu nggunakake: InputStreamReader
iku bakal nindakake proyek. Nanging BufferedReader
luwih efisien lan, luwih-luwih, bisa maca data ing kabeh baris, tinimbang karakter individu. Kabeh BufferedInputStream
padha! Kelas accumulates data input ing buffer khusus tanpa terus-terusan ngakses piranti input. Ayo ndeleng 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 was read" + c);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
inputStream.close();
buffer.close();
}
}
}
Ing conto iki, kita maca data saka file sing dumunung ing komputer ing alamat "D:/Users/UserName/someFile.txt" . Kita nggawe 2 obyek - FileInputStream
lan BufferedInputStream
minangka "pambungkus". Sawise iku, kita maca bita saka file lan ngowahi dadi karakter. Lan sateruse nganti file rampung. Nalika sampeyan bisa ndeleng, ora ana sing rumit ing kene. Sampeyan bisa nyalin kode iki lan mbukak ing sawetara file nyata sing disimpen ing komputer :) A kelas kelas OutputStream
abstrak sing nemtokake output stream byte. Kaya sing wis dingerteni, iki minangka antipode saka InputStream
'a. Iku tanggung jawab ora kanggo ngendi kanggo maca data saka, nanging kanggo ngendi kanggo ngirim . Kaya InputStream
, kelas abstrak iki nyedhiyakake kabeh turunan kanthi klompok metode kanggo karya sing trep:
int 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 Uploaded byte menyang stream output;void write (byte[] buffer, int offset, int count)
nyerat sawetara bita count saka Uploaded, miwiti ing posisi offset.
OutputStream
:
-
DataOutputStream
. A stream output sing kalebu cara kanggo nulis jinis data Jawa standar.Kelas sing prasaja banget kanggo nulis jinis lan senar Jawa primitif. Mesthi sampeyan bakal ngerti kode sing ditulis 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); } }
Nduwe cara sing kapisah kanggo saben jinis -
writeDouble()
,writeLong()
,writeShort()
lan liya-liyane. -
kelas
FileOutputStream
. Nindakake mekanisme kanggo ngirim data menyang file ing disk. Miturut cara, kita wis digunakake ing conto sadurunge, sampeyan weruh? We liwati nang DataOutputStream, kang tumindak minangka "wrapper". -
BufferedOutputStream
. Buffered stream output. Ora ana sing rumit, intine padha karo ingBufferedInputStream
(utawaBufferedReader
'a). Tinimbang ngrekam data urutan biasanipun, ngrekam liwat khusus "panyimpenan" buffer digunakake. Kanthi nggunakake buffer, sampeyan bisa nyuda jumlah lelungan babak menyang tujuan data lan kanthi mangkono nambah efisiensi.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 will convert this string into an array of bytes and write it to a file byte[] buffer = text.getBytes(); bufferedStream.write(buffer, 0, buffer.length); bufferedStream.close(); } }
Maneh, sampeyan bisa "muter" karo kode iki dhewe lan mriksa carane bakal bisa ing file nyata ing komputer.
InputStream
Input / Output ". Oh , lan kita uga bakal duwe kuliah sing kapisah, supaya cukup informasi babagan dheweke kanggo kenalan pisanan. Iku kabeh! Muga-muga sampeyan duwe pangerten sing apik babagan beda antarane antarmuka lan kelas abstrak lan siap mangsuli pitakon apa wae, sanajan sing angel :) OutputStream
FileInputStream
FileOutputStream
BufferedInputStream
GO TO FULL VERSION