[Java] object gedraagt zich anders na plaatsing in array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • KillerZero86
  • Registratie: Mei 2010
  • Laatst online: 04-10 22:33
Ik heb de volgende 2 java bestanden geschreven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Scanner;
    public class App
    {  
        public static void main(String[] args)
        {   
            Object[] Autos = new Object[20];
            Auto auto = new Auto();
            Scanner in = new Scanner(System.in);
            System.out.print("Voer het merk van de in te voeren auto in:");
            auto.setMerk(in.next());
            in.close();
            Autos[0] = auto;
            System.out.println(Autos[0].merk);
            System.out.println(auto.merk);
        }
    }

En:
code:
1
2
3
4
5
6
7
8
public class Auto
{
    String merk;
    public void setMerk (String n)
    {
        merk = n;
    }
}

Het probleem:
Stel dat ik altijd "Audi" als merk invoer. Dan komen we keurig aan het einde van bestand 1, daar wordt het object auto letterlijk gekopieerd en in array Autos geplaatst, op positie 0. Tot zo ver alles goed.
Nu wil ik merk weer uit gaan lezen en daar begint het probleem, ik mag wel merk achter auto zetten, maar als ik .merk achter Autos[0] zet krijg ik de error dat merk niet is gedefinieerd. Hoe krijg ik toch dat merk uit Autos[0]? Want als ik 20 auto's in ga voeren kan ik niet meer alle merken uitlezen met het commando auto.merk, dan heb ik echt de array nodig.

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Instanties van het type Object hebben geen 'merk' property. Je array is van het type Object[] i.p.v. Auto[].

Namen van variabelen beginnen volgens de Java conventies trouwens met een kleine letter. Dus je array hoort 'autos' te heten i.p.v. 'Autos'. Is er trouwens een bepaalde reden dat je kiest voor een array in plaats van een collectie, zoals een List of een Set?

[ Voor 58% gewijzigd door Herko_ter_Horst op 19-11-2010 23:26 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • KillerZero86
  • Registratie: Mei 2010
  • Laatst online: 04-10 22:33
Ok, kan ik nou toch op de een of andere manier Audi uit Autos[0] halen?

Ik kies voor Array omdat dat moet volgens de opdracht, tis een schoolopdracht.

[ Voor 36% gewijzigd door KillerZero86 op 19-11-2010 23:30 ]


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 03:25

Gerco

Professional Newbie

Wat Herko_ter_Horst zegt. Je hebt de array gedefinieerd als van type Object. De compiler kan dus niet garanderen dat er op autos[0] een auto staat en staat het aanspreken van de merk field niet toe. Als je dat wilt moet je de array van type Auto maken. Dan beloof je de compiler dat je daar alleen Autos in hebt zitten (en zal hij ook niet toestaan dat je er iets anders inzet!).

Voorbeeld:
Java:
1
2
3
4
5
6
Auto[] autos = new Auto[10];
autos[0] = eenofandereauto;

System.out.println(autos[0].merk); // werkt prima

autos[1] = new Object(); // Compile error

[ Voor 20% gewijzigd door Gerco op 19-11-2010 23:36 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Kazu
  • Registratie: Juni 2004
  • Laatst online: 02-10 19:20
Als je met het object uit je array aan de slag wilt alsof het van het type Auto is, dan zul je het moeten casten. Omdat je array van het type Object is, zullen alle opgeslagen objecten ook als zodanig herkend worden.

Java:
1
System.out.println((Auto)Auto[0].merk);


Dit zal dan wel werken, omdat je het object via de haakjes cast naar een Auto object.

PS5 PSN: UnrealKazu


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Je gaat toch geen cast adviseren als de oplossing is om het type van het array aan te passen? :S

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Kazu
  • Registratie: Juni 2004
  • Laatst online: 02-10 19:20
Herko_ter_Horst schreef op vrijdag 19 november 2010 @ 23:33:
Je gaat toch geen cast adviseren als de oplossing is om het type van het array aan te passen? :S
Tenzij er ook nog andere dingen in het array opgeslagen moeten worden. Ik ken de opdracht niet, dus ik bied een alternatief aan ;) Mochten er inderdaad alleen objecten van het type Auto in het array opgeslagen worden dan is het uiteraard handiger om er een Array van het type Auto van te maken.

PS5 PSN: UnrealKazu


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kazu schreef op vrijdag 19 november 2010 @ 23:32:
Java:
1
System.out.println((Auto)Auto[0].merk);


Dit zal dan wel werken, omdat je het object via de haakjes cast naar een Auto object.
Nee, dat zal niet werken, omdat je Auto[0].merk cast, en niet Autos[0]. Even haakjes gebruiken dus. Verder eens met het feit dat dit in dit geval een pruts-oplossing lijkt ;)

[ Voor 23% gewijzigd door .oisyn op 19-11-2010 23:40 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • KillerZero86
  • Registratie: Mei 2010
  • Laatst online: 04-10 22:33
Gerco schreef op vrijdag 19 november 2010 @ 23:26:
Wat Herko_ter_Horst zegt. Je hebt de array gedefinieerd als van type Object. De compiler kan dus niet garanderen dat er op autos\[0] een auto staat en staat het aanspreken van de merk field niet toe. Als je dat wilt moet je de array van type Auto maken. Dan beloof je de compiler dat je daar alleen Autos in hebt zitten (en zal hij ook niet toestaan dat je er iets anders inzet!).

Voorbeeld:
Java:
1
2
3
4
5
6
Auto[] autos = new Auto[10];
autos[0] = eenofandereauto;

System.out.println(autos[0].merk); // werkt prima

autos[1] = new Object(); // Compile error
Bedankt, was niet eens me opgekomen dat je ook gewoon een array aan kunt maken van een zelfgemaakt type. :P . Mijn probleem is nu in ieder geval opgelost.

[ Voor 44% gewijzigd door KillerZero86 op 19-11-2010 23:41 . Reden: verkeerde quote ]


Acties:
  • 0 Henk 'm!

  • Kazu
  • Registratie: Juni 2004
  • Laatst online: 02-10 19:20
.oisyn schreef op vrijdag 19 november 2010 @ 23:40:
[...]

Nee, dat zal niet werken, omdat je Auto\[0].merk cast, en niet Autos\[0]. Even haakjes gebruiken dus. Verder eens met het feit dat dit in dit geval een pruts-oplossing lijkt ;)
Excuseer, inderdaad de haakjes vergeten. En het is misschien niet de meest handige oplossing, maar het geeft wel aan waarom zijn oplossing niet werkt :P In het dagelijks leven zou je dit natuurlijk nooit doen.

Ja, ik ben koppig ;)

PS5 PSN: UnrealKazu


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Kazu schreef op vrijdag 19 november 2010 @ 23:38:
[...]

Tenzij er ook nog andere dingen in het array opgeslagen moeten worden. Ik ken de opdracht niet, dus ik bied een alternatief aan ;) Mochten er inderdaad alleen objecten van het type Auto in het array opgeslagen worden dan is het uiteraard handiger om er een Array van het type Auto van te maken.
Niet heel waarschijnlijk gezien de naam "autos" en de aard van de vraag, of wel? :)

Met zulke adviezen breng je beginners alleen maar in verwarring, omdat ze de "meest waarschijnlijke" niet van de "in theorie ook mogelijke" oplossing kunnen onderscheiden.

[ Voor 3% gewijzigd door Herko_ter_Horst op 19-11-2010 23:48 ]

"Any sufficiently advanced technology is indistinguishable from magic."

Pagina: 1