JavaRush /Блоги Java /Random-TG /Фарқи байни синфҳои абстрактӣ ва интерфейсҳо

Фарқи байни синфҳои абстрактӣ ва интерфейсҳо

Дар гурӯҳ нашр шудааст
Салом! Дар ин лексия мо дар бораи он ки чӣ тавр синфҳои абстрактӣ аз интерфейсҳо фарқ мекунанд ва мисолҳоро бо синфҳои абстрактии умумӣ дида мебароем. Фарқи байни синфҳои абстрактӣ ва интерфейсҳо - 1Мо як лексияи алоҳидаро ба фарқиятҳои байни синфи абстрактӣ ва интерфейс бахшидем, зеро мавзӯъ хеле муҳим аст. Дар 90% мусоҳибаҳои оянда аз шумо дар бораи фарқияти ин мафҳумҳо мепурсанд. Аз ин рӯ, ҳатман чизи хондаатонро фаҳмед ва агар чизеро пурра нафаҳмед, манобеъи иловагиро хонед. Ҳамин тавр, мо медонем, ки синфи абстрактӣ чист ва интерфейс чист. Акнун биёед фарқиятҳои онҳоро дида бароем.
  1. Интерфейс танҳо рафторро тавсиф мекунад. Ӯ бахт надорад. Аммо синфи абстрактӣ ҳолат дорад: он ҳардуро тавсиф мекунад.

    Биёед як синф Birdва интерфейси абстрактиро ҳамчун мисол гирем 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;
       }
    }

    Биёед синфи паррандаро Mockingjay(mockingjay) созем ва аз: мерос гирем 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());
       }
    }

    Тавре ки шумо мебинед, мо метавонем ба осонӣ ба ҳолати синфи абстрактӣ дастрасӣ пайдо кунем - тағирёбандаҳои он species(навъ) ва age(синну сол).

    Аммо агар мо кӯшиш кунем, ки бо интерфейс низ ҳамин тавр кунем, тасвир дигар мешавад. Мо метавонем кӯшиш кунем, ки ба он тағирёбандаҳоро илова кунем:

    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();
    }

    Мо ҳатто наметавонем тағирёбандаҳои хусусиро дар дохor интерфейс эҷод кунем. Чаро? Азбаски тағирдиҳандаи хусусӣ барои пинҳон кардани татбиқ аз корбар офарида шудааст. Аммо дар дохor интерфейс ягон амалисозӣ вуҷуд надорад: дар он ҷо ҳеҷ чизи пинҳон кардан нест.

    Интерфейс танҳо рафторро тавсиф мекунад. Аз ин рӯ, мо наметавонем дар дохor интерфейс гетерҳо ва сеттерҳоро амалӣ созем. Ин хусусияти интерфейс аст: он барои мубориза бо рафтор пешбинӣ шудааст, на ҳолат.

    Java8 усулҳои интерфейси пешфарзро ҷорӣ кард, ки амалӣ доранд. Шумо аллакай дар бораи онҳо медонед, бинобар ин мо онҳоро такрор намекунем.

  2. Синфи абстрактӣ синфҳоро мепайвандад ва муттаҳид мекунад, ки муносибати хеле наздик доранд. Дар айни замон, ҳамон интерфейсро синфҳое амалӣ кардан мумкин аст, ки умуман умумӣ надоранд.

    Биёед ба мисоли худ бо паррандагон баргардем.

    Синфи абстрактии мо Birdбарои офаридани паррандагон дар асоси он зарур аст. Танҳо паррандагон ва ҳеҷ каси дигар! Албатта, онҳо гуногун хоҳанд буд.

    Фарқи байни синфҳои абстрактӣ ва интерфейсҳо - 2

    Бо интерфейс Flyableҳама чиз гуногун аст. Он танҳо рафтореро, ки ба номи он мувофиқ аст - "парвоз" тавсиф мекунад. Мафхуми «парвоз», «кобorяти парвоз» бисьёр an objectхоеро дарбар мегирад, ки ба хамдигар алоцаманд нестанд.

    Фарқи байни синфҳои абстрактӣ ва интерфейсҳо - 3

    Ин 4 субъект ба ҳеҷ ваҷҳ бо ҳамдигар алоқаманд нестанд. Чӣ гуфтан мумкин аст, ки на ҳамаашон ҳатто зиндаанд. Бо вуҷуди ин, ҳамаи онҳо Flyableқобorяти парвоз доранд.

    Мо онҳоро бо истифода аз синфи абстрактӣ тавсиф карда наметавонем. Онҳо давлати умумӣ ё майдонҳои якхела надоранд. Барои тавсифи ҳавопаймо ба мо шояд майдонҳои “модел”, “соли истеҳсол” ва “шумораи ҳадди аксар мусофирон” лозим шавад. Барои Карлсон майдонҳо барои ҳама шириниҳои имрӯза хӯрда ва рӯйхати бозиҳое мавҷуданд, ки ӯ бо кӯдак бозӣ хоҳад кард. Барои магас... у-ух... мо ҳатто намедонем... Шояд "сатҳи озорӣ"? :)

    Муҳим он аст, ки мо онҳоро бо истифода аз синфи абстрактӣ тавсиф карда наметавонем. Онҳо хеле гуногунанд. Аммо як рафтори умумӣ вуҷуд дорад: онҳо метавонанд парвоз кунанд. Интерфейс барои тавсифи ҳама чизҳое дар ҷаҳон, ки метавонанд парвоз кунанд, шино кунанд, ҷаҳидан ё ягон рафтори дигар дошта бошанд, беҳтарин аст.

  3. Синфҳо метавонанд ҳар қадар интерфейсҳоро иҷро кунанд, аммо онҳо танҳо аз як синф мерос гирифта метавонанд.

    Мо дар ин бора на як бору ду бор сухан ронда будем. Дар Java мероси сершумор вуҷуд надорад, аммо татбиқи сершумор вуҷуд дорад. Ин нукта қисман аз нуқтаи пешина бармеояд: интерфейс бисёр синфҳои гуногунро мепайвандад, ки аксар вақт ягон чизи умумӣ надоранд ва барои як гурӯҳи синфҳо, ки ба ҳамдигар хеле наздиканд, синфи абстрактӣ сохта мешавад. Аз ин рӯ, мантиқист, ки шумо метавонед танҳо аз як чунин синф мерос гиред. Синфи абстрактӣ муносибати "аст" -ро тавсиф мекунад.

Интерфейсҳои стандартии InputStream & OutputStream

Мо аллакай аз синфҳои гуногун гузаштаем, ки барои воридот ва баромади ҷараён масъуланд. Биёед InputStreamва OutputStream. Умуман, инҳо интерфейсҳо нестанд, балки синфҳои воқеии абстрактӣ мебошанд. Акнун шумо медонед, ки онҳо чӣ гунаанд, бинобар ин кор бо онҳо хеле осонтар хоҳад шуд :) InputStream- ин синфи абстрактӣ аст, ки барои вуруди byte масъул аст. Java як қатор синфҳо дорад, ки аз InputStream. Ҳар яки онҳо барои гирифтани маълумот аз манбаъҳои гуногун танзим карда шудаанд. Азбаски InputStreamон волидайн аст, он якчанд усулҳоро барои ба осонӣ кор кардан бо ҷараёнҳои додаҳо таъмин мекунад. Ҳар як кӯдак чунин усулҳоро дорад InputStream:
  • int available()шумораи byteҳои барои хондан дастрасро бармегардонад;
  • close()манбаи вурудро мебандад;
  • int read()намоиши бутуни byteи навбатии дастрасро дар ҷараён бармегардонад. Агар ба охири ҷараён расида бошад, рақами -1 баргардонида мешавад;
  • int read(byte[] buffer)кӯшиш мекунад, ки byteҳоро ба буфер хонад ва шумораи byteҳои хондашударо баргардонад. Вақте ки он ба охири файл мерасад, он бар мегардонад -1;
  • int read(byte[] buffer, int byteOffset, int byteCount)як қисми блоки byteҳоро мехонад. Вақте ки эҳтимолияти пурра пур нашудани блоки маълумот истифода мешавад. Вақте ки он ба охири файл мерасад, -1 бар мегардонад;
  • long skip(long byteCount)гузариш byteCount, як byte вуруд, баргардонидани шумораи byteҳои нодида гирифташуда.
Ман ба шумо маслиҳат медиҳам, ки рӯйхати пурраи усулҳоро омӯзед . Дар асл зиёда аз даҳ синфҳои вориси вуҷуд доранд. Инҳоянд чанд мисол:
  1. FileInputStream: намуди маъмултарин InputStream. Барои хондани маълумот аз файл истифода мешавад;
  2. StringBufferInputStream: намуди дигари муфид InputStream. Он сатрро ба ҷараёни додаҳои воридотӣ табдил медиҳад InputStream;
  3. BufferedInputStream: ҷараёни вуруди буферӣ. Он аксар вақт барои баланд бардоштани самаранокӣ истифода мешавад.
Оё шумо дар хотир доред, вақте ки мо аз он ҷо мегузаштам BufferedReaderва гуфта будем, ки мо набояд онро истифода барем? Вақте ки мо менависем:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
... BufferedReaderба истифода додан лозим нест: InputStreamReaderвай кор мекунад. Аммо BufferedReaderон ин корро самараноктар мекунад ва илова бар ин, метавонад маълумотро дар тамоми сатрҳо хонад, на аломатҳои алоҳида. Ҳама чиз BufferedInputStreamҳамон аст! Синф маълумоти воридшударо дар буфери махсус бидуни дастрасии доимӣ ба дастгоҳи воридотӣ ҷамъ мекунад. Биёед як мисолро дида бароем:
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();
       }
   }
}
Дар ин мисол, мо маълумотро аз файле мехонем, ки дар компютер бо суроғаи "D:/Users/UserName/someFile.txt" ҷойгир аст . Мо 2 an objectро эҷод мекунем - FileInputStreamва BufferedInputStreamҳамчун "печанда". Баъд аз ин, мо byteҳоро аз файл мехонем ва онҳоро ба аломатҳо табдил медиҳем. Ва ғайра то ба охир расидани файл. Тавре ки шумо мебинед, дар ин ҷо ҳеҷ чизи мураккаб нест. Шумо метавонед ин codeро нусхабардорӣ кунед ва онро дар ягон файли воқеӣ, ки дар компютери шумо нигоҳ дошта мешавад, иҷро кунед :) Синф синфи OutputStreamабстрактист, ки баромади ҷараёни byteро муайян мекунад. Тавре ки шумо аллакай фаҳмидед, ин антиподи InputStream"а" аст. Он на барои аз куҷо хондани маълумот, балки барои ба куҷо фиристодани он масъул аст . Мисли InputStream, ин синфи абстрактӣ ба ҳамаи наслҳо як гурӯҳи усулҳо барои кори қулай медиҳад:
  • int close()ҷараёни баромадро мебандад;
  • void flush()тамоми буферҳои баромадро тоза мекунад;
  • abstract void write (int oneByte)ба ҷараёни баромад 1 byte менависад;
  • void write (byte[] buffer)массиви byteро ба ҷараёни баромад менависад;
  • void write (byte[] buffer, int offset, int count)як қатор byteҳои ҳисобро аз массив, аз ҷуброни мавқеъ сар карда менависад.
Инҳоянд баъзе аз наслҳои синф OutputStream:
  1. DataOutputStream. Ҷараёни баромад, ки усулҳои навиштани намудҳои стандартии маълумоти Java-ро дар бар мегирад.

    Синфи хеле содда барои навиштани намудҳо ва сатрҳои ибтидоии Java. Бешубҳа, шумо рамзи навишташударо ҳатто бидуни тавзеҳ хоҳед фаҳмид:

    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);
    
       }
    }

    Он барои ҳар як намуд усулҳои алоҳида дорад - writeDouble(), writeLong(), writeShort()ва ғайра.

  2. Синф FileOutputStream . Механизми фиристодани маълумот ба файли дискро амалӣ мекунад. Воқеан, мо онро дар мисоли қаблӣ истифода карда будем, оё шумо пай бурдед? Мо онро дар дохor DataOutputStream гузаронидем, ки он ҳамчун "печанда" амал мекард.

  3. BufferedOutputStream. Ҷараёни баромади буферӣ. Ҳеҷ чизи мураккаб ҳам нест, моҳият ҳамон тавре ки дар BufferedInputStreamBufferedReader'a) аст. Ба ҷои сабти пайдарпайи муқаррарии маълумот, сабт тавассути буфери махсуси "нигоҳдорӣ" истифода мешавад. Бо истифода аз буфер шумо метавонед шумораи сафарҳои даврӣ ба макони таъиноти маълумотро кам кунед ва ба ин васила самаранокиро беҳтар созед.

    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();
       }
    }

    Боз, шумо метавонед бо ин code худатон "бозӣ кунед" ва санҷед, ки он дар файлҳои воқеӣ дар компютери шумо чӣ гуна кор мекунад.

Шумо инчунин метавонед дар бораи ворисон дар маводи " Системаи InputStreamвуруд / баромад " хонед. Оҳ , ва мо низ як лекцияи алоҳида хоҳем дошт, бинобар ин дар бораи онҳо барои шиносоии аввал кофӣ маълумот вуҷуд дорад. Ҳамааш ҳамин! Умедворем, ки шумо фарқиятҳои байни интерфейсҳо ва синфҳои абстрактиро хуб дарк мекунед ва омодаед ба ҳама саволҳо, ҳатто ба саволи душвор ҷавоб диҳед :) OutputStreamFileInputStreamFileOutputStreamBufferedInputStream
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION