[JAVA] Classes

HypNo'' -  
 HypNo' -
Bonsoir,
pouvez-vous m'aider à faire ceci :

1) écrire les classes véhicule ayant les attributs suivants: marque, immatriculation, propriétaire, année et une classe voiture dérivant de la classe Véhicule et ayant les attributs supplémentaire suivants: nb places et la liste des passagers.
2) écrire une classe Point et une classe dérivée Cercle.

Merci.
A voir également:

11 réponses

HypNo'
 
Merci beaucoup Marco, j'ai lu pas mal de sujet depuis et avec tes explications ça m'a beaucoup aidé !!

Sinon oui effectivement mon énoncé se limité à ça. Je vais essayer de proposer une autre question d'un exercice qui est plutôt court, le reste je pense que ce serait abusé...lol

.Soit A une classe java, B une classe dérivée de A et les déclarations suivantes:
A a; B b; A c;

Parmi ces lignes suivantes, lesquelles ne compilent pas?Justifier.

- a=new B();
- b=new A();
- c=(A) new B();

Soit C la classe suivante:

public abstract class C {
public float x;
public C() {x=0;}
public abstract float calculer ();
}

a) L'instanciation suivante: C c1=new C(); est-elle juste? Justifier.
b) Soient D et E deux classes telles que D dérive de C et E dérive de D. Peut-on écrire class E extends D, E {}? Justifier votre réponse.

Je suis conscient que c'est assez long à lire mais je pense que les réponses sont assez rapide.

Les rattrapages sont souvent accès sur le premier examen donc plus je peux en corriger, plus j'ai de chance d'avoir quelque chose qu'y ressemble à ce que j'ai travaillé.

Merci beaucoup!
1
Marco la baraque Messages postés 1030 Statut Contributeur 329
 
Yo !

1) a=new B();
2) b=new A();
3) c=(A) new B();


La première compile sans problème (c'est le cas le plus compliqué en fait). Tu peux toujours utiliser une classe mère (ou une interface quand ta classe implémente l'interface) pour manipuler ton objet. Le mécanisme qui est utilisé est un cast implicite.
Le deuxième ne compile pas. Tu ne peux pas manipuler des super classes dans des classes héritées (à moins de faire un downcast : b = (B) new A(); mais c'est assez rare).
Pas de problème pour la 3ème proposition, en fait c'est le même cas que le cas 1), sauf que le cast est explicite (il est écrit alors que dans le cas 1) il n'est pas écrit mais se fait quand même).


a) L'instanciation suivante: C c1=new C(); est-elle juste? Justifier.
b) Soient D et E deux classes telles que D dérive de C et E dérive de D. Peut-on écrire class E extends D, E {}? Justifier votre réponse.


a) Non l'instanciation n'est pas juste. C étant une classe abstraite, elle ne peux pas être instanciée (si un jour tu as la question "qu'est ce qu'une classe abstraite?" tu peux répondre ça. Après tu peux creuser mais c'est la définition même d'une classe abstraite).

b) Non. Outre le fait que E s'étendrait elle-même (je n'ai jamais essayé mais je pense qu'il est impossible de compiler ça :D), en Java une classe ne peut pas étendre plusieurs classes (pas d'héritage multiple). En revanche, une classe peut implémenter plusieurs interfaces sans problème (exemple: public class E implements Interface1, Interface2 extends D {...})
0
Marco la baraque Messages postés 1030 Statut Contributeur 329
 
Bonsoir,
C'est vraiment pas très dur. Tu es sûr d'avoir essayé de le faire cet exercice?
Donne nous ce que tu as fait, nous t'aiderons en corrigeant tes erreurs où en t'orientant là où tu bloques.

Cordialement
0
HypNo'
 
Bonjour, en fait c'est le premier exercice de mon examen où j'ai eu 1 dans cette matière étant donnée que je n'y connais absolument rien, j'aimerais donc pouvoir le réviser pour mes rattrapages...

public class véhicule {
char marque;
char propriétaire;
int année;

{ class voiture { int nbplaces; char listepass; }
}

}

Voila, ce que je ferais ni connaissant strictement rien...
0
HypNo'
 
Le reste c'est sur les constructeurs, destructeur, mais savoir faire ça me permettrait déjà de gratter 2, 3 points...

Merci c'est demain maintenant !!
0
Marco la baraque Messages postés 1030 Statut Contributeur 329
 
Bonjour,
Je suis au boulot pour l'instant, je n'ai pas le temps. Je t'explique tout ça ce soir.

A tout à l'heure.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
HypNo'
 
Merci beaucoup, je t'attends avec impatience lol, et si possible je te poserais également d'autres questions !!
A+
0
Marco la baraque Messages postés 1030 Statut Contributeur 329
 
Bonsoir,
1) écrire les classes véhicule ayant les attributs suivants: marque, immatriculation, propriétaire, année et une classe voiture dérivant de la classe Véhicule et ayant les attributs supplémentaire suivants: nb places et la liste des passagers.

public class Vehicule {
 private String marque;
 private String immatriculation;
 private Personne proprietaire;
 private int annee,
 
 private List<Personne> passagers;
}

Ce qu'il faut retenir de ce code :
Si ton énoncé se résume à ça il n'est vraiment pas bien car :
-j'ai déclaré mes attributs en private comme on le fait en général, et il n'y a aucune méthode pour y accéder (ce n'était pas demandé), donc en gros ça ne sert à rien car tu ne peux pas lire ni écrire les données.
-il n'est demandé d'écrire aucune méthode, donc c'est pas très intéressant.
-j'ai utilisé une classe Personne pour les passagers et propriétaires, mais sans l'implémenter (ça dépend des informations qu'on souhaite mettre dans cette classe).

Des commentaires sur ce que tu avais fait:

public class véhicule {
char marque;
char propriétaire;
int année;

{ class voiture { int nbplaces; char listepass; }
}

} 

Outre des commentaires de forme (ta classe s'écrit avec une majuscule, sans accents...), marque et propriétaire doivent être des String (char c'est pour un seul caractère donc c'est pas top top. C'est comme en C ou C++ finalement: les char c'est des caractères, et pour avoir une chaine, il faut utiliser un char*, ou un String en java).

Sinon tu peux déclarer des classes dans des autres classes comme tu voulais le faire, mais la syntaxe est différente, d'autant plus que tu n'utilisais pas d'héritage :
public class Vehicule {
 private String marque;
 private String immatriculation;
 private Personne proprietaire;
 private int annee,

 public class Voiture extends Vehicule {
  private int nbPlaces;
  private List<Personne> passagers;
 }
}


En ce qui concerne les constructeurs, la question ne demande pas d'en écrire (quand tu n'as pas de constructeurs dans une classe, java ajoute automatiquement le constructeur sans argument). Quant aux destructeurs, ça n'existe pas en java. C'est le garbage collector qui se charge de tourner en tâche de fond et de désallouer la mémoire qui n'est plus utilisée (tu peux par contre accélérer son processus en mettant tes instances à null quand tu n'en as plus besoin).

2) écrire une classe Point et une classe dérivée Cercle.
Je trouve cette question très bizarre aussi. Moi j'aurais fait l'inverse (un point est un cercle de rayon égal à 0, donc une spécialisation de cercle), là je trouve que ça n'a aucun sens...

public class Point {
 private int abscisse;
 private int ordonnee;
 protected int rayon;

 public Point(int a, int b) {
  this.abscisse = a;
  this.ordonnee = b;
  this.rayon = 0;
 }
 
 public int getAbscisse(){
  return abscisse;
 }

 public void setAbscisse(int a) {
  this.abscisse = a;
 }

  public int getOrdonnee(){
  return ordonnee;
 }

 public void setOrdonnee(int a) {
  this.ordonnee = a;
 }
}

public class Cercle extends Point {
 public Cercle (int a, int b, int rayon) {
  super(a,b);
  this.rayon = rayon;
 }

 public int getRayon() {
  return rayon;
 }
 
 public void setRayon(int rayon) {
  this.rayon = rayon;
 }
}


Les commentaires :
- je t'ai mis des getters et setters pour te montrer à quoi ça ressemble
- je t'ai mis un constructeur prenant des arguments
- j'ai utilisé super pour factoriser du code
- j'ai déclarer "rayon" en protected pour pouvoir l'utiliser dans mes classes filles pour te montrer un exemple de portée. Personnellement je ne fais jamais ça, je préfère avoir un attribut "rayon" propre à ma classe cercle plutôt que de donner accès aux attributs de la classe mère, mais bon...

Si tu as des questions, n'hésite pas.

Cordialement
0
arth Messages postés 10414 Date d'inscription   Statut Contributeur Dernière intervention   1 293
 
Salut ;)

"un point est un cercle de rayon égal à 0" ==> Si tu dis ça à un mathématicien ou à un ingénieur tu vas te faire taper dessus ^^

Très bon ton code tu es développeur non? Enfin moi j'aurais plutôt mis une liste List<String> passagers pour que cela ne l'embrouille pas et comme on ne demande pas des attributs spéciaux aux passagers j'aurais eu l'idée de mettre des String pour les noms.

C'est vrai que faire des classes sans fonctions d'accès c'est pas tip top. Mais pour la base ça peut être pas mal ce type d'exercice.
0
Marco la baraque Messages postés 1030 Statut Contributeur 329
 
Hello,
Un point n'est rien d'autre qu'un cercle ayant un rayon infiniment petit. Ca choquerait peut-être un mathématicien (quoique je suis loin de le penser), mais sûrement pas un ingénieur (un point, physiquement ça n'existe pas).
Je suis moi même ingénieur ;) (et perso ça ne me choque pas).

Je suis d'accord pour la List<String>, mais vu que c'est pour un examen j'imagine qu'il n'est pas perdu parce qu'il a du voir ce genre de trucs en cours, et je voulais surtout montrer qu'on n'est pas obligé de n'utiliser que des types primitifs en attribut.

Le fait qu'il n'y ait pas de fonctions d'accès n'est pas vraiment un problème si la classe servait à quelque chose. Le fait qu'il n'est demandé de n'écrire aucune méthode est assez étrange, ça revient à écrire du code qui ne sert strictement à rien. D'autre part, j'aurais plutôt demandé à écrire l'interface véhicule plutôt qu'une classe, ce serait plus formateur.
0
arth Messages postés 10414 Date d'inscription   Statut Contributeur Dernière intervention   1 293
 
Bah j'en ai fait encore enfin c'était en DUT T&R, mais le Java était quand même limité, donc pas de Vector, List ou autre joyeuseté :)

M'enfin au moins ça a le mérite de former à l'auto-apprentissage :)

Il est vrai qu'un point physiquement n'existe pas, il y en a qui ne devraient pas lire ce sujet alors ça va les bloquer ;)
0
Marco la baraque Messages postés 1030 Statut Contributeur 329
 
De toutes façons en cours tu ne peux pas tout faire. Je pense que l'important est de comprendre les principaux mécanismes objets, comme ça ça peut te servir dans pas mal de langages.
Ensuite, toutes les spécificités du langage, tu les apprends avec la pratique, on ne peut jamais reprocher à un débutant de ne pas connaître toutes les classes de Java :)
0
arth Messages postés 10414 Date d'inscription   Statut Contributeur Dernière intervention   1 293
 
Certes :)
0
HypNo'
 
Merci beaucoup pour votre aide Voici une derniere question après ce sera tout.

1) Soient l'interface Instrument et les classes Vents et Cuivres suivantes:

import java.util.*;
interface Instrument {
void play()
void adjust()
}
class Vents implements Instrument {
public void play(){
System.out.print("Vents.play()");
}
}
class Cuivres extends Vents {
public void play(){
System.out.print("Cuives.play()");
}
public void adjust(){
System.out.print("Cuivres.adjust()";
}
}

a) dite si les définitions des classes sont justes sinon faites les modifications nécessaires.

ps: Pour les destructeurs sa doit surment etre un truc comme ça car sur le net ils disent aussi que ça n'existe pas en Java.
Pour utiliser le destructeur vous devez redéfinir une méthode appelée finalize() publique et qui ne renvoie rien.
ps2: print c'est la même chose que println ???

Merci pour tout !
0
Marco la baraque Messages postés 1030 Statut Contributeur 329
 
Toute classe qui implémente une interface doit forcément fournir une implémentation de chaque méthode définie dans l'interface pour être instanciable. Ce qui n'est pas le cas ici !
En fait ici tu as trois solutions selon moi :
class Vents implements Instrument {
 public void play(){
  System.out.print("Vents.play()");
 } 
 public void adjust(){
  System.out.print("Vents.adjust()");
 }
}
Ensuite aucun problème pour la classe Cuivres qui étend Vents...

La deuxième solution est de déclarer Vents comme classe abstraite : on ne peut pas l'instancier mais on implémente les méthodes de l'interface qu'on veut, et on laisse les autres sans implémentation :
abstract class Vents implements Instrument {
 public void play(){
  System.out.print("Vents.play()");
 } 
 public abstract void adjust();
}
Toujours pas de problème pour la classe Cuivres qui surcharge la méthode play et qui fournit une implémentation à la méthode adjust.
Cependant, Vents étant une classe abstraite elle ne peut pas être instanciée (cependant rien dans l'énoncé n'empêche Vents d'être une classe abstraite).

Enfin, voici la (bonne) solution, c'est-à-dire celle qui a un véritable sens fonctionnel. Les instruments à vent et les instruments à cuivres n'ont pas de lien direct entre eux, la liaison d'héritage (la classe Cuivres qui étend la classe Vents) n'a aucun sens. Par contre, ce sont tout de même des instruments, ils est donc tout à fait possible (et conseillé!) de les faire implémenter l'interface Instruments :
class Vents implements Instrument {
 public void play(){
  System.out.print("Vents.play()");
 } 
 public void adjust(){
  System.out.print("Vents.adjust()");
 }
}

class Cuivres implements Instrument {
 public void play(){
  System.out.print("Cuivres.play()");
 } 
 public void adjust(){
  System.out.print("Cuivres.adjust()");
 }
}


Voilà !

En ce qui concerne la méthode finalize() , une brève recherche sur google m'a éclairé :
La méthode finalize() peut s'occuper de libérer les ressources nécessaires à un objet. Cette méthode est appelée par le ramasse-miettes lorsque l'instance n'est plus nécessaire. Cela peut intervenir bien après la perte de l'objet. Il est préférable de gérer explicitement les ressources par un appel à close(), par exemple lorsqu'un flux n'est plus nécessaire.(http://www.club-java.com/Public/JavaTechno/Fichiers/JAVA/Optimiser.htm)
Je ne connaissais pas cette fonctionnalité (merci donc ;). Mais effectivement elle te permet de libérer les ressources en faisant appel au garbage collector, donc de faire office de destructeur.
C'est une méthode de la classe Object, et comme en Java tous les objets héritent de la classe Object, elle est utilisable par toutes tes instances (tu les castes en Object et tu fais appel à la méthode, ou alors tu surcharges la méthode).

print est une méthode de la classe PrintStream (comme println).
http://java.sun.com/j2se/1.4.2/docs/api/java/io/PrintStream.html
La différence est que println va à la ligne après avoir appelé la méthode toString de ton objet, et pas print.

Bon courage.
0
HypNo'
 
Merci pour tout, c'était rapide et précis, ça fait plaisir d'avoir des forumeurs comme ça lol !

J'espère que demain tout ça m'aidera, bonne nuit!

A+
0