Type de base et type de référence Type de base : la valeur est stockée dans la table des variables locales, quelle que soit la manière dont vous la modifiez, elle ne modifiera que la valeur du cadre de pile actuel. Une fois la méthode exécutée, aucune modification ne sera effectuée. effectué en dehors de la méthode ; à ce stade, vous devez modifier la couche externe. Les variables doivent renvoyer les affectations actives. Type de données de référence : le pointeur est stocké dans la table des variables locales. Lorsque la méthode est appelée, la référence de copie est poussée sur la pile et l'affectation modifie uniquement la référence de la copie. Cependant, si la valeur de la référence de copie est directement changée et que l'objet de l'adresse de référence est modifié, alors bien entendu l'objet référençant cette adresse en dehors de la méthode sera modifié. (Deux références, la même adresse, toute modification prendra effet sur les deux références en même temps)
public class Test2 { public static void setValue(String str){ str = "ss"; } public static void setValue(Man str){ str = new Man("test"); } public static class Man{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Man(String name) { this.name = name; } @Override public String toString() { return "Man{" + "name='" + name + '\'' + '}'; } } public static void main(String[] args) { String str = "s"; setValue(str); System.out.println(str); Man man = null; setValue(man); System.out.println(man); } }
Comme le montre la pratique de code ci-dessus, le résultat
s null
La raison est que la méthode est Il y a le concept de stack frame lors de l'exécution. Lors du push sur la pile, seuls les paramètres de la méthode push sont des copies des paramètres entrants.
Fonctionnalités avancées Java
Distinguer les types de données à ce stade : types de base et référence types
Type de base : La valeur est stockée dans la table des variables locales, peu importe la façon dont vous la modifiez, elle ne modifiera la valeur du cadre de pile actuel qu'une fois la méthode exécutée. , aucune modification ne sera apportée en dehors de la méthode ; à ce stade, vous devez Pour modifier la variable externe, l'affectation active doit être renvoyée.
Type de données de référence : Le pointeur est stocké dans la table des variables locales Lorsque la méthode est appelée, la référence de copie est poussée sur la pile et l'affectation. ne change que la référence de la copie. Mais si vous changez directement la valeur de la référence de copie et modifiez l'objet de l'adresse de référence, alors bien sûr l'objet référençant cette adresse autre que la méthode sera modifié . (Deux références, la même adresse, toute modification prend effet sur les deux références en même temps)
Par exemple,
public static void setValue(StringBuilder str){ str = new StringBuilder("sss"); } public static void setValue2(StringBuilder str){ str.append("sss"); } public static void main(String[] args) { StringBuilder str = new StringBuilder(); setValue(str); System.out.println(str.toString()); setValue2(str); System.out.println(str.toString()); }
Concernant String, il s'agit essentiellement un tableau de caractères de type final, il ne peut pas être modifié et ne peut recevoir que des valeurs. Lors de la modification des paramètres transmis à la méthode, il s'agit en fait d'un nouvel objet. Vous devez renvoyer et réaffecter les variables externes pour prendre effet sur la référence String externe. .
Vous pouvez comprendre en examinant n'importe quelle méthode du code source String
/** * Returns a string resulting from replacing all occurrences of * {@code oldChar} in this string with {@code newChar}. * <p> * If the character {@code oldChar} does not occur in the * character sequence represented by this {@code String} object, * then a reference to this {@code String} object is returned. * Otherwise, a {@code String} object is returned that * represents a character sequence identical to the character sequence * represented by this {@code String} object, except that every * occurrence of {@code oldChar} is replaced by an occurrence * of {@code newChar}. * <p> * Examples: * <blockquote><pre class="brush:php;toolbar:false"> * "mesquite in your cellar".replace('e', 'o') * returns "mosquito in your collar" * "the war of baronets".replace('r', 'y') * returns "the way of bayonets" * "sparring with a purple porpoise".replace('p', 't') * returns "starring with a turtle tortoise" * "JonL".replace('q', 'x') returns "JonL" (no change) ** * @param oldChar the old character. * @param newChar the new character. * @return a string derived from this string by replacing every * occurrence of {@code oldChar} with {@code newChar}. */ public String replace(char oldChar, char newChar) { if (oldChar != newChar) { int len = value.length; int i = -1; char[] val = value; /* avoid getfield opcode */ while (++i
Les types de référence provoqueront des phénomènes de copie superficielle et de copie profonde .
Articles associés :
Comment modifier des variables en dehors de la portée en JavaScript
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!