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

本文介绍了Java中的内部类及其访问特点,包括外部类如何访问内部类成员。通过示例展示了如何在控制台输出30, 20, 10,并解释了局部内部类访问局部变量需用final修饰的原因。同时提供了Java学习资源和面试题福利。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信公众号: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修饰

    • 局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么

      因为当调用这个方法时,局部变量如果没有用final修饰,他的声明周期和方法的声明周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了.如果用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】即可获取最新零基础Java视频资料

回复 【激活】即可获取IDEA、datagrip等系统激活方式

回复 【面试题】即可获取Java技术相关面试题

往期 · 精彩

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

2a2bca33fc468bdf9ccbac5701aa38dc.png

4d321b1d98608741ab117ad9383d5107.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值