Pourquoi les méthodes Java statiques ne peuvent-elles pas appeler des méthodes non statiques?

introduction

Nous savons tous que les méthodes non statiques (non statiques) ne peuvent pas être appelées dans des méthodes statiques statiques. Pour être précis, les méthodes non statiques ne peuvent pas être appelées directement. Mais vous pouvez passer la référence d'un objet dans la méthode statique, puis appeler la méthode non statique de l'objet.
En fait, l'application de ce fait est si souvent que nous n'y prêtons pas attention: dans la fonction main (méthode statique), nous créons souvent une instance d'une certaine classe, puis utilisons sa variable de référence pour appeler sa méthode non statique.

class Test2{
    
    
	public void method2(){
    
    
		System.out.println("HelloWorld2");
	}
}
 
class test{
    
    
	public void method0(){
    
    
		System.out.println("HelloWorld0");
	}
	public static void method1(){
    
    
		System.out.println("HelloWorld1");
	}
	
	public static void main(String args[]){
    
    			
		new test().method0(); 
		method1(); 
		new Test2().method2(); 
	}	
}

打印结果:
HelloWorld0
HelloWorld1
HelloWorld2

Pourquoi les méthodes statiques de Java ne peuvent-elles pas appeler des méthodes non statiques?

Cela doit être analysé à partir du mécanisme de mémoire de Java. Premièrement, lorsque vous créez un objet, vous n'ouvrez pas d'abord l'espace mémoire pour l'objet dans le tas, mais utilisez d'abord les méthodes statiques (fonctions statiques avec modification statique) dans la classe. Le code est chargé dans un emplacement appelé la zone de méthode, puis l'objet est créé dans la mémoire du tas. Les méthodes statiques seront donc chargées au fur et à mesure que la classe est chargée. Lorsque vous créez un objet, l'objet existe dans la mémoire du tas. Le mot clé this fait généralement référence à l'objet, mais s'il n'y a pas de nouvel objet, vous pouvez appeler la méthode statique de la classe via le nom de la classe.

Les programmes sont finalement exécutés en mémoire et les variables ne sont accessibles que lorsqu'elles occupent une place en mémoire.

1. Les membres statiques (statique et méthode) de la classe appartiennent à la classe elle-même, la mémoire sera allouée lorsque la classe est chargée, et est directement accessible via le nom de la classe.

2. Les membres non statiques (variables et méthodes) appartiennent à l'objet de la classe, de sorte que la mémoire n'est allouée que lorsque l'objet de la classe est créé (l'instance est créée), puis accédée via l'objet de la classe.

La raison pour laquelle une erreur se produit lors de l'accès à un membre non statique dans un membre statique d'une classe est que le membre statique existe déjà lorsque le membre non statique de la classe n'existe pas. Bien sûr, une erreur se produit lors de l'accès à un élément inexistant en mémoire.

Si la méthode statique peut accéder à la méthode non statique: Premièrement, la méthode statique est que lorsque vous créez un objet, vous placez d'abord la méthode statique dans la zone de méthode du tas avec le fichier de classe. Ce n'est qu'alors qu'un objet sera créé dans le tas. En d'autres termes, la méthode statique existe déjà dans la classe et la méthode non statique n'a pas encore été créée. Si la méthode non statique appelée par la méthode statique n'a pas été créée, une erreur sera signalée.

JVM ne prendra certainement pas ce risque et vous permettra d'appeler une méthode qui n'existe peut-être pas, donc vous signalez simplement une erreur lorsque vous l'appelez pour éviter des problèmes inutiles à l'avenir.

** La variable membre modifiée du mot clé static, la méthode membre n'a rien à voir avec l'objet.

Le contenu de la modification statique est chargé avec le chargement de la classe, et chargé une seule fois.

Il est stocké dans une zone mémoire fixe (zone statique), il peut donc être appelé directement par le nom de la classe.
Il existe de préférence aux objets, il peut donc être partagé par tous les objets.

Static peut être utilisé pour modifier les variables membres et les méthodes membres. Le membre modifié appartient à la classe, pas seulement
à un objet. En d'autres termes, comme il appartient à une classe, il peut être appelé sans créer d'objet, mais peut être appelé directement en utilisant le nom de la classe.

Pour résumer:

Tout d'abord les membres statiques sont initialisés lorsque la classe est chargée, la JVM de CLASSLOADER chargée pour la première fois prend l'initiative d'utiliser load au lieu des membres statiques lors de la création de l'objet, cette nouvelle opération lorsqu'elle est initialisée;
la commande est chargée en premier , Ensuite, initialisez les membres statiques lors du chargement. À ce stade, les membres non statiques ne doivent pas être utilisés avant d'être chargés. Les membres non statiques sont initialisés lorsque l'objet est créé via l'opérateur new après le chargement de la classe. static a alloué de l'espace mémoire, donc il est accessible!
En termes simples: les membres statiques appartiennent à la classe et existent sans générer d'objets. Les membres non statiques doivent être générés pour générer des objets. Par conséquent, les membres statiques ne peuvent pas accéder directement aux membres non statiques.

Parlons des caractéristiques statiques:

1. Charger pendant que la classe se charge

C'est-à-dire que l'électricité statique disparaîtra avec la disparition de la classe, indiquant que le cycle de vie statique est le plus long

2. Donner la priorité à l'existence de l'objet

Pour être clair: statique est l'objet qui existe en premier et qui existe ensuite

3. Partagé par tous les objets

4. Peut être appelé directement par le nom de la classe

La différence entre les variables d'instance et les variables de classe

1. Emplacement de stockage

Les variables de classe existent dans la zone de méthode lorsque la classe est chargée, et les variables d'instance existent dans la mémoire du tas lorsque l'objet de l'objet est créé.

2. Cycle de vie

Les variables de classe ont le cycle de vie le plus long. Elles sont chargées lorsque la "classe" est chargée, disparaissent lorsque la classe disparaît, et les variables d'instance disparaissent lorsque "l'objet" disparaît.

Remarque pour une utilisation statique:

1. Les méthodes statiques ne peuvent accéder qu'aux membres statiques (y compris les variables membres et les méthodes membres)

Les méthodes non statiques peuvent accéder à des méthodes statiques ou non statiques

2. Ce mot-clé et les super-mots ne peuvent pas être définis dans des méthodes statiques

Étant donné que statique a priorité sur les objets, ce mot-clé et les super mots-clés ne peuvent pas apparaître dans les méthodes statiques

3. La fonction principale est statique.

Avantages et inconvénients statiques

Avantages: les données partagées de l'objet sont stockées dans un espace séparé, ce qui permet d'économiser de l'espace. Il n'est pas nécessaire de stocker une copie dans chaque objet, qui peut être directement appelée par le nom de la classe

Inconvénients: le cycle de vie est trop long et l'accès est limité (uniquement statique)


Mise à jour continue ...
Adresse d'apprentissage de référence d'article: https://blog.csdn.net/jiayi_yao/article/details/51346378
Adresse d'apprentissage de référence d'article: https://blog.csdn.net/qq_35499112/article/details/84886871

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44325444/article/details/109273226
conseillé
Classement