2015-09-09 1 views
1

Je viens de commencer à apprendre Java désolé si c'est une question noob mais j'ai traversé chaque ligne de code et je ne comprends pas ce qui ne va pas. Le code provient du livre "Java en 24 heures".Impossible de trouver la variable z (3D Points - Java 24 heures)

Le but du code est de prendre un point 2D et 3D de départ, puis de les déplacer et de les traduire. D'abord, il me demande de faire une classe de points 3D:

package com.java24hours; 

import java.awt.*; 

public class Point3D extends Point 
{ 
    public int z; 

    public Point3D(int x, int y, int z) 
    { 
     super(x,y); 
     this.z = z; 
    } 
    public void move(int x, int y, int z) 
    { 
     this.z = z; 
     super.move(x,y); 
    } 
    public void translate(int x, int y, int z) 
    { 
     this.z += z; 
     super.translate(x,y); 
    } 
} 

Il appelle ensuite pour une classe de testeur qui utilise le Points3D pour se déplacer et traduire les points 3D:

package com.java24hours; 

import java.awt.*; 

class PointTester 
{ 
    public static void main(String[] arguments) 
    { 
     Point location1 = new Point(11,22); 
     Point location2 = new Point3D(7,6,64);  

     System.out.println("The 2D point is at ("+location1.x + "," + location1.y +")"); 

     System.out.println("It's being moved to (4,11)"); 
     location1.move(4,11); 
     System.out.println("The 2D point is now at (" + location1.x + "," + location1.y + ")"); 

     System.out.println("It's now being moved -10 in both the x and y axis"); 
     location1.translate(-10,-10); 
     System.out.println("The 2D point is now at (" + location1.x +"," + location1.y + ")\n"); 

     System.out.println("The 3D point is at (" + location2.x + "," + location2.y + "," + location.z + ")"); 

     System.out.println("It's being moved to (10,22,71)"); 
     location2.move(10,22,71); 
     System.out.println("The 3D point is now at (" + location2.x + "," + location2.y + "," + location2.z + ")"); 

     System.out.println("It's now going to be moved -20 units in the x y and z axis"); 
     location2.translate(-20,-20,-20); 
     System.out.println("It's now at (" + location2.x + "," + location2.y + "," + location2.z + ")"); 
    } 
} 

Cela crée les erreurs suivantes les lignes avec location2.z:

ne peut pas trouver déplacer méthode symbole ne peut pas être appliqué à la méthode des types données ne peuvent pas être translate appliquée à des types donnés

Source est ici: https://www.informit.com/library/content.aspx?b=STY_Java2_24hours&seqNum=140

C'est à peu près ce qu'il devrait me donner (je l'ai changé une partie du libellé):

The 2D point is located at (11, 22) 
    It's being moved to (4, 13) 
The 2D point is now at (4, 13) 
    It's being moved -10 units on both the x and y axes 
The 2D point ends up at (-6, 3) 

The 3D point is located at (7, 6, 64) 
    It's being moved to (10, 22, 71) 
The 3D point is now at (10, 22, 71) 
    It's being moved -20 units on the x, y and z axes 
The 3D point ends up at (-10, 2, 51) 

Je pense que ma confusion est que je déclarai la variable z dans le Point3D class, j'ai créé le newPoint3D qui a accepté trois variables, et puis quand j'essaie d'utiliser la troisième variable plus tard, il ne peut pas le trouver.

Merci

+0

déclarer la variable comme 'Point3D location2'. –

Répondre

1

Vous avez un problème de syntaxe dans votre code parce que vous utilisez location.z au lieu de location2.z

, vous utilisez également Point classe comme référence pour créer un objet de Point3D. Vous ne pouvez pas accéder à la variable z d'une Point classe en raison de concepts Polymorphisme (dans ce que je vous suggère de regarder) comme Point3D hérite de la classe Point et ainsi, la z variable est définie dans la classe Point3D et non la Point.

En conclusion, vous devez instancier votre point 3D comme ci-dessous:

Point3D location2 = new Point3D(7,6,64); 
+0

Bon oeil! C'est la moitié de son problème. –

+0

@WilliamMorrison juste rectifié l'autre moitié;) –

0

Cela se produit parce que vous avez déclaré votre variable location2 comme un point. Son type réel est Point3D, mais vous le référencez comme type Point et donc la variable Point3D z n'est pas visible. (Ceci est un principe fondamental de la programmation orientée objet appelé polymorphisme, mais ne vous inquiétez pas à ce sujet car vous commencez tout juste à apprendre!)

Vous pouvez résoudre ce problème en déclarant votre variable location2 comme Point3D, comme :

Point location1 = new Point(11,22); 

//here's the fixed line of code. 
Point3D location2 = new Point3D(7,6,64); 

//[...] rest of your code 
0

Je suppose que la méthode de base de l » move() de Point accepte deux paramètres.Cependant, vous appelez cette méthode avec trois: location2.move(10,22,71);

Bien sûr, vous savez que le Point contenu dans location2 est en fait un Point3D, mais le compilateur pense qu'il est juste un Point régulier. Changez le type de location2 en Point3D et ça devrait aller.

0

Le problème est cette ligne:

Point location2 = new Point3D(7,6,64); 

Vous avez créé une instance Point3D et affecté à une variable Point. L'objet qui est actuellement dans location2 à ce stade a un champ z, mais puisque vous avez déclaré la variable comme Point ... le compilateur doit supposer qu'il s'agit d'une instance Point, qui n'a pas un champ z.

Par conséquent le compilateur vous indique que location2.z est une erreur de compilation.

Le correctif est la suivante:

Point3D location2 = new Point3D(7,6,64); 

OK, alors pourquoi Java est conçu pour ne pas permettre cela?

Prenons un exemple comme celui-ci:

Point location2 = test ? new Point3D(7,6,64) : new Point(7,6); 
    System.out.println(location2.z); 

Si le compilateur a accepté que, et test était false, ce qui devrait arriver? Dans un langage dynamiquement typé, cela provoquerait une erreur d'exécution car vous avez tenté d'accéder à un champ qui n'existe pas. Mais Java est typé statiquement par conception, ce qui n'est pas acceptable. En fait, Java considère que lorsque vous déclarez une variable de type Point, le code suivant ne peut traiter sa valeur que comme Point.

+0

Toutes les excellentes réponses! Je l'ai fonctionné maintenant! Merci beaucoup pour votre contribution! – dtm247

0

Soit définir 'x' et 'move' au point ou consultez location1 et location2 par Point3D