专栏首页Java患者Java基础知识(六)--内部类

Java基础知识(六)--内部类

内部类

概述

  • 在类的内部又定义了一个新的类

内部类访问特点

  • 内部类可以直接访问外部类的成员,包括私有.
  • 外部类要访问内部类的成员,必须创建对象
  • 外部类名.内部类名 对象名 = 外部类对象.内部类对象
class Demo1_InnerClass {
 public static void main(String[] args) {
        
  //外部类名.内部类名 = 外部类对象.内部类对象
  Outer.Inner oi = new Outer().new Inner();   //创建内部类对象
  oi.method();

 }
}


class Outer {
 private int num = 10;
 class Inner {
  public void method() {
   System.out.println(num);
  }
 }
}

面试题

要求:使用已知的变量,在控制台输出30,20,10。

class Test1_InnerClass {
 public static void main(String[] args) {
  Outer.Inner oi = new Outer().new Inner();
  oi.show();
 }
}
//要求:使用已知的变量,在控制台输出30,20,10。
//内部类之所以能获取到外部类的成员,是因为他能获取到外部类的引用外部类名.this
class Outer {
 public int num = 10;
 class Inner {
  public int num = 20;
  public void show() {
   int num = 30;
   System.out.println(num);
   System.out.println(this.num);
   System.out.println(Outer.this.num);
  }
 }
}

局部内部类访问局部变量的问题

  • 局部内部类访问局部变量必须用final修饰
public class Test{ 
 public void play() {
  int x=4;
  class InTest{
   public void f() {
    System.out.println(x);
   }
  }
  new InTest().f();
 }
 public static void main(String[] args) {
  Test t=new Test();
  t.play();
  
 }
}

当t.play()方法出栈后,play中的局部变量就会随之销毁,但是我的内部类对象可能仍然存在的(当不再被使用才会被垃圾回收器回收)这时在内部类中访问了局部变量x,但此时的x已经被销毁,形成矛盾.

根本原因 : 内部类的生命周期比局部变量的长

本文分享自微信公众号 - Java患者(gh_3a16ffdedb6a),作者:Zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JAVA集合类基础知识

    把具有相同性质的一类东西汇聚成一个整体,就可以称为集合。一般数据存储结构分为以下几种:

    heasy3
  • Git基础知识(六)

    因为是主线上的bug,所以先切回到主线上去,不过本地的主线可能有点旧了,所以把本地的master分支删掉,然后和远端同步一下之后再从远端把master分支检出

    zx钟
  • [Java面试二]Java基础知识精华部分.

    一枝花算不算浪漫
  • 第30节:Java基础-内部类

    内部类可以直接访问外部类,但是外部类要访问内部类中的成员变量,就必须要创建内部类的对象。

    达达前端
  • Java Concurrent 内部类基础介绍

    看Concurrent包源码时,其中存在大量的内部类使用,所以特地抽出一篇来介绍内部类。内部类其实是Java 经常用到的一个小的知识点。

    邹志全
  • Java基础系列(三十):局部内部类,匿名内部类

    当我们在外围类中定义的内部类仅仅在某个方法中使用了一次,这种情况下,我们就可以选择去使用局部内部类。

    山禾说
  • 房上的猫:java基础知识部分知识点

    1.Java常见的注释有哪些,语法是怎样的?  1)单行注释用//表示,编译器看到//会忽略该行//后的所文本  2)多行注释/* */表示,编译器看到/*时...

    房上的猫
  • Java基础知识讲解(六)嵌套循环

    在一个循环语句内部再嵌套一个或多个循环,称为嵌套循环。while、do-while与for循环可以任意嵌套多层。

    Weaster
  • JAVA基础知识

    Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。 Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。  Java 被设计成允许应用程...

    用户3003813
  • java基础知识

    Vector、Stack、HashTable、ConcurrentHashMap、Properties

    仇诺伊
  • Java--类和对象之基础知识

    SuperHeroes
  • Java 高级开发必修知识---内部类

    Java 内部类分为:   1)成员内部类   2)静态嵌套类   3)方法内部类   4)匿名内部类 ? 内部类的共性 1、内部类仍然是一个独立的类,在编译之...

    房上的猫
  • JAVA基础知识之JAVA的引用类型

              在Java中,除了基本数据类型之外,其它类型都是引用数据类型,比如String类型和自己定义的class类、数组、接口都是引用类型。

    Vance大飞
  • java学习笔记(基础篇)—内部类

    1)位置: 内部类是定义一个类的里面或者一个方法中,或者一个表达式中。 顶层类是定义在package下 2)修饰符:顶层类只能处于public和默认访问级...

    chlinlearn
  • Java基础8:深入理解内部类

    https://h2pl.github.io/2018/04/25/javase8

    黄小斜学Java
  • Java基础知识(五)--抽象类&接口

    用户7386338
  • Java基础系列(二十九):基本内部类

    我们回过头来分析这个类,首先这里的TestListener类位于InnerClassTest类内部,但是这并不意味着每个InnerClassTest类都有一个T...

    山禾说
  • java基础知识01

    正所谓万丈高楼平地起,有了扎实的基础才能进阶更深奥的课程,才能让你后面的走得更轻松,学Java亦是如此!所以千万不能忽略基础的重要性,下面一起来温习一下那些容易...

    贪挽懒月
  • java基础知识02

    1、String字符串: 字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中。用length()方法获取长度。

    贪挽懒月

扫码关注云+社区

领取腾讯云代金券