KodeGym/Blog Jawa/Acak/Bentenipun antarane kelas abstrak lan antarmuka
John Squirrels
tingkat
San Francisco

Bentenipun antarane kelas abstrak lan antarmuka

Diterbitake ing grup
Hi! Ing wulangan iki, kita bakal ngomong babagan carane kelas abstrak beda karo antarmuka lan nimbang sawetara conto karo kelas abstrak umum. Bentenipun antarane kelas abstrak lan antarmuka - 1Kita wis nyedhiyakake pelajaran sing kapisah kanggo beda antarane kelas abstrak lan antarmuka, amarga topik iki penting banget. Sampeyan bakal ditakoni babagan bedane konsep kasebut ing 90% wawancara ing mangsa ngarep. Tegese sampeyan kudu ngerti apa sing diwaca. Lan yen sampeyan ora ngerti kanthi lengkap, maca sumber tambahan. Dadi, kita ngerti apa kelas abstrak lan apa antarmuka. Saiki kita bakal ngrembug bedane.
  1. Antarmuka mung nggambarake prilaku. Ora ana negara. Nanging kelas abstrak kalebu negara: nggambarake loro.

    Contone, njupuk Birdkelas abstrak lan CanFlyantarmuka:

    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 MockingJaykelas manuk lan dadi warisan Bird:

    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 specieslan agevariabel.

    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.

  2. 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 Birddibutuhake kanggo nggawe manuk sing adhedhasar kelas kasebut. Mung manuk lan ora liya! Mesthi, bakal ana macem-macem jinis manuk.

    Bentenipun antarane kelas abstrak lan antarmuka - 2

    Kanthi CanFlyantarmuka, saben wong bisa mlaku kanthi cara dhewe. Iku mung nggambarake prilaku (mabur) sing digandhengake karo jenenge. Akeh perkara sing ora ana gandhengane 'bisa mabur'.

    Bentenipun antarane kelas abstrak lan antarmuka - 3

    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.

  3. 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 nimbang InputStreamlan 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 :) InputStreamiku 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 InputStreamiku wong tuwa, menehi sawetara cara sing gampang kanggo nggarap aliran data. Saben keturunan InputStreamduwe 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é.
Aku nyaranake sampeyan sinau dhaptar lengkap metode . Ana luwih saka sepuluh kelas anak. Contone, ing ngisor iki sawetara:
  1. FileInputStream: jinis sing paling umum InputStream. Iki digunakake kanggo maca informasi saka file;
  2. StringBufferInputStream: Jinis liyane mbiyantu InputStream. Ngonversi string menyang InputStream;
  3. BufferedInputStream: A stream input buffered. Paling asring digunakake kanggo nambah kinerja.
Elinga nalika kita tindak liwat BufferedReaderlan ngandika sing ora kudu nggunakake? Nalika kita nulis:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
…sampeyan ora kudu nggunakake BufferedReader: An InputStreamReaderbisa nindakake pakaryan. Nanging BufferedReadernambah 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 FileInputStreamlan a BufferedInputStreamsing '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 OutputStreampunika 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.
Ing ngisor iki sawetara turunane kelas OutputStream:
  1. 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.


  2. 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'.

  3. BufferedOutputStream. A stream output buffered. Ora ana sing rumit ing kene. Tujuane padha karo BufferedInputStream(utawa BufferedReader). 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.

Kita bakal duwe pawulangan kapisah babagan FileInputStream, FileOutputStreamlan 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 :)
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar