Objekt
Det finns ännu en typ av metoder, konstruktorer. Konstruktorer är den metod som anropas när objektet initialiseras. Objekt kan innehålla inget, ett eller flera primitiva datatyper och/eller andra objekt.
1. public class Bil {
2. private String name;
3.
4. public Bil(String n) {
5. name = n;
6. }
7.
8. public String getName() {
9. return name;
10. }
11. }
1. public class BilImplementation {
2. public static void main(String[] args ) {
3. Bil a = new Bil("Saab");
4. Bil b = new Bil("Volvo");
5. System.out.println(a.getName() + " " + b.getName());
6. }
7. }
2. private String name;
3.
4. public Bil(String n) {
5. name = n;
6. }
7.
8. public String getName() {
9. return name;
10. }
11. }
1. public class BilImplementation {
2. public static void main(String[] args ) {
3. Bil a = new Bil("Saab");
4. Bil b = new Bil("Volvo");
5. System.out.println(a.getName() + " " + b.getName());
6. }
7. }
Klassen Bil innehåller en strängvariabel, name och två metoder; en konstruktor och en s.k. getter. Objekt och deras variabler brukar beskrivas med 'has a' på engelska. En bil har ett namn. Namnet bestäms när objektet initialiseras. När objektet initialiseras med nyckelordet new (rad 3 och 4 i BilImplementation) anropas konstruktorn på rad 4 och argumentet blir bilens namn. I klassen BilImplementation konstrueras två stycken bil-objekt, a och b. Utskriften på rad 5 blir 'Saab Volvo'.
Om klassen Bil utökas framgår 'has a'-klausulen tydligare: En bil har ett namn, en färg och ett värde.
1. public class Bil {
2. private String name;
3. private String color;
4. private int value;
5.
6. public Bil(String n, String c, int v) {
7. name = n;
8. color = c;
9. value = v;
10. }
11.
12. public String getName() {
13. return name;
14. }
15.
16. public String getColor() {
17. return color;
18. }
19.
20. public int getValue() {
21. return value;
22. }
23.
24. public String toString() {
25. return "Namn: " + name + " Färg: " + color + " Värde: " + value;
26. }
27. }
1. public class BetterBilImplementation {
2. public static void main(String[] args ) {
3. Bil a = new Bil("Saab", "Silver", 50000);
4. Bil b = new Bil("Volvo", "Svart", 150000);
5. if (a.getValue() > b.getValue()) {
6. System.out.println(a.getName() + " är värd mest");
7. } else {
8. System.out.println(b.getName() + " är värd mest");
9. }
10. }
11. }
2. private String name;
3. private String color;
4. private int value;
5.
6. public Bil(String n, String c, int v) {
7. name = n;
8. color = c;
9. value = v;
10. }
11.
12. public String getName() {
13. return name;
14. }
15.
16. public String getColor() {
17. return color;
18. }
19.
20. public int getValue() {
21. return value;
22. }
23.
24. public String toString() {
25. return "Namn: " + name + " Färg: " + color + " Värde: " + value;
26. }
27. }
1. public class BetterBilImplementation {
2. public static void main(String[] args ) {
3. Bil a = new Bil("Saab", "Silver", 50000);
4. Bil b = new Bil("Volvo", "Svart", 150000);
5. if (a.getValue() > b.getValue()) {
6. System.out.println(a.getName() + " är värd mest");
7. } else {
8. System.out.println(b.getName() + " är värd mest");
9. }
10. }
11. }
När man bygger objekt brukar man alltid inkludera en toString-metod som returnerar värdet på all data objektet håller, även om det inte har någon nytta för programmet så kan det vara bra för programmeraren för att få ut debug-värden från ett objekt som beter sig konstigt. I BetterBilImplementation används aldrig Bil.getColor() eller Bil.toString(), men metoderna finns i Bil för att någon någon gång kanske skulle vilja ta reda på vilken färg bilen har, eller ta reda på allting om en bil.
När en klass (ett objekt) instansieras med nyckelordet new skapas en ny 'kopia' av den. Med nyckelordet static blir en metod eller variabel inte instansierbar. Det kommer bara finnas en av den oavsett hur många instanser av klassen som finns.
1. public class Ecstatic {
2. private static int x = 0;
3. public Ecstatic() {}
4. }
- [...]
1. Ecstatic e1 = new Ecstatic();
2. Ecstatic e2 = new Ecstatic();
3. e1.x = 100;
4. e2.x = 200;
5. viktigVariabel = e1.x;
- [...]
2. private static int x = 0;
3. public Ecstatic() {}
4. }
- [...]
1. Ecstatic e1 = new Ecstatic();
2. Ecstatic e2 = new Ecstatic();
3. e1.x = 100;
4. e2.x = 200;
5. viktigVariabel = e1.x;
- [...]
Om x inte vore statisk skulle viktigVariabel få värdet 100 på rad 5, men får värdet 200 eftersom e1.x och e2.x är referenser till samma statiska variabel. Eftersom båda objekt pekar på samma variabel är det bättre att referera till den genom att skriva klassnamnet:
- [...]
1. Ecstatic e1 = new Ecstatic();
2. Ecstatic e2 = new Ecstatic();
3. Ecstatic.x = 100; //Varför gjorde jag så här?
4. Ecstatic.x = 200;
5. viktigVariabel = Ecstatic.x;
- [...]
1. Ecstatic e1 = new Ecstatic();
2. Ecstatic e2 = new Ecstatic();
3. Ecstatic.x = 100; //Varför gjorde jag så här?
4. Ecstatic.x = 200;
5. viktigVariabel = Ecstatic.x;
- [...]