资讯专栏INFORMATION COLUMN

内部类的访问特点

jzman / 630人阅读

摘要:今天刷题的时候遇到了一题关于内部类的访问的问题,发现自己忘了许多,现在来复习一下。首先,内部类的类字节码文件名字为。记住一下访问原则内部类相当于外部类的一个成员变量,因此内部类可以直接访问外部类的成员。

今天刷题的时候遇到了一题关于内部类的访问的问题,发现自己忘了许多,现在来复习一下。
首先,内部类的类字节码文件名字为Outer$Inner.class。

记住一下访问原则:
1.内部类相当于外部类的一个成员变量,因此内部类可以直接访问外部类的成员。但是注意内部类静态方法不能访问外部类非静态成员
2.但是外部类如果要访问内部类中的成员,要么内部类是静态的,跟着外部类一起被加载;要么创建内部类的对象,通过对象访问(想让外部类进内部类里面,总得有内部类的“实体”吧,这个“实体”要么是跟外部类一起加载的静态内部类,要么是新建的内部类的对象,无论是哪种,都会在堆中为内部类开辟空间,然后才可以访问到)
例子:

a.外部类访问静态内部类的静态成员(一路畅通无阻)
Outer.Inner.func();

b.外部类访问静态内部类的非静态成员(一路畅通到内部类门口,
发现里面还没东西,怎么办?创建对象!)
//一般方式
Outer.Inner in = new Outer.Inner();
in.func();
//匿名方式
new Outer.Inner().func();//new Outer.Inner()创建出对象,然后调用对象的func

c.外部类访问非静态内部类的非静态成员(没对象,内部类的门都找不到!乖乖一步步创建对象吧)
//一般方式
Outer.Inner in = new Outer().new Inner();
in.func();
//匿名方式
new Outer().new Inner().func(); 

3.内部类如果有静态成员,则内部类也必须是静态的(否则内部类成员要随着外部类加载,发现内部类自己都还没加载,那这个成员是哪儿跑出来的呢?)
4.内部类访问局部变量时,局部变量必须加final修饰符。(随着方法运行完毕,局部变量会被释放,如果此时一个内部类还引用该变量则会报错。说到底就是变量的生命周期比内部类实例要短。而final保证这个变量始终指向一个对象,内部类就可以放心大胆地引用了。其实犯了和C++一样的毛病:返回了局部变量的引用)
注意:在JDK8版本之中,方法内部类中调用方法中的局部变量,可以不需要修饰为 final,匿名内部类也是一样的,主要是JDK8之后增加了 Effectively final 功能

class Outer{                                                                       
    public static void main(String[] args){
            Object obj = new Outer().method();
    }   

    Object method(){
            int locvar = 1;
            class Inner{
                    void displayLocvar(){
                            System.out.println("locvar = " + locvar);
                    }
            }
            Object in = new Inner();
            return in;//返回了内部类对象,但是该对象依然引用着局部变量 
    }

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71003.html

相关文章

  • Java 面向对象

    摘要:自从转到前段,差不多有一年时间没有动了,今天老弟问我关于的面向对象,自己不敢直接回答了,也许自己真的应该去做相关的考究了。要有父类引用指向子类对象。外部类要访问内部类的成员,必须要建立内部类的对象。 自从转到前段,差不多有一年时间没有动Java了,今天老弟问我关于Java的面向对象,自己不敢直接回答了,也许自己真的应该去做相关的考究了。然后在告诉他吧,记在这里当做一个笔记吧。  什么...

    cncoder 评论0 收藏0
  • 解释JS中的静态方法、公有方法、私有方法和特权方法

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装、继承、多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义JS中对象:无序属性的集合,其属性可以包含基本值、对象或者函数。 我们首选要了解封装、继承、多态又有如何特点 封装:顾名思义来封装变量和函数封装->特点:高度复用,降低冗余度,更有利于模块化编程,能够为...

    wizChen 评论0 收藏0
  • java学习(三) —— 面对对象

    摘要:前言是面对对象的语言,因此有必要单独纪录下对象的各种定义和理解。面对对象基本概述概述是基于面向过程的变成思想,是对面向过程的一种封装。面对对象开发就是不断的创建对象,使用对象,指挥对象做事情。面对对象设计其实就是在管理和维护对象之间的关系。 前言 java是面对对象的语言,因此有必要单独纪录下对象的各种定义和理解。 面对对象,主要包括:面向对象思想,类与对象及其使用,对象的内存图,成...

    褰辩话 评论0 收藏0
  • 什么是Java内部类?

    摘要:内部类一概述把类定义在另一个类的内部,该类就被称为内部类。为什么局部内部类访问局部变量必须加修饰呢因为局部变量是随着方法的调用而调用,使用完毕就消失,而堆内存的数据并不会立即消失。 内部类 (一) 概述 把类定义在另一个类的内部,该类就被称为内部类。 举例:把类Inner定义在类Outer中,类Inner就被称为内部类。 class Outer { class Inner { ...

    Drummor 评论0 收藏0
  • 1、final 关键字 2、static 关键字 3、匿名对象 4、内部类 5、包的声明与访问 6、

    摘要:可以直接用接口名访问。其他类也称为外部类。汽车外部类发动机内部类内部类的分类内部类分为成员内部类与局部内部类。我们定义内部类时,就是一个正常定义类的过程,同样包含各种修饰符继承与实现关系等。并且日常项目的分工也是以包作为边界。 01final关键字概念 * A: 概述 继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承, ...

    邹立鹏 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<