-
Интерфейс танҳо рафторро тавсиф мекунад. Ӯ бахт надорад. Аммо синфи абстрактӣ ҳолат дорад: он ҳардуро тавсиф мекунад.
Биёед як синф
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 усулҳои интерфейси пешфарзро ҷорӣ кард, ки амалӣ доранд. Шумо аллакай дар бораи онҳо медонед, бинобар ин мо онҳоро такрор намекунем.
-
Синфи абстрактӣ синфҳоро мепайвандад ва муттаҳид мекунад, ки муносибати хеле наздик доранд. Дар айни замон, ҳамон интерфейсро синфҳое амалӣ кардан мумкин аст, ки умуман умумӣ надоранд.
Биёед ба мисоли худ бо паррандагон баргардем.
Синфи абстрактии мо
Bird
барои офаридани паррандагон дар асоси он зарур аст. Танҳо паррандагон ва ҳеҷ каси дигар! Албатта, онҳо гуногун хоҳанд буд.Бо интерфейс
Flyable
ҳама чиз гуногун аст. Он танҳо рафтореро, ки ба номи он мувофиқ аст - "парвоз" тавсиф мекунад. Мафхуми «парвоз», «кобorяти парвоз» бисьёр an objectхоеро дарбар мегирад, ки ба хамдигар алоцаманд нестанд.Ин 4 субъект ба ҳеҷ ваҷҳ бо ҳамдигар алоқаманд нестанд. Чӣ гуфтан мумкин аст, ки на ҳамаашон ҳатто зиндаанд. Бо вуҷуди ин, ҳамаи онҳо
Flyable
қобorяти парвоз доранд.Мо онҳоро бо истифода аз синфи абстрактӣ тавсиф карда наметавонем. Онҳо давлати умумӣ ё майдонҳои якхела надоранд. Барои тавсифи ҳавопаймо ба мо шояд майдонҳои “модел”, “соли истеҳсол” ва “шумораи ҳадди аксар мусофирон” лозим шавад. Барои Карлсон майдонҳо барои ҳама шириниҳои имрӯза хӯрда ва рӯйхати бозиҳое мавҷуданд, ки ӯ бо кӯдак бозӣ хоҳад кард. Барои магас... у-ух... мо ҳатто намедонем... Шояд "сатҳи озорӣ"? :)
Муҳим он аст, ки мо онҳоро бо истифода аз синфи абстрактӣ тавсиф карда наметавонем. Онҳо хеле гуногунанд. Аммо як рафтори умумӣ вуҷуд дорад: онҳо метавонанд парвоз кунанд. Интерфейс барои тавсифи ҳама чизҳое дар ҷаҳон, ки метавонанд парвоз кунанд, шино кунанд, ҷаҳидан ё ягон рафтори дигар дошта бошанд, беҳтарин аст.
-
Синфҳо метавонанд ҳар қадар интерфейсҳоро иҷро кунанд, аммо онҳо танҳо аз як синф мерос гирифта метавонанд.
Мо дар ин бора на як бору ду бор сухан ронда будем. Дар 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ҳои нодида гирифташуда.
FileInputStream
: намуди маъмултаринInputStream
. Барои хондани маълумот аз файл истифода мешавад;StringBufferInputStream
: намуди дигари муфидInputStream
. Он сатрро ба ҷараёни додаҳои воридотӣ табдил медиҳадInputStream
;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
:
-
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()
ва ғайра. -
Синф
FileOutputStream
. Механизми фиристодани маълумот ба файли дискро амалӣ мекунад. Воқеан, мо онро дар мисоли қаблӣ истифода карда будем, оё шумо пай бурдед? Мо онро дар дохor DataOutputStream гузаронидем, ки он ҳамчун "печанда" амал мекард. -
BufferedOutputStream
. Ҷараёни баромади буферӣ. Ҳеҷ чизи мураккаб ҳам нест, моҳият ҳамон тавре ки дарBufferedInputStream
(ёBufferedReader
'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
вуруд / баромад " хонед. Оҳ , ва мо низ як лекцияи алоҳида хоҳем дошт, бинобар ин дар бораи онҳо барои шиносоии аввал кофӣ маълумот вуҷуд дорад. Ҳамааш ҳамин! Умедворем, ки шумо фарқиятҳои байни интерфейсҳо ва синфҳои абстрактиро хуб дарк мекунед ва омодаед ба ҳама саволҳо, ҳатто ба саволи душвор ҷавоб диҳед :) OutputStream
FileInputStream
FileOutputStream
BufferedInputStream
GO TO FULL VERSION