JavaRush /Blog Jawa /Random-JV /Bedane antarane kelas abstrak lan antarmuka

Bedane antarane kelas abstrak lan antarmuka

Diterbitake ing grup
Hello! Ing kuliah iki kita bakal pirembagan bab carane kelas abstrak beda saka antarmuka lan katon ing conto karo kelas abstrak umum. Bedane antarane kelas abstrak lan antarmuka - 1Kita nyedhiyakake kuliah sing kapisah kanggo beda antarane kelas abstrak lan antarmuka, amarga topik kasebut penting banget. Sampeyan bakal ditakoni babagan bedane konsep kasebut ing 90% wawancara ing mangsa ngarep. Mulane, manawa sampeyan ngerti apa sing diwaca, lan yen sampeyan ora ngerti kanthi lengkap, maca sumber tambahan. Dadi, kita ngerti apa kelas abstrak lan apa antarmuka. Saiki ayo padha ndeleng bedane.
  1. Antarmuka mung nggambarake prilaku. Dheweke ora duwe rejeki. Nanging kelas abstrak nduweni negara: nggambarake loro-lorone.

    Ayo njupuk kelas abstrak Birdlan antarmuka minangka conto Flyable:

    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 saka Bird:

    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) lan age(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.

  2. 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 Birddibutuhake kanggo nggawe manuk adhedhasar. Mung manuk lan ora ana wong liya! Mesthine bakal beda.

    Bedane antarane kelas abstrak lan antarmuka - 2

    Kanthi antarmuka Flyablekabeh beda. Iku mung nggambarake prilaku sing cocog karo jenenge - "mabur". Definisi "mabur", "bisa mabur" kalebu akeh obyek sing ora ana hubungane karo siji liyane.

    Bedane antarane kelas abstrak lan antarmuka - 3

    4 entitas iki ora ana hubungane karo siji liyane. Apa sing bisa dakkandhakake, ora kabeh mau malah animasi. Nanging, kabeh padha Flyablebisa 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.

  3. 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 ndeleng InputStreamlan 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 InputStreamiku 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)skips byteCount, bait saka input, bali nomer bita digatèkaké.
Aku menehi saran supaya sampeyan sinau dhaptar lengkap metode . Ana luwih saka rolas kelas penerus. Ing ngisor iki sawetara conto:
  1. FileInputStream: jinis sing paling umum InputStream. Digunakake kanggo maca informasi saka file;
  2. StringBufferInputStream: jinis liyane migunani InputStream. Iku dadi senar menyang stream data input InputStream;
  3. BufferedInputStream: stream input buffered. Paling asring digunakake kanggo nambah efisiensi.
Apa sampeyan elinga nalika kita mlaku BufferedReaderlan ujar manawa kita ora kudu nggunakake? Nalika kita nulis:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
... BufferedReaderora perlu nggunakake: InputStreamReaderiku bakal nindakake proyek. Nanging BufferedReaderluwih efisien lan, luwih-luwih, bisa maca data ing kabeh baris, tinimbang karakter individu. Kabeh BufferedInputStreampadha! 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 - FileInputStreamlan BufferedInputStreamminangka "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 OutputStreamabstrak 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.
Ing ngisor iki sawetara turunane kelas OutputStream:
  1. 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.

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

  3. BufferedOutputStream. Buffered stream output. Ora ana sing rumit, intine padha karo ing BufferedInputStream(utawa BufferedReader'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.

Sampeyan uga bisa maca babagan ahli waris ing materi " Sistem InputStreamInput / 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 :) OutputStreamFileInputStreamFileOutputStreamBufferedInputStream
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION