Classes internes en Java, questions d'entrevue communes pour les ingénieurs de développement Java

Harmonios Learning 2021-11-25 19:22:57
classes internes en java questions

public class Parcel{

class Contents{

private int i = 11;

public int value(){ return i;}

}

public Contents contents(){

return new Contents();

}

public static void main(String[] args){

Parcel p = new Parcel();

Parcel.Contents c = p.contents();

}

}

En fait, l'utilisation de classes internes n'est pas différente de l'utilisation de classes ordinaires,Mais parce que les classes internes sont imbriquées dans les classes,Nous pouvons définir une méthode dans une classe externe pour renvoyer une référence dans une classe interne.Si vous voulez créer un objet d'une classe interne à partir d'un endroit autre que la méthode non statique de la classe externe,Alors ça doit être comme dansmain()C'est comme ça.,Spécifiez le type d'objet:OuterClassName.InnerClassName

1.2 Lien vers une classe externe

L'intérieur ressemble à un simple schéma de dissimulation de noms et d'organisation de codes;Quand un objet d'une classe interne est généré,Il y a un lien entre cet objet et l'objet périphérique qui l'a fait,Alors...Il a accès à tous les membres de son objet périphérique,Sans conditions particulières.

Les classes internes ont également accès à tous les membres de leurs classes périphériques,Un objet d'une classe interne ne peut être créé que s'il est associé à un objet de sa classe périphérique.Lors de la construction d'un objet de classe interne,Nécessite une référence à son objet de classe périphérique,Si le compilateur n'accède pas à cette référence, une erreur est signalée.

1.3 Générer une référence à un objet de classe externe

Si vous devez générer une référence à un objet de classe externe,Vous pouvez utiliser le nom de la classe externe juste après .this.Les références qui en résultent ont automatiquement le bon type,Ceci est connu et vérifié au moment de la compilation,Donc il n'y a pas de frais généraux d'exécution.

Deux façons d'utiliser les classes internes à l'extérieur:

1.3.1 Définir une méthode dans une classe périphérique,La méthode renvoie un objet de la classe interne,La méthode est:publicDe

public class DotThis{

void f(){

System.out.println(“DotThis.f()”);

}

public class Inner{

public DotThis outer(){

return DotThis.this;

}

}

public Inner inner(){

return new Inner();

}

public static void main(String[] args){

Dot

《Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Notes d'apprentissage pour le développement de l'arrière - plan+La dernière vidéo d'architecture+Document d'information sur le code source du projet en direct》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 Partage open source du contenu complet

This dt = new DotThis();

DotThis.Inner dti = dt.inner();

dti.outer().f();

}

}

1.3.2 Obtenir un objet de classe interne avec un objet de classe externe

Parfois, vous voudrez peut - être dire à quelqu'un d'autre,Pour créer un objet avec l'une de ses classes internes.Pour ce faire,Vous deveznewUne référence à un autre objet de classe externe est fournie dans l'expression,Il faut utiliser .newSyntaxe:

public class DotNew{

public class Inner{}

public static void main(String[] args){

DotNew dn = new DotNew();

DotNew.Inner dni = dn.new Inner();

}

}

Pour créer directement un objet de classe interne,Impossible de faire référence au nom d'une classe externeDotNew,Au lieu de cela, vous devez utiliser un objet de classe externe pour créer cet objet de classe interne.Cela résout également le problème de la portée interne des noms de classe,Vous n'avez donc pas à déclarer,dn.new DotNew.Inner().

Il n'est pas possible de créer un objet de classe interne avant d'avoir un objet de classe externe.C'est parce que l'objet de classe interne se connecte secrètement à l'objet de classe externe qui l'a créé.Mais,Si vous créezClasses imbriquées(Classe interne statique),Il n'a donc pas besoin d'une référence à un objet de classe externe.

1.4 Classe interne et transition vers le Haut

Lorsque vous convertissez une classe interne en sa classe de base,Surtout quand on se transforme en interface,Les classes internes ont leur place.C'est parce que cette classe interne–Implémentation d'une interface–Peut être complètement invisible,Et non disponible.Tout ce que vous obtenez est une référence à la classe de base ou à l'interface,Il est donc facile de cacher les détails de la mise en œuvre.

public interface Destination{

String readLabel();

}

public interface Contents{

int value();

}

MaintenantContentsEtDestinationReprésente l'interface disponible pour le programmeur client.Quand on obtient une référence à la classe de base ou à l'interface,Il n'est peut - être même pas possible de trouver le type exact:

class Parcel{

private class PContents implements Contents{

private int i =11;

public int value(){return i;}

}

protected class PDestination implements Destination{

private String label;

private PDestination(String whereTo){

label = whereTo;

}

public String readLabel(){ return label;}

}

public Destination destination(String s){

return new PDestination(s);

}

public Contents contents(){

return new PContents();

}

}

public class TestParcel{

public static void main(String[] args){

Parcel p = new Parcel();

Contents c = p.contents();

Destination d = p.destination(“Tasmania”);

}

}

ParcelQuelque chose de nouveau a été ajouté:Catégorie internePContents- Oui.private,Donc, à partParcel,Personne n'y a accès.PDestination- Oui.protected,Alors seulementParcelEt ses sous - classes、Et avecParcelLes classes du même paquet sont accessiblesPDestination,Aucune autre classe n'est accessiblePDestination.Cela signifie,Si le programmeur client veut connaître ou accéder à ces membres,C'est limité.

privateLes classes internes offrent un moyen aux concepteurs de classes,De cette façon, tout codage dépendant du type peut être entièrement organisé,Et cache complètement les détails de la mise en œuvre.En outre,Du point de vue du programmeur client,En raison de l'impossibilité d'accéder à tout nouveau、Une méthode qui n'était pas une interface publique,Donc l'interface d'extension n'a aucune valeur.C'est aussi pourJavaLe compilateur offre la possibilité de générer un code plus efficace.

 Classification interne des classes


L'utilisation de classes internes a été brièvement décrite ci - dessus,À l'exception d'une classe interne qui existe en tant que membre d'une classe externe(Classe interne des membres)Il existe d'autres formes de classes internes:Classe interne locale、Classe interne anonyme

2.1 Classe interne locale

InJavaMoyenne,Les classes internes peuvent être définies dans une méthode ou dans n'importe quel champ d'application.Deux raisons de le faire:

  • 1.Un type d'interface est implémenté,Vous pouvez alors créer et retourner une référence à.

  • 2.Un problème complexe doit être résolu,Vous voulez créer une classe pour aider avec la solution,Mais je ne veux pas que cette classe soit publique.

Créer une classe complète dans le champ d'application de la méthode,Ça s'appelleClasse interne locale

public class Parcel5{

interface Destination{}

public Destination destination(String s){

class PDestination implements Destination {

private String label;

private PDestination(String whereTo) {

label = whereTo;

}

public String readLabel(){return label;}

}

return new PDestination(s);

}

public static void main(String[] args) {

Parcel5 p = new Parcel5();

Destination d = p.destination(“Tasmania”);

}

}

Intégrer une classe interne dans n'importe quel champ d'application:

public class Parcel6 {

private void internalTracking(boolean b){

if(b){

class TrackingSlip{

private String id;

TrackingSlip(String s){

id=s;

}

String getSlip(){return id;}

}

TrackingSlip ts=new TrackingSlip(“slip”);

String s=ts.getSlip();

}

}

public void track(){

internalTracking(true);

}

public static void main(String[] args) {

Parcel6 p=new Parcel6();

p.track();

}

}

Quand on a besoin d'un constructeur nommé,Ou nous utilisons des classes internes locales lorsque nous avons besoin de surcharger le constructeur,Au lieu d'utiliser des classes internes anonymes,Parce que les classes internes anonymes ne peuvent être utilisées que pour l'initialisation de l'Instance.Quand nous avons besoin de plus d'un objet de cette classe interne,Utilisez également des classes internes locales.

La classe interne locale ne peut pas avoir de spécificateur d'accès,Parce qu'il ne fait pas partie de la classe périphérique;Mais il peut accéder aux constantes dans le bloc de code actuel,Et tous les membres de la Sous - classe.Le nom de la classe interne locale n'est pas visible en dehors de la méthode.

2.2 Classe interne anonyme

public class Parcel {

interface Contents {}

// class MyContents implements Contents {

// private int i=11;

// public int value(){return i;}

// }

public Contents contents() {

return new Contents() {

private int i = 11;

public int value() {return i;}

};

// return new MyContents();

}

public static void main (String[]args){

Parcel p = new Parcel();

Contents c = p.contents();

}

}

Créer un héritage deContentsObjet de la classe anonyme de,Dans cette classe interne anonyme,Le constructeur par défaut a été utilisé pour générerContents.Si vous définissez une classe interne anonyme,Et veut qu'il utilise un objet défini en dehors de lui,Le compilateur demandera alors que ses arguments soientfinalDe.Sinon,Le compilateur signalera une erreur.Si ce n'est que le constructeur de la classe de base passée à la classe anonyme,Il n'est donc pas nécessaire de définir le paramètre formel entrant commefinal.(La classe interne anonyme n'a pas de constructeur,Ne peut être remplacé que par une Instanciation.)

2.3 Classes imbriquées

Si vous n'avez pas besoin d'une connexion entre un objet de classe interne et son objet de classe périphérique,La classe interne peut alors être déclarée commestatic.Ça s'appelleClasses imbriquées.Un objet de classe interne normal contient implicitement une référence,Pointez vers l'objet de classe périphérique qui l'a créé.Et pourtant,Quand la classe interne eststaticQuand,Ce sera différent.Les classes imbriquées signifient:

  • 1.Objet pour créer une classe imbriquée,Objet dont la classe périphérique n'est pas requise

  • 2.Impossible d'accéder à un objet de classe périphérique non statique à partir d'un objet de classe imbriqué

Il y a une autre différence entre les classes imbriquées et les classes internes ordinaires,Champs et méthodes pour les classes internes ordinaires,Ne peut être placé qu'au niveau externe de la classe,Alors...Une classe interne normale ne peut pas avoirstaticDonnées etstaticChamp,Ne peut pas non plus contenir de classes imbriquées.

Classe à l'intérieur de l'interface:

Dans des conditions normales,Aucun Code ne peut être placé à l'intérieur de l'interface,Mais les classes imbriquées peuvent faire partie de l'interface.Toute classe que vous mettez dans l'interface est automatiquementpublicEtstaticDe.Parce que la classe eststaticDe,Placez simplement la classe imbriquée dans l'espace de noms de l'interface,Cela ne viole pas les règles de l'interface.Vous pouvez même implémenter ses interfaces périphériques dans une classe interne:

public interface ClassInInterface{

void howdy();

class Test implements ClassInInterface{

public void howdy(){

System.out.print(“Howdy!”);

public static void main(String[] args){

new Test().howdy();

}

}

Si vous voulez créer un code public,De sorte qu'ils puissent être partagés par toutes les différentes implémentations d'une interface,Il est donc pratique d'utiliser des classes imbriquées à l'intérieur de l'interface.

Deux utilisations efficaces des classes imbriquées:

  • 1.L'implémentation de chaque interface d'implémentation de classe nécessite une partie du code commun

  • 2.RemplacermainMéthodes pour tester chaque classe

Enfin

Enfin,Points saillants:

  • 1. Faites attention à ce qui est écrit sur votre CV,Assurez - vous de bien connaître le contenu de votre CV.Parce qu'en général,,L'intervieweur vous demandera sur votre CV; Il est également très important d'avoir un projet avec un comptoir,C'est probablement là que l'intervieweur pose beaucoup de questions,Alors, avant l'entrevue, passez en revue vos projets;
  • 2. Parler aux intervieweurs des bases comme l'utilisation des modèles de conception、Utilisation de multithreads, etc,Vous pouvez combiner des scénarios de projet spécifiques ou comment vous les utilisez en temps normal;
  • 3. Soyez conscient de votre propre Open SourceGithubProjets,L'intervieweur pourrait creuser votreGithubQuestions relatives au projet;

Personnellement, j'a I l'impression que l'entrevue est aussi un nouveau voyage,La défaite et la victoire sont courantes.Alors...,Ne vous laissez pas décourager par l'échec de l'entrevue、Perte de courage.Et ne vous contentez pas de passer l'entrevue,Ce qui vous attend sera un avenir meilleur,Continue.!

Les réponses aux questions ci - dessus ont été compilées dans les documents d'entrevue,Les réponses sont détaillées dans le document,Et d'autres questions d'entretien d'usine.

Réponse à l'entrevue

JavaClasse interne en,java Questions d'entrevue courantes pour les ingénieurs en développement _Java

JavaClasse interne en,java Questions d'entrevue courantes pour les ingénieurs en développement _Interview_02

JavaClasse interne en,java Questions d'entrevue courantes pour les ingénieurs en développement _Interview_03

Cet article a été publié par CODINGProjet Open Source:【Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Résumé de base notes d'étude+Dernière vidéo d'explication+Code source du projet opérationnel】Inclus

版权声明
本文为[Harmonios Learning]所创,转载请带上原文链接,感谢
https://javamana.com/2021/11/20211125191813936r.html

  1. Fonction de flèche JavaScript
  2. JavaScript - déconstruction assignations
  3. Building CentOS 7.6 with Linux
  4. JavaScript - type d'emballage
  5. linux deepin/ubuntu安装flameshot火焰截图
  6. JavaScript - encapsulation et héritage (deux)
  7. JavaScript JS method for writing 99 multiplication table
  8. 從零開始學java - 第二十五天
  9. Apprendre Java à partir de zéro - jour 25
  10. Les voitures d'hiver, les voitures électriques et les voitures à essence ne sont pas les mêmes?
  11. JavaScript - ceci pointe vers le problème
  12. Copie JavaScript
  13. Spring boot quickly integrates swagger
  14. linux deepin/ubuntu安裝flameshot火焰截圖
  15. Capture d'écran de flamme de l'installateur de flamme Linux deepin / Ubuntu
  16. Jquery DOM et jquery, fonctions d'entrée (bases)
  17. Méthode d'instance jquery
  18. Méthode et démonstration de code dans l'interface de liste en Java
  19. 【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )
  20. Démarrage du Zookeeper
  21. Java oom Cognition
  22. Java 开发者最困惑的四件事,值得一看!,BAT面试文档
  23. Java 将两个对象list里面的 某个字段值抽取到一个list里,java选择排序原理
  24. Java 多线程 —— 生产者消费者问题,从基础到深入案例
  25. Java 中设计模式 之 工厂模式,java反射机制的底层原理
  26. 【錯誤記錄】Java 中 ArrayList 排序 ( 使用 Comparator 接口時注意 compare 返回值是 -1 和 +1 )
  27. 【 enregistrement des erreurs 】 tri ArrayList en Java (Notez que les valeurs de retour de comparaison sont - 1 et + 1 lors de l'utilisation de l'interface de comparaison)
  28. Pourquoi Xiaopeng P5 est - il devenu un grand succès dans le cercle? Le Salon de l'automobile de Guangzhou montre encore des compétences polyvalentes
  29. Java 開發者最困惑的四件事,值得一看!,BAT面試文檔
  30. Les quatre choses les plus déroutantes pour les développeurs Java valent la peine d'être regardées! Document d'entrevue sur les MTD
  31. k8s-Pod污点与容忍
  32. k8s-Pod污点与容忍
  33. K8s POD Contamination and Tolerance
  34. K8s POD Contamination and Tolerance
  35. mysql常用语句——GROUP BY和HAVING
  36. Spring boot quickly integrates swagger
  37. mysql常用語句——GROUP BY和HAVING
  38. MySQL Common statements - group by and having
  39. Le défi du pinceau leetcode - Javascript: 110. Arbre binaire équilibré
  40. [notes d'apprentissage de première ligne] day44: XMLHttpRequest
  41. java调用RFC延长调用时间
  42. java調用RFC延長調用時間
  43. Java call RFC prolonge le temps d'appel
  44. Le modèle d'usine du modèle de conception en Java, le principe sous - jacent du mécanisme de réflexion Java
  45. Java Multithreading - producer Consumer issues, From Basic to Deep case
  46. OushuDB 安装与升级之安装 HDFS
  47. OushuDB 安装与升级之安装 Zookeeper
  48. Java-String-对象,你真的了解了吗?,mysql教程入门到精通
  49. Linux引导过程与服务控制
  50. Java-8新特性:学习如何使用Lambda表达式(一,线程池的实现原理
  51. Java 读写锁 ReentrantReadWriteLock 源码分析,headfirstjavapdf百度云
  52. JAVA 获取系统日期时间,初级java开发常见的面试题
  53. MySQL judges the salary changes based on the existing data
  54. k8s-Pod污點與容忍
  55. Java extrait une valeur de champ de deux listes d'objets dans une liste, et Java sélectionne le principe de tri
  56. java中ArrayList应用实例,阿里巴巴java面试流程
  57. Java个人技术知识点总结(框架篇),kafka聊天服务器架构
  58. JavaWeb快速入门--Servlet(2),java程序设计精编教程第三版上机实践
  59. JavaWeb - 文件的上传,核心API的使用,文件下载,附学习笔记 面试整理 进阶书籍
  60. Netty原理:pipeline