Indhold:
Nøgleordene public, protected og private forklaret i dybden
Nøgleordet final
Nøgleordet abstract
Nøgleordenes betydning når de anvendes på variabler, metoder og klasser
Dette kapitels afsnit om final på variabler forudsættes af kapitel 21, Indre klasser.
Forudsætter kapitel 5, Nedarvning og 6, Pakker og ønske om at vide mere om emner som først bliver relevante når man laver større programmer.
Det er vigtigt at styre adgangen til at kalde metoder og ændre på variabler, i særdeleshed når programmerne bliver store. Det kan lette overskueligheden meget hvis interne variabler, metoder og klasser er skjult for programmøren.
Adgang styres med nøgleordene public, protected og private. Adgangskontrol ud over public/private bliver først interessant når der er mange klasser og programmet spænder over flere pakker. Se eventuelt kapitlet om pakker.
Variabler og metoder erklæret public er altid tilgængelige, inden og uden for klassen.
Variabler og metoder erklæret protected er tilgængelige for alle klasser inden for samme pakke. Klasser i andre pakker kan kun få adgang, hvis de er nedarvinger.
Skriver man ingenting, er det kun klasser i samme pakke, der har adgang til variablen eller metoden.
Hvis en variabel eller metode er erklæret private, kan den kun benyttes inden for samme klasse (og kan derfor ikke tilsidesættes med nedarvning). Det er det mest restriktive.
Adgangen kan sættes på skemaform:
Adgang |
public |
protected |
(ingenting) |
private |
---|---|---|---|---|
i samme klasse |
ja |
ja |
ja |
ja |
klasse i samme pakke |
ja |
ja |
ja |
nej |
arving i en anden pakke |
ja |
ja |
nej |
nej |
ej arving og i en anden pakke |
ja |
nej |
nej |
nej |
Holder man sig inden for samme pakke, er der altså ingen forskel mellem public, protected og ingenting.
Klasser kan erklæres public eller ingenting (men ikke protected eller private).
Klasser erklæres normalt public og er tilgængelige fra alle pakker.
public class X
{
// ...}
Undlader man public, er klassen kun tilgængelig inden for samme pakke.
class X
{
// ...}
Man kan have flere klasser i en fil, men højst en, der er public, og denne klasse skal hedde det samme som filnavnet.
Noget, der er erklæret final, kan ikke ændres. Både variabler, metoder og klasser kan erklæres final.
En variabel, der er erklæret final, kan ikke ændres, når den først har fået en værdi.
public class X { public final int a=10; //.. // forbudt: a=11; }
Herover kan a's værdi ikke ændres i den efterfølgende kode.
Det kan lette overskueligheden at vide, hvilke variabler, der er konstante. Desuden udføres programmet lidt hurtigere.
final foran en objektvariabel angiver ikke synlighed, men kan bruges sammen med public, protected og private.
final kan også bruges på lokale variabler (hvor public, protected og private aldrig kan bruges):
public static void main(String args[]) { final Vector v = new Vector(); //v = new Vector(); // ulovligt! v kan ikke ændres.
Bemærk: Når vi arbejder med objekter, er variablerne jo referencer til objekterne. En variabel erklæret final kan ikke ændres til at referere til et andet objekt, men objektet kan godt få ændret sin indre tilstand, f.eks. gennem et metodekald:
v.addElement("Hans"); // lovligt, v refererer stadig til samme objekt
En metode erklæret final kan ikke tilsidesættes i en nedarving.
public class X { public final void a() { // .. } }
public class Y extends X { public void a() // ulovligt! a() er final { //.. } }
Den virtuelle maskine kan optimere final metoder, så kald til dem sker en smule hurtigere.
En klasse erklæret final må man overhovedet ikke arve fra (og alle dens metoder bliver final).
public final class X { // .. }
public class Y extends X // ulovligt! X er final { }
Noget der er erklæret abstract er ikke implementeret og skal defineres i en nedarvning.
Det skrives i kursiv i UML-notationen.
En abstrakt klasse erklæres således
public abstract class X { public void a() { //.. } }
Det er ikke tilladt at oprette objekter fra en abstrakt klasse
public static void main(String args[]) { X x = new X(); // ulovligt! X er abstrakt
I stedet skal man arve fra klassen
public class Y extends X { }
og lave objekter fra den nedarvede klasse:
public static void main(String args[]) { X x; // lovligt x = new Y(); // lovligt, Y er ikke abstrakt
Basisklasserne for IO-systemet, InputStream og OutputStream, abstrakte, fordi programmøren altid skal bruge en mere konkret klasse, f.eks. FileInputStream (se afsnit 14.5.2).
Det er lovligt (og nyttigt i visse tilfælde) at have variabler af en abstrakt klasse (det svarer til, at det er lovligt og nyttigt at have variabler af en interface-type).
En metode erklæret abstract har et metodehoved, men ingen krop. Den kan kun erklæres i en abstrakt klasse
public abstract class X { public abstract void a(); }
Nedarvede klasser skal definere de abstrakte metoder (eller også selv være abstrakte)
public class Y extends X { public void a() { //.. } }