Modificateurs Java
Le langage Java propose de nombreux modificateurs, qui sont principalement répartis dans les deux catégories suivantes :
Modificateurs d'accès
Modificateurs de non-accès
Les modificateurs sont utilisés pour définir des classes, des méthodes ou des variables, et sont généralement placés au début de l'instruction. Nous utilisons l'exemple suivant pour illustrer?:
public class className { // ... } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] arguments) { // 方法體 }
Modificateur de contr?le d'accès
En Java, les modificateurs de contr?le d'accès peuvent être utilisés pour protéger l'accès aux classes, variables, méthodes et constructeurs. Java prend en charge 4 droits d'accès différents.
La valeur par défaut, également appelée valeur par défaut, est visible dans le même package et n'utilise aucun modificateur.
Privé, spécifié avec le modificateur private, visible au sein de la même classe.
Partagé, spécifié avec le modificateur public, visible par toutes les classes.
Protégé, spécifié avec le modificateur protected, visible par les classes et toutes les sous-classes du même package.
Modificateur d'accès par défaut - n'utilisez aucun mot-clé
Les variables et méthodes déclarées à l'aide du modificateur d'accès par défaut sont visibles par les classes du même package. Les variables de l'interface sont implicitement déclarées comme public static final, et les droits d'accès des méthodes de l'interface sont publics par défaut.
Exemple?:
Comme le montre l'exemple suivant, les variables et les méthodes peuvent être déclarées sans aucun modificateur.
String version = "1.5.1"; boolean processOrder() { return true; }
Modificateur d'accès privé-privé
Le modificateur d'accès privé est le niveau d'accès le plus strict, donc les méthodes, variables et constructeurs déclarés comme privés ne sont accessibles que par la classe à laquelle ils appartiennent. , et les classes et interfaces ne peuvent pas être déclarées privées.
Les variables déclarées comme types d'accès privés ne sont accessibles qu'aux classes externes via les méthodes getter publiques de la classe.
L'utilisation du modificateur d'accès privé est principalement utilisée pour masquer les détails d'implémentation de la classe et protéger les données de la classe.
Les classes suivantes utilisent le modificateur d'accès privé?:
public class Logger { private String format; public String getFormat() { return this.format; } public void setFormat(String format) { this.format = format; } }
Dans l'exemple, la variable de format dans la classe Logger est une variable privée, donc les autres classes ne peuvent pas directement obtenir et définir la valeur de la variable. Afin de permettre à d'autres classes d'exploiter cette variable, deux méthodes publiques sont définies?: getFormat() (renvoie la valeur du format) et setFormat(String) (définit la valeur du format)
Modificateur d'accès public-public
Les classes, méthodes, constructeurs et interfaces déclarés publics sont accessibles par n'importe quelle autre classe.
Si plusieurs classes publiques qui accèdent les unes aux autres sont distribuées dans des packages différents, vous devez importer le package où se trouve la classe publique correspondante. En raison de l'héritage de classe, toutes les méthodes et variables publiques d'une classe peuvent être héritées par ses sous-classes.
Les fonctions suivantes utilisent le contr?le d'accès public?:
public static void main(String[] arguments) { // ... }
La méthode main() du programme Java doit être définie sur public, sinon l'interpréteur Java ne pourra pas exécuter le classe.
Accès protégé modifier-protected
Les variables, méthodes et constructeurs déclarés comme protégés sont accessibles par toute autre classe du même package, ou par les classes d'accès aux sous-classes de différents packages.
Le modificateur d'accès protégé ne peut pas modifier les classes et les interfaces. Les méthodes et les variables membres peuvent être déclarées comme protégées, mais les variables membres et les méthodes membres des interfaces ne peuvent pas être déclarées comme protégées.
Les sous-classes peuvent accéder aux méthodes et variables déclarées par le modificateur Protected, protégeant ainsi les classes non liées de l'utilisation de ces méthodes et variables.
La classe parent suivante utilise le modificateur d'accès protégé et la sous-classe surcharge la méthode openSpeaker() de la classe parent.
class AudioPlayer { protected boolean openSpeaker(Speaker sp) { // 實(shí)現(xiàn)細(xì)節(jié) } } class StreamingAudioPlayer { boolean openSpeaker(Speaker sp) { // 實(shí)現(xiàn)細(xì)節(jié) } }
如果把openSpeaker()方法聲明為private,那么除了AudioPlayer之外的類將不能訪問該方法。如果把openSpeaker()聲明為public,那么所有的類都能夠訪問該方法。如果我們只想讓該方法對其所在類的子類可見,則將該方法聲明為protected。
訪問控制和繼承
請注意以下方法繼承的規(guī)則:
父類中聲明為public的方法在子類中也必須為public。
父類中聲明為protected的方法在子類中要么聲明為protected,要么聲明為public。不能聲明為private。
父類中默認(rèn)修飾符聲明的方法,能夠在子類中聲明為private。
父類中聲明為private的方法,不能夠被繼承。
非訪問修飾符
為了實(shí)現(xiàn)一些其他的功能,Java也提供了許多非訪問修飾符。
static修飾符,用來創(chuàng)建類方法和類變量。
Final修飾符,用來修飾類、方法和變量,final修飾的類不能夠被繼承,修飾的方法不能被繼承類重新定義,修飾的變量為常量,是不可修改的。
Abstract修飾符,用來創(chuàng)建抽象類和抽象方法。
Synchronized和volatile修飾符,主要用于線程的編程。
Static修飾符
靜態(tài)變量:
Static關(guān)鍵字用來聲明獨(dú)立于對象的靜態(tài)變量,無論一個(gè)類實(shí)例化多少對象,它的靜態(tài)變量只有一份拷貝。 靜態(tài)變量也被成為類變量。局部變量能被聲明為static變量。
靜態(tài)方法:
Static關(guān)鍵字用來聲明獨(dú)立于對象的靜態(tài)方法。靜態(tài)方法不能使用類的非靜態(tài)變量。靜態(tài)方法從參數(shù)列表得到數(shù)據(jù),然后計(jì)算這些數(shù)據(jù)。
對類變量和方法的訪問可以直接使用classname.variablename和classname.methodname的方式訪問。
如下例所示,static修飾符用來創(chuàng)建類方法和類變量。
public class InstanceCounter { private static int numInstances = 0; protected static int getCount() { return numInstances; } private static void addInstance() { numInstances++; } InstanceCounter() { InstanceCounter.addInstance(); } public static void main(String[] arguments) { System.out.println("Starting with " + InstanceCounter.getCount() + " instances"); for (int i = 0; i < 500; ++i){ new InstanceCounter(); } System.out.println("Created " + InstanceCounter.getCount() + " instances"); } }
以上實(shí)例運(yùn)行編輯結(jié)果如下:
Started with 0 instances Created 500 instances
Final修飾符
Final變量:
Final變量能被顯式地初始化并且只能初始化一次。被聲明為final的對象的引用不能指向不同的對象。但是final對象里的數(shù)據(jù)可以被改變。也就是說final對象的引用不能改變,但是里面的值可以改變。
Final修飾符通常和static修飾符一起使用來創(chuàng)建類常量。
實(shí)例:
public class Test{ final int value = 10; // 下面是聲明常量的實(shí)例 public static final int BOXWIDTH = 6; static final String TITLE = "Manager"; public void changeValue(){ value = 12; //將輸出一個(gè)錯(cuò)誤 } }
Final方法
類中的Final方法可以被子類繼承,但是不能被子類修改。
聲明final方法的主要目的是防止該方法的內(nèi)容被修改。
如下所示,使用final修飾符聲明方法。
public class Test{ public final void changeName(){ // 方法體 } }
Final類
Final類不能被繼承,沒有類能夠繼承final類的任何特性。
實(shí)例:
public final class Test { // 類體 }
Abstract修飾符
抽象類:
抽象類不能用來實(shí)例化對象,聲明抽象類的唯一目的是為了將來對該類進(jìn)行擴(kuò)充。
一個(gè)類不能同時(shí)被abstract和final修飾。如果一個(gè)類包含抽象方法,那么該類一定要聲明為抽象類,否則將出現(xiàn)編譯錯(cuò)誤。
抽象類可以包含抽象方法和非抽象方法。
實(shí)例:
abstract class Caravan{ private double price; private String model; private String year; public abstract void goFast(); //抽象方法 public abstract void changeColor(); }
抽象方法
抽象方法是一種沒有任何實(shí)現(xiàn)的方法,該方法的的具體實(shí)現(xiàn)由子類提供。抽象方法不能被聲明成final和strict。
任何繼承抽象類的子類必須實(shí)現(xiàn)父類的所有抽象方法,除非該子類也是抽象類。
如果一個(gè)類包含若干個(gè)抽象方法,那么該類必須聲明為抽象類。抽象類可以不包含抽象方法。
抽象方法的聲明以分號(hào)結(jié)尾,例如:public abstract sample();
實(shí)例:
public abstract class SuperClass{ abstract void m(); //抽象方法 } class SubClass extends SuperClass{ //實(shí)現(xiàn)抽象方法 void m(){ ......... } }
Synchronized修飾符
Synchronized關(guān)鍵字聲明的方法同一時(shí)間只能被一個(gè)線程訪問。Synchronized修飾符可以應(yīng)用于四個(gè)訪問修飾符。
實(shí)例:
public synchronized void showDetails(){ ....... }
Transient修飾符
序列化的對象包含被transient修飾的實(shí)例變量時(shí),java虛擬機(jī)(JVM)跳過該特定的變量。
該修飾符包含在定義變量的語句中,用來預(yù)處理類和變量的數(shù)據(jù)類型。
實(shí)例:
public transient int limit = 55; // will not persist public int b; // will persist
volatile修飾符
Volatile修飾的成員變量在每次被線程訪問時(shí),都強(qiáng)迫從共享內(nèi)存中重讀該成員變量的值。而且,當(dāng)成員變量發(fā)生變化時(shí),強(qiáng)迫線程將變化值回寫到共享內(nèi)存。這樣在任何時(shí)刻,兩個(gè)不同的線程總是看到某個(gè)成員變量的同一個(gè)值。一個(gè)volatile對象引用可能是null。
實(shí)例:
public class MyRunnable implements Runnable { private volatile boolean active; public void run() { active = true; while (active) // line 1 { // 代碼 } } public void stop() { active = false; // line 2 } }
一般地,在一個(gè)線程中調(diào)用run()方法,在另一個(gè)線程中調(diào)用stop()方法。如果line 1中的active位于緩沖區(qū)的值被使用,那么當(dāng)把line 2中的active設(shè)置成false時(shí),循環(huán)也不會(huì)停止。
?以上就是【java教程】Java修飾符的內(nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(www.miracleart.cn)!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Java prend en charge la programmation asynchrone, y compris l'utilisation de la transition complète, des flux réactifs (tels que ProjectActor) et des threads virtuels dans Java19. 1.COMPLETABLEFUTURE Améliore la lisibilité et la maintenance du code à travers les appels de cha?ne et prend en charge l'orchestration des taches et la gestion des exceptions; 2. ProjectAacteur fournit des types de mono et de flux pour implémenter une programmation réactive, avec mécanisme de contre-pression et des opérateurs riches; 3. Les fils virtuels réduisent les co?ts de concurrence, conviennent aux taches à forte intensité d'E / S et sont plus légères et plus faciles à développer que les fils de plate-forme traditionnels. Chaque méthode a des scénarios applicables, et les outils appropriés doivent être sélectionnés en fonction de vos besoins et les modèles mixtes doivent être évités pour maintenir la simplicité

En Java, les énumérations conviennent à représenter des ensembles constants fixes. Les meilleures pratiques incluent: 1. Utilisez ENUM pour représenter l'état fixe ou les options pour améliorer la sécurité et la lisibilité des types; 2. Ajouter des propriétés et des méthodes aux énumérations pour améliorer la flexibilité, telles que la définition des champs, des constructeurs, des méthodes d'assistance, etc.; 3. Utilisez Enuummap et Enumset pour améliorer les performances et la sécurité des types car ils sont plus efficaces en fonction des tableaux; 4. évitez l'abus des énumérations, tels que des valeurs dynamiques, des changements fréquents ou des scénarios logiques complexes, qui doivent être remplacés par d'autres méthodes. L'utilisation correcte de l'énumération peut améliorer la qualité du code et réduire les erreurs, mais vous devez faire attention à ses limites applicables.

Javanio est un nouvel IOAPI introduit par Java 1.4. 1) s'adresse aux tampons et aux canaux, 2) contient des composants de tampon, de canal et de sélecteur, 3) prend en charge le mode non bloquant et 4) gère les connexions simultanées plus efficacement que l'OI traditionnel. Ses avantages se reflètent dans: 1) IO non bloquant les réductions de la surcharge du thread, 2) le tampon améliore l'efficacité de transmission des données, 3) le sélecteur réalise le multiplexage et 4) la cartographie de la mémoire accélère la lecture et l'écriture de la lecture de fichiers. Remarque Lorsque vous utilisez: 1) le fonctionnement FLIP / clair du tampon est facile à confondre, 2) les données incomplètes doivent être traitées manuellement sans blocage, 3) l'enregistrement du sélecteur doit être annulé à temps, 4) Nio ne convient pas à tous les scénarios.

HashMap implémente le stockage de paires de valeurs clés via des tables de hachage en Java, et son noyau réside dans les emplacements de données de positionnement rapidement. 1. Utilisez d'abord la méthode HashCode () de la clé pour générer une valeur de hachage et la convertir en un index de tableau via les opérations de bit; 2. Différents objets peuvent générer la même valeur de hachage, entra?nant des conflits. à l'heure actuelle, le n?ud est monté sous la forme d'une liste liée. Après JDK8, la liste liée est trop longue (longueur par défaut 8) et elle sera convertie en arbre rouge et noir pour améliorer l'efficacité; 3. Lorsque vous utilisez une classe personnalisée comme clé, les méthodes equals () et hashcode () doivent être réécrites; 4. Hashmap élargit dynamiquement la capacité. Lorsque le nombre d'éléments dépasse la capacité et se multiplie par le facteur de charge (par défaut 0,75), se développez et remaniez; 5. Hashmap n'est pas en file et concu doit être utilisé dans multithread

Les énumérations Java représentent non seulement des constantes, mais peuvent également encapsuler le comportement, transporter des données et implémenter des interfaces. 1. L'énumération est une classe utilisée pour définir des instances fixes, telles que la semaine et l'état, ce qui est plus s?r que les cha?nes ou les entiers; 2. Il peut transporter des données et des méthodes, telles que passer des valeurs à travers les constructeurs et fournir des méthodes d'accès; 3. Il peut utiliser Switch pour gérer différentes logiques, avec une structure claire; 4. Il peut implémenter des interfaces ou des méthodes abstraites pour faire des comportements différenciés de différentes valeurs d'énumération; 5. Faites attention à éviter les abus, la comparaison du code dur, la dépendance à l'égard des valeurs ordinales et la dénomination raisonnable et la sérialisation.

Le modèle de conception Singleton en Java garantit qu'une classe n'a qu'une seule instance et fournit un point d'accès global via des constructeurs privés et des méthodes statiques, ce qui convient au contr?le de l'accès aux ressources partagées. Les méthodes de mise en ?uvre incluent: 1. Chargement paresseux, c'est-à-dire que l'instance n'est créée que lorsque la première demande est demandée, ce qui convient aux situations où la consommation de ressources est élevée et pas nécessairement requise; 2. Traitement à filetage, garantissant qu'une seule instance est créée dans un environnement multi-thread par des méthodes de synchronisation ou le verrouillage à double vérification et la réduction de l'impact des performances; 3. Le chargement affamé, qui initialise directement l'instance pendant le chargement des cours, convient aux objets ou scénarios légers qui peuvent être initialisés à l'avance; 4. La mise en ?uvre de l'énumération, en utilisant l'énumération Java pour soutenir naturellement la sérialisation, la sécurité des filetages et prévenir les attaques réfléchissantes, est une méthode concise et fiable recommandée. Différentes méthodes de mise en ?uvre peuvent être sélectionnées en fonction des besoins spécifiques

Facultatif peut clairement exprimer les intentions et réduire le bruit du code pour les jugements nuls. 1. Facultatif. Par exemple, lors de la prise de valeurs des cartes, Orelse peut être utilisée pour fournir des valeurs par défaut, afin que la logique soit plus claire et concise; 2. Utilisez des cartes d'appels de cha?ne pour atteindre les valeurs imbriquées pour éviter en toute sécurité le NPE, et terminer automatiquement si un lien est nul et renvoie la valeur par défaut; 3. Le filtre peut être utilisé pour le filtrage conditionnel, et les opérations ultérieures ne continueront à être effectuées que si les conditions sont remplies, sinon elle sautera directement à Orelse, qui convient au jugement commercial léger; 4. Il n'est pas recommandé de surutiliser facultatif, tels que des types de base ou une logique simple, ce qui augmentera la complexité, et certains scénarios reviendront directement à NU.

La solution de contournement principale pour la rencontre de Java.io.NotSerializableException est de s'assurer que toutes les classes qui doivent être sérialisées implémentent l'interface sérialisable et de vérifier le support de sérialisation des objets imbriqués. 1. Ajouter des ouvrages ImplementSerialisables à la classe principale; 2. Assurez-vous que les classes correspondantes de champs personnalisées de la classe implémentent également sérialisables; 3. Utilisez transitoire pour marquer les champs qui n'ont pas besoin d'être sérialisés; 4. Vérifiez les types non sérialisés dans les collections ou les objets imbriqués; 5. Vérifiez quelle classe n'implémente pas l'interface; 6. Considérez la conception de remplacement pour les classes qui ne peuvent pas être modifiées, telles que la sauvegarde des données clés ou l'utilisation de structures intermédiaires sérialisables; 7. Envisagez de modifier
