Դաս 22։ Java – Overriding

0

Նախորդ դասում խոսեցինք superclasses և subclasses-ի մասին: Եթե դասը ժառանգում է մեթոդ գերադաս դասից, ուրեմն հնարավորություն կա կանխարգելել մեթոդը, այն դեպքում, եթե վերջինս սահմանված չէ, որպես վերջնական:

Վերադասավորման առավելությունները հետևյալն են. Ենթադասի վարքագիծը սահմանելու ունակությունը, ինչը նշանակում է, որ ենթադասը կարող է իրականացնել ծնողական դասի մեթոդը ըստ իր պահանջների:

object-oriented պայմաններում վերադասավորումը նշանակում է արդեն իսկ առկա մեթոդի ֆունկցիաոնալության փոփոխում։

Օրինակ՝

class Animal {

public void move() {

System.out.println(“Animals can move”);

}

}

 

class Dog extends Animal {

public void move() {

System.out.println(“Dogs can walk and run”);

}

}

 

public class TestDog {

 

public static void main(String args[]) {

Animal a = new Animal();   // Animal reference and object

Animal b = new Dog();   // Animal reference but Dog object

 

a.move();   // runs the method in Animal class

b.move();   // runs the method in Dog class

}

}

 

Արդյունքը՝

Animals can moveDogs can walk and run

 

Վերոնշյալ օրինակում դուք կարող եք տեսնել, որ չնայած b-ն պատկանում է կենդանիների տեսակին, սակայն այն գործարկում է move method-ը Dog դասում: Պատճառն հետևյալն է. Կոմպիլյացիայի ժամանկ ստուգումը կատարվում է reference տիպով: Այնուամենայնիվ, գործարկման ժամանակ JVM-ն որոշում է օբյեկտի տեսակը և գործարկում է այդ օբյեկտին պատկանող մեթոդը:

Այդ իսկ պատճառով վերը նշված օրինակում ծրագիրը կիրականանա պատշաճ ձևով, քանի որ Animal դասը ունի move մեթոդը: Այնուհետև, գործարկման ժամանակ, այն կգործարկի տվյալ օբյեկտի համար նախատեսված հատուկ մեթոդը:

Օրինակ՝

class Animal {

public void move() {

System.out.println(“Animals can move”);

}

}

class Dog extends Animal {

public void move() {

System.out.println(“Dogs can walk and run”);

}

public void bark() {

System.out.println(“Dogs can bark”);

}

}

public class TestDog {

public static void main(String args[]) {

Animal a = new Animal();   // Animal reference and object

Animal b = new Dog();   // Animal reference but Dog object

a.move();   // runs the method in Animal class

b.move();   // runs the method in Dog class

b.bark();

}

}

 

Արդյունքը՝

TestDog.java:26: error: cannot find symbol

b.bark();

^

symbol:   method bark()

location: variable b of type Animal

1 error

 

Ծրագիրը «կնտի» compile time error, քանի որ b-ի հղման տեսակն՝  Animal-ը չունի համապատասխան անունով մեթոդ:

 

Մեթոդի վերադասավորման կանոններ/Rules for Method Overriding

 

  • Արգումենտների ցուցակը պետք է լինի նույնը, ինչ overridden մեթոդինը։
  • Վերադարձի տեսակը պետք է լինի նույնը կամ պատականի վերադարձի տեսակի ենթատիպին, որը հայտարարված է overridden method-ով գերագույն դասում։
  • Մուտքի մակարդակը չի կարող ավելի սահմանափակ լինել, քան overridden մեթոդի մուտքի մակարդակը: Օրինակ` եթե superclass method-ը հայտարարված public, ապա overridding method-ը եթադասում չի կարող լինել private կամ protected՝ պաշտպանված։
  • Instance method-ները կարող են վերադասավորվել միայն այն դեպքում, եթե դրանք ժառանգված են ենթադասի կողմից:
  • Վերջնական հայտարարված մեթոդը չի կարող վերադասավորվել։
  • Ստատիկ հայտարարված մեթոդը չի կարող վերադասավորվել, բայց կարող է կրկին հայտարարվել:
  • Եթե մեթոդը չի կարող ժառանգվել, ապա այն չի կարող վերադասավորվել:
  • Միևնույն փաթեթի ենթադասը կարող է վերադասավորել ցանկացած superclass մեթոդ, որը հայտարարված չէ private կամ վերջնական՝final:
  • Այլ փաթեթներում գտնվող ենթադասը կարող է միայն վերադասվորել non-final method-ները, որոնք հայատարարված public կամ protected՝ պաշտպանված։
  • overriding method-ը կարող է «նետել» ցանկացած չստուգված բացառություն, անկախ այն հանգամանքից, թե overridden method-ը բացառություն նետում է, թե ոչ: Այնուամենայնիվ, overriding method-ը չպետք է «նետի» ստուգված բացառություններ, որոնք նոր են կամ ավելի լայն, քան overridden method-ի հայտարարվածները: overriding method-ը կարող է նեղ կամ ավելի քիչ բացառություններ «նետել», քան overridden method-ը։
  • Կոնստրուկտորները չեն կարող վերադասավորվել։

 

super Keyword-ի կիառությունը։

overridden method-ի մեթոդի superclass տարբերակը կանչելու համար օգտագործվում է super բանալի բառը:

Օրինակ՝

class Animal {

public void move() {

System.out.println(“Animals can move”);

}

}

class Dog extends Animal {

public void move() {

super.move();   // invokes the super class method

System.out.println(“Dogs can walk and run”);

}

}

public class TestDog {

public static void main(String args[]) {

Animal b = new Dog();   // Animal reference but Dog object

b.move();   // runs the method in Dog class

}

}

 

Արդյունքը՝

Animals can move

Dogs can walk and run

 

 

Հարգելի ընթերցող, խնդրում ենք չմոռանալ like տալ մեր ֆեյսբուքյան էջին, քանի որ նորությունների մեծ մասը առաջինը տեղադրվում է հենց այնտեղ։ Ինչպես նաև հետևեք մեզ այլ սոցիալական ցանցերում և, իհարկե, գրանցվեք մեր բլոգում։

 

Share.