Arv i Java är en mekanism där ett objekt förvärvar alla egenskaper och beteenden hos ett överordnat objekt. Det är en viktig del av Hoppsan (Objektorienterat programmeringssystem).
Tanken bakom arv i Java är att du kan skapa nytt klasser som bygger på befintliga klasser. När du ärver från en befintlig klass kan du återanvända metoder och fält för den överordnade klassen. Dessutom kan du lägga till nya metoder och fält i din nuvarande klass också.
Arv representerar IS-A relation som också är känd som en förälder-barn relation.
Varför använda arv i java
- För Metod Åsidosättande (så runtime polymorfism kan uppnås).
- För återanvändbarhet av kod.
Termer som används i Arv
Syntaxen för Java Arv
class Subclass-name extends Superclass-name { //methods and fields }
De utökar nyckelordet indikerar att du skapar en ny klass som härrör från en befintlig klass. Meningen med 'förlänger' är att öka funktionaliteten.
abstrakt klass i java
I Javas terminologi kallas en klass som ärvs en förälder eller superklass, och den nya klassen kallas barn eller underklass.
Java-arvsexempel
Som visas i bilden ovan är programmerare underklassen och anställd är superklassen. Relationen mellan de två klasserna är Programmerare IS-A Anställd . Det betyder att programmerare är en typ av anställd.
arp ett kommando
class Employee{ float salary=40000; } class Programmer extends Employee{ int bonus=10000; public static void main(String args[]){ Programmer p=new Programmer(); System.out.println('Programmer salary is:'+p.salary); System.out.println('Bonus of Programmer is:'+p.bonus); } }Testa det nu
Programmer salary is:40000.0 Bonus of programmer is:10000
I exemplet ovan kan Programmer-objektet komma åt fältet för egen klass såväl som för Employee-klassen, dvs kodåteranvändbarhet.
Typer av arv i java
Baserat på klass kan det finnas tre typer av arv i java: singel, multilevel och hierarkisk.
I java-programmering stöds multipel- och hybridarv endast via gränssnitt. Vi kommer att lära oss om gränssnitt senare.
Obs: Multipelarv stöds inte i Java genom klass.
När en klass ärver flera klasser är det känt som multipelt arv. Till exempel:
Enkelt arv Exempel
När en klass ärver en annan klass kallas det en enskilt arv . I exemplet nedan ärver klassen Hund klassen Djur, så det finns ett enda arv.
maskinskriven för varje
Fil: TestInheritance.java
class Animal{ void eat(){System.out.println('eating...');} } class Dog extends Animal{ void bark(){System.out.println('barking...');} } class TestInheritance{ public static void main(String args[]){ Dog d=new Dog(); d.bark(); d.eat(); }}
Produktion:
barking... eating...
Exempel på arv på flera nivåer
När det finns en arvskedja kallas det arv på flera nivåer . Som du kan se i exemplet nedan, ärver BabyDog-klassen Dog-klassen som återigen ärver Animal-klassen, så det finns ett arv på flera nivåer.
Fil: TestInheritance2.java
class Animal{ void eat(){System.out.println('eating...');} } class Dog extends Animal{ void bark(){System.out.println('barking...');} } class BabyDog extends Dog{ void weep(){System.out.println('weeping...');} } class TestInheritance2{ public static void main(String args[]){ BabyDog d=new BabyDog(); d.weep(); d.bark(); d.eat(); }}
Produktion:
weeping... barking... eating...
Hierarkiskt arvsexempel
När två eller flera klasser ärver en enda klass kallas den hierarkiskt arv . I exemplet nedan ärver hund- och kattklasserna Animal-klassen, så det finns hierarkiskt arv.
Fil: TestInheritance3.java
ogiltig 0
class Animal{ void eat(){System.out.println('eating...');} } class Dog extends Animal{ void bark(){System.out.println('barking...');} } class Cat extends Animal{ void meow(){System.out.println('meowing...');} } class TestInheritance3{ public static void main(String args[]){ Cat c=new Cat(); c.meow(); c.eat(); //c.bark();//C.T.Error }}
Produktion:
meowing... eating...
F) Varför stöds inte multipelt arv i java?
För att minska komplexiteten och förenkla språket stöds inte multipelt arv i java.
Tänk på ett scenario där A, B och C är tre klasser. C-klassen ärver A- och B-klasserna. Om A- och B-klasser har samma metod och du anropar det från ett underordnat klassobjekt, blir det oklarhet att anropa metoden för A- eller B-klass.
Eftersom kompileringsfel är bättre än körtidsfel, återger Java kompileringsfel om du ärver 2 klasser. Så oavsett om du har samma metod eller annorlunda, kommer det att finnas kompileringstidsfel.
class A{ void msg(){System.out.println('Hello');} } class B{ void msg(){System.out.println('Welcome');} } class C extends A,B{//suppose if it were public static void main(String args[]){ C obj=new C(); obj.msg();//Now which msg() method would be invoked? } }Testa det nu
Compile Time Error