2.10. Java tilida nasl tushunchasi.
Java dasturlash tilining amaliy natija beradigan juda katta imkoniyat mavjud. Bu imkoniyat merosxo’rlik deyiladi. Yuqori savyada yozilgan sinfdan siz xoxlagancha nasl olib uni boyitib o’zingizni yangi sinfingizni yaratishingiz mumkin. Merosxorlik bu mexanizimdir. Meros olinganda faqat ruxsat etilgan meros merosxo’rga o’tkaziladi va u sinfga bo’y sunish tartibida meros olivchi sinfning barch imkoniyatidan foidalanadi. Java tilida meros olingan sinf superclass deyiladi. Meros olish extends kalit so’zi orqali amalga oshiriladi.Masalan bizda A sinfi bo’lsin:
class C{
private int x;
public void setX(int x){
this.x=x;
}
public int getX(){
return this.x;
}
}
Endi yangi D sinfini yaratamiz lekin C sinfning barcha imkoniyati D sinfida bo’lishini xoxlaymiz. Buning uchun sinfni quyidagicha yaratamiz:
class D extends C{
//C sinfning ruxsat qilingan imkoniyati bizda bor;
}
D sinfidan foidlanganimizda hammasini tushinib olasiz.
public class MainClass {
public static void main(String[] args) {
D d=new D();
d.setX(5);
System.out.println(d.getX());
}
}
Asosiy sinfimizda D sinf orqali obekt yaratib oldik. Ko’rib turganigizdek biz C sinfida yozib qo’yilgan metodlardan foidalib turibmiz chunkiy biz C sinfini superclass qilib elon qildik. Shu joyda biz private bilan protected ning farqini tushinib olamiz. Agar biz private ko’rinishida metod va maydonlarni elon qilsak bu metod va maydonlar yopiq ko’rinishga ega bo’ladi va merosga ham o’tmaydi bulardan faqat shu sinf ichida foidalana olamiz.
class C{
private int x;
private void setX(int x){
this.x=x;
}
private int getX(){
return this.x;
}
}
class D extends C{
//C sinfning imkoniyati bizda yoq;
}
public class MainClass {
public static void main(String[] args) {
D d=new D();
d.setX(5); //bu xato(chunkiy naslga o’tmagan)
C c=new C();
c.setX(15); //bu xato(chunki metod yopiq)
}
}
Metod va maydonlar protected bo’lsa huddi private kabi xususiyatga ega bo’ladi farqi naslga meros bo’lib o’tadi.
class C{
private int x;
protected void setX(int x){
this.x=x;
}
protected int getX(){
return this.x;
}
}
class D extends C{
//C sinfning ruxsat qilingan imkoniyati bizda bor;
}
public class MainClass {
public static void main(String[] args) {
D d=new D();
d.setX(5); //bu to’g’ri(chunkiy naslda bor)
System.out.println(d.getX());
}
}
Java tilida nasl tushunchasini tushinish uchun murakkabiroq sinflarni ko’rib chiqamiz. Bizda Point sinfi mavjud bo’lsin:
class Point{
int x,y;
Point(int x,int y){
this.x=x;this.y=y;
}
Point(){
this(-10,45);
}
double destenc(int x,int y){
int dx=this.x-x;
int dy=this.x-y;
return Math.sqrt(dx*dx+dy*dy);
}
double destenc(Point p){
return destenc(p.x,p.y);
}
}
Point sinfi tekislikdagi nuqtaning koordinatalarini anglatadi. Point sinfi bir necha imkoniyatlarga ega.Ko’rib turganimizdek destanc metodi ixtiyoriy nuqtagacha bo’lgan masofani aniqlab beradi. Endi shu Point sinfi orqali Point3D sinfini yaratamiz:
class Point3D extends Point{
int z;
Point3D(int x,int y,int z){
super(x,y);
this.z=z;
}
Point3D(){
this(0,0,0);
}
double desc(int x,int y,int z){
int dx=this.x-x;
int dy=this.y-y;
int dz=this.z-z;
return Math.sqrt(Math.pow(dx,2)+Math.pow(dy,2)+Math.pow(dz,2));
}
double desc(Point3D p){
return desc(p.x,p.y,p.z);
}
}
Biz juda osonlik bilan Point sinfi orqali Point3D sinfini yarata oldik. Unga faqat bitta koordinata kirittik xolos. Bu yerda faqat bitta bizga tanish bo’lmagan tushuncha mavjud bo’ldi bu super(x,y) metodidir. Buning manosi superclass ning konstruktori kabi deganidir. Xuddikiy superclass konstruktorigamurojatni anglatadi. Quyida biz ushbu singladan foidalanishni ko’rsatib beramiz:
public class Main {
public static void main(String[] args) {
Point p1=new Point();
Point p2=new Point(77,88);
Point p3=new Point();
p1.x=11;
p1.y=22;
System.out.println(p1.x+" "+p1.y);
System.out.println(p2.x+" "+p2.y);
System.out.println(p3.x+" "+p3.y);
System.out.println(p2.destenc(p1.x, p1.y));
System.out.println(p2.destenc(p1));
Point3D p4=new Point3D();
Point3D p5=new Point3D(25,37,44);
System.out.println("p4.x="+p4.x+" p4.y="+p4.y+" p4.z="+p4.z);
System.out.println("p5.x="+p5.x+" p5.y="+p5.y+" p5.z="+p5.z);
System.out.println(p4.desc(p5));
}
}
Ko’rib turganimizdek p1,p2,p3 obektlar Point tipidadir, p4,p5 obektlar esa Point3D tipiga tegishlidir.
Do'stlaringiz bilan baham: |