Kelas batin anonim, lan conto - 1

"Hai, Amigo!"

"Nanging kita wis ngomong hello, Ellie!"

"Heh, aja padu karo bulikmu. Ing abad 31 iki, yen wis luwih saka setengah jam ora ketemu wong, wis adat salam maneh. Mula aja dumeh sikapmu!"

"Oalah, wektune kanggo topik menarik liyane: reproduksi robot!"

"O_O."

"Cukup guyon, topik anyar yaiku kelas batin anonim ."

"Ing Jawa, kadhangkala ana kahanan sing mbutuhake kelas kanggo marisi sawetara kelas. Amarga Jawa ora ndhukung sawetara warisan, dheweke wis ngrampungake masalah iki kanthi nggunakake kelas batin: ing kelas kita, kita nyatakake kelas batin lan nggawe iki warisan kelas apa wae sing perlu kanggo warisan. Iki contone:"

Conto kelas batin sing marisi kelas Utas
class Tiger extends Cat
{
 public void tigerRun()
 {
  .....
 }

 public void startTiger()
 {
  TigerThread thread = new TigerThread();
  thread.start();
 }

 class TigerThread extends Thread
 {
  public void run()
  {
   tigerRun();
  }
 }
}

"Ayo digali conto liyane:"

Kita butuh subkelas saka kelas Utas supaya bisa ngatasi metode sing ditindakake.

"Mulane ing kelas Macan, kita ngumumake kelas jero TigerThread , sing marisi Thread lan ngatasi metode run.

"Kanggo penak, kita nemtokake rong cara ing kelas Macan: tigerRun lan startTiger (sing padha karo metode run and start Thread."

"Ing metode tigerStart, kita nggawe obyek TigerThread lan njaluk cara wiwitan ()."

"JVM bakal nggawe utas anyar sing bakal diwiwiti nalika metode run TigerThread diarani."

"Cara iki banjur nelpon metode run kita : tigerRun ."

"Aku wis kerja karo benang sadurunge, mula iki katon langsung."

"Apa kita kudu menehi jeneng metode tigerRun lan tigerStart?"

"Ora, kita bisa nelpon wong-wong mau mbukak lan miwiti, nanging aku uga pengin nduduhake yen kita ora oleh warisan Thread. Panjelasan bisa uga luwih mbingungake."

"OK. Banjur aku njaluk. Nanging yen tigerStart diarani kaping pindho, kita bakal nggawe lan miwiti obyek Thread kapindho. Apa ora ateges kita bakal duwe «siji macan mlaku ing rong benang beda»? "

"Lho, ora landhep! Sampeyan bener, lan iku ora apik. Ayo nulis maneh kode kaya iki:"

Kode
class Tiger extends Cat
{
 public void tigerRun()
 {
  .....
 }

 public void startTiger()
 {
  thread.start();
 }

 private TigerThread thread = new TigerThread();

 private class TigerThread extends Thread
 {
  public void run()
  {
   tigerRun();
  }
 }
}

"Iku ora cukup sampurna. Sampeyan isih ora bisa nelpon cara sing kaping pindho. Nanging wektu iki, paling kita ora bakal nggawe thread kapindho lan nggawe katon kaya kabeh iku apik."

"Iya bener. Sing kaping pindho Macan diwiwiti, sampeyan bakal entuk pengecualian."

"Aku wis ngerteni kesalahan sing luwih apik tinimbang sampeyan, Ellie!"

"Ya, sampeyan pancen apik. Banjur ayo pindhah menyang kelas batin anonim."

"Elinga sawetara aspek kode ing ndhuwur:"

1) We marisi kelas Utas, nanging dileksanakake prakteke ora kode ana. "Iku luwih «kita kudu oleh warisan kelas Utas» tinimbang «kita warisake kanggo ngluwihi».

2) Mung siji obyek TigerThread bakal digawe.

Ing tembung liyane, kita nulis akeh kode mung kanggo ngatasi siji cara lan nggawe siji obyek.

Apa sampeyan ngelingi carane aku ngomong babagan penemuan konstruktor?

Sadurunge konstruktor Sawise konstruktor
TigerThread thread = new TigerThread();

private class TigerThread extends Thread
{
 public void run()
 {
  tigerRun();
 }
}
Thread thread = new Thread()
{
 public void run()
 {
  tigerRun();
 }
};

"Aku ndeleng kode dadi luwih kompak, nanging aku ora ngerti apa sing kedadeyan."

"Kita bisa nggabungake papat perkara dadi siji:"

1) deklarasi kelas turunan

2) metode overriding

3) deklarasi variabel

4) nggawe conto saka kelas turunan.

"Nyatane, apa sing kita lakoni yaiku nggabungake rong operasi: ngumumake kelas asale lan nggawe conto kelas kasebut."

Tanpa kelas anonim Kanthi kelas anonim
Cat tiger = new Tiger();

class Tiger extends Cat
{
}
Cat tiger = new Cat()
{
};

"Ayo njelajah sintaksis maneh:"

Pranyatan saka variabel Utas
Thread thread = new Thread();
Pranyatan variabel sing jinis "kelas anonim sing marisi Thread"
Thread thread = new Thread()
{

};

"Elinga yen kita ora mung nemtokake kelas anyar. Kita nggawe variabel-ana titik koma ing pungkasan!"

"Lan yen kita pengin ngilangi metode run, mula kita kudu nulis iki:"

Pranyatan saka variabel Utas
Thread thread = new Thread()
{
 public void run()
  {
   System.out.println("new run-method");
  }
};

"Sampeyan cepet nyekel. Inggih rampung!"

"Thanks. Apa yen kita butuh cara liya sing dudu bagean saka kelas Utas?"

"Sampeyan bisa nulis mau."

"Sanajan anonim, iki minangka kelas batin sing lengkap:"

kode Jawa Katrangan
Thread thread = new Thread()
{
  public void run()
  {
   printHi();
  }

  public void printHi()
  {
   System.out.println("Hi!");
  }
};
Abang: kode kanggo nggawe variabel.

Ijo: kode kanggo nggawe obyek.

Biru: kode kanggo kelas turunan anonim.

"Kelas batin sing lengkap?"

"Dadi aku bisa nggunakake variabel saka kelas njaba?"

"Pancen."

"Lan aku bisa pass soko kanggo konstruktor?"

"Ya, nanging mung argumen kanggo konstruktor superclass:"

kelas Kayata saka kelas njero anonim
class Cat
{
 int x, y;
 Cat(int x, int y)
 {
  this.x = x;
  thix.y = y;
 }
}
Cat cat = new Cat(3,4)
{
  public void print()
  {
   System.out.println(x+" "+y);
  }
};

"Kita ora bisa nambah paramèter dhewe kanggo konstruktor wong liya. Nanging kita bisa nggunakake variabel saka kelas njaba, kang menehi kompensasi apik kanggo shortcoming iki."

"Apa yen aku isih kudu nambah paramèter liyane kanggo konstruktor?"

"Banjur ngumumake kelas batin biasa (non-anonim) lan gunakake."

"Inggih, kula meh lali bab iku."

"Apa yen aku ngumumake variabel statis? Apa sing nggawe kelas anonim dadi kelas nested statis tinimbang kelas njero? Ing tembung liya, bakal ora ana referensi kanggo kelas njaba?"

"Ora. Iku bakal dadi kelas batin anonim. Deleng conto iki."

Kanthi kelas anonim Tanpa kelas anonim
Thread thread = new Thread()
{
  public void run()
  {
   tigerRun();
  }
};
TigerThread thread = new TigerThread();

private class TigerThread extends Thread
{
 public void run()
 {
  tigerRun();
 }
}
static Thread thread = new Thread()
{
  public void run()
  {
   tigerRun();
  }
};
static TigerThread thread = new TigerThread();

private class TigerThread extends Thread
{
 public void run()
 {
  tigerRun();
 }
}

"Aku weruh. Mung variabel statis bakal statis, dudu kelas."

"Ya wis."

"Nyatane, kompiler nggawe kelas njero kanggo kabeh kelas batin anonim. Kelas iki biasane dijenengi «1», «2», «3», lsp.