"Aku bakal pitutur marang kowe bab « akses modifiers ". Aku marang bab mau sapisan sadurunge, nanging pengulangan minangka pilar learning.

Sampeyan bisa ngontrol akses (visibility) sing kelas liyane duwe kanggo cara lan variabel kelas. Modifier akses mangsuli pitakon "Sapa sing bisa ngakses metode / variabel iki?". Sampeyan bisa nemtokake mung siji modifier kanggo saben metode utawa variabel.

1) " publik " modifier.

Variabel, metode, utawa kelas sing ditandhani karo modifier umum bisa diakses saka ngendi wae ing program kasebut. Iki minangka tingkat keterbukaan sing paling dhuwur: ora ana watesan.

2) " pribadi " modifier.

Variabel, metode, utawa kelas sing ditandhani karo modifier pribadi mung bisa diakses ing kelas sing diumumake. Cara utawa variabel sing ditandhani didhelikake saka kabeh kelas liyane. Iki minangka tingkat privasi paling dhuwur: mung bisa diakses dening kelas sampeyan. Cara kasebut ora diwarisake lan ora bisa diganti. Kajaba iku, ora bisa diakses ing kelas turunan.

3)  " Pengubah Default ".

Yen variabel utawa metode ora ditandhani karo modifier apa wae, mula dianggep ditandhani karo modifier "standar". Variabel lan cara karo modifier iki katon kanggo kabeh kelas ing paket ngendi padha diumumake, lan mung kanggo kelas kasebut. Modifier iki uga disebut akses " paket " utawa " paket pribadi ", menehi tandha manawa akses menyang variabel lan metode mbukak kanggo kabeh paket sing ngemot kelas.

4) " dilindungi " modifier.

Tingkat akses iki rada jembar tinimbang paket . Variabel, metode, utawa kelas sing ditandhani karo modifier sing dilindhungi bisa diakses saka paket kasebut (kayata "paket"), lan saka kabeh kelas sing diwarisake.

Tabel iki nerangake kabeh:

Jinis visibilitas tembung kunci Akses
Kelasmu Paket sampeyan Keturunan Kabeh kelas
Pribadi pribadi ya wis Ora Ora Ora
Paket (ora ana modifier) ya wis ya wis Ora Ora
dilindhungi dilindhungi ya wis ya wis ya wis Ora
Umum umum ya wis ya wis ya wis ya wis

Ana cara kanggo gampang ngelingi tabel iki. Bayangna sampeyan lagi nulis surat wasiat. Sampeyan mbagi kabeh barang dadi papat kategori. Sapa sing bisa nggunakake barang sampeyan?

Sing duwe akses Modifier Tuladha
Mung  kula pribadi Jurnal pribadi
kulawarga (ora ana modifier) Foto kulawarga
Kulawarga lan ahli waris dilindhungi Estate kulawarga
Kabeh wong umum Kenangan

"Iku kaya mbayangno yen kelas ing paket sing padha minangka bagean saka siji kulawarga."

"Aku uga pengin menehi pitutur marang kowe sawetara nuansa menarik babagan cara overriding."

1) Pelaksanaan implisit metode abstrak.

Contone, sampeyan duwe kode ing ngisor iki:

Kode
class Cat
{
 public String getName()
 {
  return "Oscar";
 }
}

Lan sampeyan mutusaké kanggo nggawe kelas Tiger sing oleh warisan kelas iki, lan nambah antarmuka kanggo kelas anyar

Kode
class Cat
{
 public String getName()
 {
   return "Oscar";
 }
}
interface HasName
{
 String getName();
 int getWeight();
}
class Tiger extends Cat implements HasName
{
 public int getWeight()
 {
  return 115;
 }

}

Yen sampeyan mung ngleksanakake kabeh cara sing ilang sing IntelliJ IDEA ngandhani sampeyan supaya bisa dileksanakake, mengko sampeyan bisa ngenteni suwene nggoleki bug.

Pranyata kelas Tiger duwe metode getName sing diwarisake saka Cat, sing bakal dijupuk minangka implementasi metode getName kanggo antarmuka HasName.

"Aku ora weruh apa-apa sing nggegirisi."

"Ora ala banget, iki minangka papan kanggo kesalahan."

Nanging bisa uga luwih elek:

Kode
interface HasWeight
{
 int getValue();
}
interface HasSize
{
 int getValue();
}
class Tiger extends Cat implements HasWeight, HasSize
{
 public int getValue()
 {
  return 115;
 }
}

Pranyata sampeyan ora bisa tansah oleh warisan saka macem-macem antarmuka. Luwih tepate, sampeyan bisa entuk warisan, nanging sampeyan ora bisa ngetrapake kanthi bener. Delengen contone. Loro-lorone antarmuka mbutuhake sing ngleksanakake getValue () cara, nanging ora cetha apa kudu bali: bobot utawa ukuran? Iki cukup ora nyenengake kanggo kudu ditangani.

"Aku setuju. Sampeyan pengin ngleksanakake metode, nanging ora bisa. Sampeyan wis entuk warisan metode kanthi jeneng sing padha saka kelas dhasar. Rusak."

"Nanging ana kabar apik."

2) Ngembangake visibilitas. Nalika sampeyan marisi jinis, sampeyan bisa nggedhekake visibilitas cara. Mangkene tampilane:

kode Jawa Katrangan
class Cat
{
 protected String getName()
 {
  return "Oscar";
 }
}
class Tiger extends Cat
{
 public String getName()
 {
  return "Oscar Tiggerman";
 }
}
Kita wis nggedhekake visibilitas cara saka protectedkanggo public.
Kode Iki kok "legal"
public static void main(String[] args)
{
 Cat cat = new Cat();
 cat.getName();
}
Kabeh apik. Ing kene kita ora ngerti manawa visibilitas wis ditambah ing kelas turunan.
public static void main(String[] args)
{
 Tiger tiger = new Tiger();
 tiger.getName();
}
Kene kita nelpon cara sing visibilitas wis ditambahi.

Yen iki ora bisa, kita bisa tansah ngumumake cara ing Tiger:
public String getPublicName()
{
super.getName(); //nelpon metode sing dilindhungi
}

Ing tembung liyane, kita ora ngomong babagan nglanggar keamanan.

public static void main(String[] args)
{
 Cat catTiger = new Tiger();
 catTiger.getName();
}
Yen kabeh syarat sing dibutuhake kanggo nelpon metode ing kelas dhasar ( Cat ) wis rampung, mula dheweke mesthi puas kanggo nyebut metode kasebut ing jinis turunan ( Macan ). Amarga watesan ing telpon cara padha banget, ora kuwat.

"Aku ora yakin aku ngerti, nanging aku bakal ngelingi yen iki bisa."

3) Narrowing jinis bali.

Ing cara overridden, kita bisa ngganti jinis bali menyang jinis referensi narrowed.

kode Jawa Katrangan
class Cat
{
 public Cat parent;
 public Cat getMyParent()
 {
  return this.parent;
 }
 public void setMyParent(Cat cat)
 {
  this.parent = cat;
 }
}
class Tiger extends Cat
{
 public Tiger getMyParent()
 {
  return (Tiger) this.parent;
 }
}
We overrode cara getMyParent, lan saiki ngasilake obyek Tiger.
Kode Iki kok "legal"
public static void main(String[] args)
{
 Cat parent = new Cat();

 Cat me = new Cat();
 me.setMyParent(parent);
 Cat myParent = me.getMyParent();
}
Kabeh apik. Ing kene kita ora ngerti manawa jinis bali metode getMyParent wis ditambahake ing kelas turunan.

Carane «kode lawas» makarya lan dianggo.

public static void main(String[] args)
{
 Tiger parent = new Tiger();

 Tiger me = new Tiger();
 me.setMyParent(parent);
 Tiger myParent = me.getMyParent();
}
Kene kita nelpon cara kang jinis bali wis narrowed.

Yen iki ora bisa, kita bisa tansah wara-wara cara ing Tiger:
umum Tiger getMyTigerParent ()
{
bali (Tiger) this.parent;
}

Ing tembung liyane, ora ana pelanggaran keamanan lan / utawa nglanggar jinis casting.

public static void main(String[] args)
{
 Tiger parent = new Tiger();

 Cat me = new Tiger();
 me.setMyParent(parent);
 Cat myParent = me.getMyParent();
}
Lan kabeh kerjane apik ing kene, sanajan kita nggedhekake jinis variabel menyang kelas dasar (Cat).

Amarga overriding, metode setMyParent sing bener diarani.

Lan ana apa-apa kanggo padha sumelang ing bab nalika nelpon cara getMyParent , amarga Nilai bali, sanadyan saka kelas Tiger, isih bisa diutus kanggo variabel myParent saka kelas dhasar (Cat) tanpa masalah.

Objek Macan bisa disimpen kanthi aman ing variabel Macan lan variabel Kucing.

"Yep. Entuk. Nalika overriding metode, sampeyan kudu ngerti carane kabeh iki bisa digunakake yen kita pass obyek kanggo kode sing mung bisa nangani kelas dhasar lan ora ngerti apa-apa bab kelas kita. "

"Persis! Banjur pitakonan gedhe kok kita ora bisa mbatesi jinis nilai bali nalika overriding cara?"

"Jelas yen ing kasus iki kode ing kelas dasar bakal mandheg:"

kode Jawa Panjelasan masalah
class Cat
{
 public Cat parent;
 public Cat getMyParent()
 {
  return this.parent;
 }
 public void setMyParent(Cat cat)
 {
  this.parent = cat;
 }
}
class Tiger extends Cat
{
 public Object getMyParent()
 {
  if (this.parent != null)
   return this.parent;
  else
   return "I'm an orphan";
 }
}
We overloaded cara getMyParent lan narrowed jinis Nilai bali.

Kabeh apik ing kene.

public static void main(String[] args)
{
 Tiger parent = new Tiger();

 Cat me = new Tiger();
 Cat myParent = me.getMyParent();
}
Banjur kode iki bakal mandheg.

Cara getMyParent bisa ngasilake sembarang conto saka Obyek, amarga iku bener disebut ing obyek Tiger.

Lan kita ora duwe mriksa sadurunge tugas. Mangkono, bisa uga variabel myParent jinis Cat bakal nyimpen referensi String.

"Conto sing apik banget, Amigo!"

Ing Jawa, sadurunge metode diarani, ora ana priksa manawa obyek kasebut duwe metode kasebut. Kabeh mriksa dumadi nalika runtime. Lan telpon [hipotesis] menyang cara sing ilang bakal nyebabake program kasebut nyoba nglakokake bytecode sing ora ana. Iki pungkasane bakal nyebabake kesalahan fatal, lan sistem operasi bakal nutup program kasebut kanthi paksa.

"Wah. Saiki aku ngerti."