programmera.net -> java -> normal för utskrift | info@programmera.net |
Arv
1. Subklass och Superklass 2. Konstruktorer och arv 3. Gränssnitt 4. Överridning 5. Typomvandlingar 6. instanceof |
1. Subklass och Superklass
Arv är en central del av objektorientering.
I java ärver en klass alltid från en och endast en klass. class x extends y betyder att klass x ärver av klass y. Om extends saknas ärver Java från Object. Nedan ges ett exempel:
class TestExtends{
public static void main(String[] args){
B b=new B();
System.out.println("name="+b.name);
}
}
class A{ String name="Olle";}
class B extends A{ String address;}
[olle@dev1]$ java TestExtends
name=Olle
2. Konstruktorer och arv
Konstruktorerna kan använda de ärvda konstruktorerna från superklassen. Nedan listas några regler om hur super()-konstruktorn används:
Nedan ges ett exempel:
När vi kör exemplet får vi:
class TestSuper{
public static void main(String[] args){
B b=new B("Anna","Orebro");
System.out.println("name="+b.name);
System.out.println("address="+b.address);
}
}
class A{
String name="Olle";
A(String n){ name=n;}
}
class B extends A{
String address;
B(String n, String a){
super(n);
address=a;
}
}
OBS! Om satsen super(n); tas bort ur klass B kan programmet inte kompilera, eftersom klassen A inte har någon A()-konstruktor.
[olle@dev1]$ java TestSuper
name=Anna
address=Orebro
3. Gränssnitt
Eftersom multipelt arv inte är tillåtet i Java använder man gränssnitt istället.
Nedan ges ett exempel på ett gränssnitt:
Satsen Adder a=new A(); skapar ett objet av klassen A som tilldelas en referens av gränssnittet Adder. Detta är fullt godkänt.
class TestInterface{
public static void main(String[] args){
Adder a=new A();
System.out.println(a.add(1,1));
}
}
interface Adder{
public int add(int x, int y);
}
class A implements Adder{
public int add(int x,int y){
return x+y+7;
}
}
[olle@dev1]$ java TestInterface
9
4. Överridning
Vid arv får subklassen tillgång till superklassens metoder. Överridning betyder att man deklarerar en metod i subklassen med samma namn, parametrar och returtyp som en metod i superklassen.
I exemplet nedan överrids metoden print():
Även i andra anropet är det Bs metod som används. Det är därför att ett objekt alltid kommer ihåg vad det är för typ.
class TestOverride{
public static void main(String[] args){
B b=new B();
b.print();
A a=b;
a.print();
}
}
class A{
void print(){
System.out.println("Super");
}
}
class B extends A{
void print(){
System.out.println("Sub");
}
}
[olle@dev1]$ java TestOverride
Sub
Sub
5. Typomvandlingar
En referenstyp av superklass kan peka på ett objekt av en subklass. Ett objekt kommer alltid ihåg vad det är, oavsett vilken referenstyp som pekar på det. Samlingsklasserna har bara Object-referenser, och kan därför lagra allt. När man tar ut ett objekt från en samlingsklass måst man typomvandla det:
Vi testar programmet:
import java.util.*;
class TestConv{
public static void main(String[] args){
List l=new ArrayList(2);
l.add(new Integer(5));
Integer i;
i=(Integer) l.get(0);
System.out.println(i.intValue());
}
}
[olle@dev1]$ java TestConv
5
6. instanceof
Ibland vet man inte vilken typ av objekt som ligger lagrat i en referens. Med instanceof kan man kontrollera huruvida ett objekt är av en viss klass eller ett visst gränssnitt. Operatorn tar som vänster operand en referens och som höger operand en referenstyp. Om objektet är av referenstypen eller en subklass till referenstypen så returneras true. Nedan ges ett exempel:
Vi kör programmet:
import java.util.*;
class TestInstanceof{
public static void main(String[] args){
HashSet hs=new HashSet();
System.out.println(hs instanceof Set);
System.out.println(hs instanceof Object);
hs=null;
System.out.println(hs instanceof Set);
System.out.println(hs instanceof Object);
}
}
null är som vi ser inte en instans av någonting.
[olle@dev1]$ java TestInstanceof
true
true
false
false