2012-05-18 2 views
3

je le bloc de code suivant:Variables locales, objet références et il est l'allocation de mémoire

class Student{ 

int age;    //instance variable 
String name;  //instance variable 

public Student() 
{ 
    this.age = 0; 
    name = "Anonymous"; 
} 
public Student(int Age, String Name) 
{ 
    this. age = Age; 
    setName(Name); 
} 
public void setName(String Name) 
{ 
    this.name = Name; 
} 
} 

public class Main{ 
public static void main(String[] args) { 
     Student s;       //local variable 
     s = new Student(23,"Jonh"); 
     int noStudents = 1;   //local variable 
} 
} 

Ma question est liée à ce que sont des variables locales, les variables d'instance afin de savoir où ils sont attribués, wether en HEAP ou STACK mémoire. Dans le constructeur par défaut, il semble qu'il n'existe qu'une seule variable locale, celle créée par le mot clé 'this', mais comment 'name = "Anonymous";' n'est pas considéré comme une variable locale? C'est le type d'objet, mais ceux-ci peuvent aussi être des variables locales, correct? En passant, pouvez-vous donner un exemple d'objet créé/instancié avec le constructeur par défaut? Merci!

+1

double possible de [JVM - Stack et Heap] (http://stackoverflow.com/questions/2826222/jvm-heap-and-stack) – Makoto

Répondre

8

En bref, les noms de toute nature seules les références de magasin, ils ne stockent pas les objets directement.

un nom qui est complètement limité à un bloc de code a alloué le stockage de la référence, sur le cadre de pile, qui est sur une pile qui est privée pour le fil.

un nom qui est un membre d'une classe de stockage est allouée pour la référence dans le segment de mémoire, au sein de l'objet qui représente l'instance de cette classe.

un nom qui est un élément statique d'une classe a alloué le stockage de la référence dans le tas, au sein de l'objet qui représente l'instance de l'objet de classe de cette classe.

Tous les objets vivent sur le tas; cependant, les références à ces objets peuvent se trouver dans d'autres objets sur le tas ou dans des espaces réservés de référence sur la pile.

types de données sont stockées toutes les primitives où la référence aurait été stocké.

class Student { 

    int age;   // value stored on heap within instance of Student 
    String name;  // reference stored on heap within instance of Student 

    public Student() { 
    this.age = 0; 
    name = "Anonymous"; 
    } 

    public Student(int Age, String Name) { 
    this.age = Age; 
    setName(Name); 
    } 

    public void setName(String Name) { 
    this.name = Name; 
    } 

} 

public class Main { 
    public static void main(String[] args) { 
     Student s;     // reference reserved on stack 
     s = new Student(23, "John"); // reference stored on stack, object allocated on heap 
     int noStudents = 1;   // value stored on stack 
    } 
} 
+0

Je pense que cela peut être une question vraiment stupide \ doute mais quand vous dites "Un nom qui est un membre d'une classe a alloué le stockage pour la référence dans le tas" qui est le cas de name = "Anonymous"; ? Et le suivant est le cas d'un espace réservé de référence qui réside dans la pile? s = nouvel étudiant (23, "John"); – csbl

+0

Pas une question stupide. Une classe "Anonymous" est une classe, donc elle est allouée sur le tas; cependant, le tas contient des informations qui ne peuvent pas être liées à un type particulier, comme cela a été spécifié à partir d'un type abstrait et d'un code pour remplir les sections abstraites. Parfois, la classe anonyme est liée à un nom, d'autres fois la classe est juste utilisée directement sans un nom intermédiaire; cependant, la classe ne reçoit jamais son propre type de base. –

-1

Toutes les primitives var (int, double, boolean) sont créés sur la pile. Les objets les plus complexes qui ont été alloués avec "nouveau" sont dans le tas et votre variable est simplement une référence à celui-ci (pointeur).

une variable locale est une variable qui existe dans un champ spécifique comme existe « Student s » seulement dans la méthode principale (il peut être soit dans la pile ou dans le tas)

+0

Non, ce n'est pas tout à fait vrai. Vérifiez le lien vers le duplicata. – Makoto