首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

内部类究竟是如何访问外部类中的元素的?

内部类可以直接访问外部类中的元素,包括外部类的成员变量和方法,无论是私有、受保护、默认或公共访问修饰符修饰的元素都可以被内部类访问。

内部类访问外部类的元素的方式取决于内部类的类型。如果内部类是静态内部类,则可以直接通过外部类的类名访问外部类的静态成员变量和静态方法。例如,外部类名.静态成员变量或外部类名.静态方法。

如果内部类是非静态内部类(也称为成员内部类),则需要通过创建内部类的实例来访问外部类的非静态成员变量和方法。首先,需要在外部类中创建内部类的实例,然后通过该实例访问外部类的成员变量和方法。例如,外部类实例名.new 内部类名().成员变量或外部类实例名.new 内部类名().方法名。

内部类的访问方式使得它可以方便地访问外部类的私有成员,并且可以实现更紧密的封装和组织代码的结构。内部类常用于需要访问外部类的状态或提供特定功能的情况,例如事件处理程序、回调函数等。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

灵魂拷问:Java内部类如何访问部类私有对象

innerName); } public innerClass(String innerName){ this.innerName = innerName; } } } 这是我简单手写一个外部类嵌套一个内部类...编译器小哥偷偷做了一些不可告人事情,首先,内部类多了个常量引用,准备指向着外部类,而且又偷偷修改了构造方法。传递一个OutClass类型参数进去。这样内部类就拿到了外部类引用。...但是仅仅拿到引用有个毛线用,通过反编译可以看到,生成是两个字节码文件,在虚拟机看来,这就是两个不相关类,你能在一个类调用另外一个类私有属性吗??? 很明显不能。...将指向外部类引用作为参数给那三个外部类静态方法 然后我们去反编译看看那三个静态方法怎么实现 又是祭出伟大反编译工具 ? 看得出,这三个方法都是返回外部类对应私有属性!...结论 在虚拟机没有外部类部类之分都是普通类,但是编译器会偷偷做点修改,让内部类多一个常量引用指向外部类,自动修改内部类构造器,初始化这个常量引用,而外部类通过扫描内部类调用了外部类那些私有属性

2.6K10
  • Java部类与匿名内部类详解

    文章目录 内部类 什么是内部类 成员内部类 访问特点 匿名内部类 前提 格式 使用方式 内部类 什么是内部类 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。...比如,电脑类Computer 包含中央处理器类Cpu ,这时, Cpu 就可以使用内部类来描述,定义在成员位置。...代码举例: class Computer { //外部类 class Cpu { //内部类 } } 访问特点 内部类可以直接访问部类成员,包括私有成员。...外部类访问部类成员,必须要建立内部类对象。...比如,PersonHeart.class 匿名内部类 匿名内部类 :是内部类简化写法。它本质是一个带具体实现父类或者父接口 匿名 子类对象。开发,最常用到部类就是匿名内部类了。

    1.5K30

    Java嵌套类、内部类、静态内部类

    参考链接: Java嵌套类 在Java我们在一个类内部再定义一个类,如下所示:  class OuterClass {     ...    ...内部类实例对象都会绑定一个外围类实例对象,并且InnerClass可以访问其所绑定OuterClass所有成员属性以及方法,包括私有成员属性以及方法。...在InnerClass通过OuterClass.this 显式 引用其所绑定OuterClass实例。...这样innerObject就可以访问outerObject所有成员属性以及方法了。  那如果想直接跳过外围类去初始化内部类会怎么样呢?...由于静态嵌套类没有像内部类那样绑定外部类对象,所以也就不存在静态嵌套类不能访问其外围类成员这种说法。

    1.7K50

    没有任何类型 Windows 外层实例可访问---Java内部类类型

    Java内部类与外部类 错误提示: 没有任何类型 TestThread 外层实例可访问。...同时外部类访问部类所有成员变量/方法,则需要通过内部类对象来获取。       要注意是,成员内部类不能含有static变量和方法。...局部内部类       局部内部类,是指内部类定义在方法和作用域。...首先,内部类被编译时候会生成一个单独部类.class文件,这个文件并不与外部类在同一class文件。  ...,如果编程人员在程序设计时候在内部类改掉参数值,但是外部调用时候又发现值其实没有被改掉,这就让人非常难以理解和接受,为了避免这种尴尬问题存在,所以编译器设计人员把内部类能够使用参数设定为必须是

    1.5K80

    没有任何类型 Windows 外层实例可访问---Java内部类类型

    Java内部类与外部类 错误提示: 没有任何类型 TestThread 外层实例可访问。...同时外部类访问部类所有成员变量/方法,则需要通过内部类对象来获取。       要注意是,成员内部类不能含有static变量和方法。...局部内部类       局部内部类,是指内部类定义在方法和作用域。...首先,内部类被编译时候会生成一个单独部类.class文件,这个文件并不与外部类在同一class文件。  ...,如果编程人员在程序设计时候在内部类改掉参数值,但是外部调用时候又发现值其实没有被改掉,这就让人非常难以理解和接受,为了避免这种尴尬问题存在,所以编译器设计人员把内部类能够使用参数设定为必须是

    1.1K20

    部类只能访问final局部变量_java内部类引用外部变量

    因为在JDK8之前,如果我们在匿名内部类需要访问局部变量,那么这个局部变量必须用final修饰符修饰。这里所说匿名内部类指的是在外部类成员方法定义部类。...既然是在方法创建部类,必然会在某些业务逻辑中出现访问这个方法局部变量需求。那么我们下面就会研究这种情况。 为什么java语法要求我们需要用final修饰呢?...,是因为在底层将这个局部变量值传入到了匿名内部类,并且以匿名内部类成员变量形式存在,这个值传递过程是通过匿名内部类构造器完成。...这里举个栗子:原先局部变量指向是对象A,在创建匿名内部类后,匿名内部类成员变量也指向A对象。但过了一段时间局部变量值指向另外一个B对象,但此时匿名内部类还是指向原先A对象。...那现在我们来谈一谈JDK8对这一问题知识点。在JDK8如果我们在匿名内部类需要访问局部变量,那么这个局部变量不需要用final修饰符修饰。

    93520

    java部类总结

    、肢体、器官等身体结果组成,而内部类相当于其中某个器官之一,例如心脏:它也有自己属性和行为(血液、跳动) 显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类 而心脏又在人体当中,正如同是内部类在外部当中...,因为内部类作用就是为了访问部类成员变量 实例2:内部类变量访问形式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17...:13 外部类变量:12 从实例1可以发现,内部类在没有同名成员变量和局部变量情况下,内部类会直接访问部类成员变量,而无需指定Out.this.属性名 否则,内部类局部变量会覆盖外部类成员变量...,那么内部类就只能访问部类静态成员变量,具有局限性 其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类对象(通过类名访问static,生不生成外部类对象都没关系...我们将内部类移到了外部类方法,然后在外部类方法再生成一个内部类对象去调用内部类方法 如果此时我们需要往外部类方法传入参数,那么外部类方法形参必须使用final定义 至于final在这里并没有特殊含义

    43030

    面向对象部类

    比如,电脑Computer类包含鼠标 Mouse类 ,这时, Computer 就可以使用内部类来描述,定义在成员位置。....new 内部类型(); 1.2.2、访问特点 内部类可以直接访问部类成员,包括私有成员。...外部类访问部类成员,必须要建立内部类对象。...2、局部内部类 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类区别在于局部内部类访问仅限于方法或者该作用域。...静态内部类是不需要依赖于外部类,这点和类静态成员属性有点类似,并且它不能使用外部类非static成员变量或者方法,这点很好理解,因为在没有外部类对象情况下,可以创建静态内部类对象,如果允许访问部类

    97520

    java匿名内部类总结

    匿名内部类也就是没有名字部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象方法...这个时候就引入了匿名内部类 实例2:匿名内部类基本实现 abstract class Person { public abstract void eat(); } public class...something"); } }; p.eat(); } } 运行结果:eat something 可以看到,我们直接将抽象类Person方法在大括号实现了...,那么其子类方法都可以使用匿名内部类来实现 最常用情况就是在多线程实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口 实例4:Thread类匿名内部类实现 public...}; Thread t = new Thread(r); t.start(); } } 运行结果:1 2 3 4 5 文章转载于:java匿名内部类总结

    92930

    Java内部类如何实现

    部类(inner class)是定义在另一个类类。 内部类方法可以访问该类定义所在作用域中数据,包括私有的数据。...内部类可以对同一个包其他类隐藏起来 当想定义一个回调函数且不想编写大量代码时,使用匿名(anonymous)内部类比较便捷。 以下简单举例: ?...语法和用法大家很容易就学会了,那么内部类如何实现直接访问其他类私有成员变量呢?我们知道Java私有成员变量只有类实例本身能访问。...内部类将通过这种方式持有外部类。 内部类一个特性是可以访问外部私有成员变量,这又是如何做到呢。...public或private访问说明符进行说明,它作用被限定在声明这个局部类

    73020

    Java4种内部类

    test2();//调用外部类非静态方法 System.out.println(a + b);//访问部类静态成员变量和非静态成员变量...成员内部类对象必须通过外部类对象创建 in.test(); } } Console: 在成员内部类方法 调用外部类静态方法 调用外部类非静态方法 4 2.静态内部类...局部内部类只能在方法内部中使用,一旦方法执行完毕,局部内部类就会从内存删除。   必须注意:如果局部内部类要使用他所在方法局部变量,那么就需要将这个局部变量定义为final。...new 类或者接口名字(){       //匿名内部类主体,大括号是匿名内部类主体,这个主体就是类或者接口实现,如果是类,那么匿名内部类是该类子类,如果是接口,匿名内部类需要完成接口实现..."); } }); } }  java绝大多数情况下,类访问修饰符只有public和默认这两种,但也有例外。

    24230

    Java,匿名内部类在开发使用以及匿名内部类面试题

    匿名内部类在开发使用   我们在开发时候,会看到抽象类,或者接口作为方法形式参数。   而这个时候,我们知道实际需要是一个子类对象。...如果该方法仅仅调用一次,我们就可以使用匿名内部类格式进行简化。   Android开发这种格式见得多,   JavaEE开发见得少。 为什么呢?...示例代码如下: 1 /* 2 匿名内部类在开发使用: 3 Android开发这种格式见得多, 4 JavaEE开发见得少。...pd.method(p); 39 System.out.println("--------------------"); 40 41 //法二:匿名内部类在开发使用...: 42 //匿名内部类本质是该类子类或者实现该接口实现类(子类)匿名对象。

    1.5K20

    Java部类了解一下

    1.什么是内部类?   Java类不仅可以定义变量和方法,还可以定义类,在类内部定义类就被称为内部类。...根据定义方式不同,可以将内部类分为四种:   成员内部类   局部(方法)内部类   静态内部类   匿名内部类   2.为什么要使用内部类?   ...使用内部类最吸引人原因是:每个内部类都能独立地继承一个(接口)实现,所以无论外围类是否已经继承了某个(接口)实现,对于内部类都没有影响。...——《Think in java》   使用内部类优势:   内部类可以继承父类、实现接口   内部类可以用多个实例,每个实例都有自己状态信息,并且与其他外围对象信息相互独立   内部类并没有令人迷惑...“is-a”关系,他就是一个独立实体   内部类提供了更好封装,除了该外围类,其他类都不能访问   创建内部类对象时刻并不依赖于外围类对象创建

    43730

    java内部类----安全问题-----访问外围类私有变量

    我们知道如果一个变量是私有的,它应该就不希望别人去访问它。 隐秘访问方法需要拥有包可见性,所有攻击代码需要与被攻击类放在同一个包。...当使用了内部类时候,编译器做了这样一件事: 它在外围类添加了一个静态方法  static boolean access$0(外部类); 内部类方法将调用这个函数 这个是有风险,因为任何人都可以通过access...$0方法很容易读取到外围类私有域 黑客可以使用十六进制编辑器轻松创建一个用虚拟机指令调用这个函数类文件。...结论就是: 如果内部类访问了私有数据域,就有可能通过附加在外围类所在其他类访问它们。 请慎用!

    1.5K20

    在C++模拟JAVA内部类方法

    JAVA部类可以自由访问外围类所有数据,所以很时候做这工作,而如果C++也这样做,就变成要增加很多setter和getter。...但是,也可以用以下方法模拟实现: 首先,你部类头文件一般是被外围类所#include,所以需要在内部类声明前增加“前置声明”: namespace outerspace{ class OuterClass...; } 然后,再设置一个指向外部类指针: private: OuterClass* outer_obj; 最后,让外部类是内部类友元: friend outerspace::OuterClass;...以上是内部类设定,外部类就很简单,只需要保存内部类指针,然后设置好内部类为友元就可以了: friend InnerClass; private: InnerClass inner_obj; 外部类则需要在初始化过程设置...在设计API过程,内部类需要用到外部类任何成员,包括是private,都可以用 outer_obj->XXX直接引用。而外部类则可以直接返回内部类指针(引用)给使用者。

    2K40

    为什么局部内部类访问外边局部变量必须为final

    6.局部内部类访问外边局部变量时,此变量必须为final类型  马克-to-win:由于技术方面的限制,java设计者们做出如下语法规定:局部内部类访问外边局部变量时,此变量必须为final类型...,(为什么请参考我参考目录)马克-to-win:否则会报一个错误:Cannot refer to a non-final variable i inside an inner class defined...in a different method  例2.6 class ShellMark_to_win {    int x = 100;//x是类变量, 内部类访问时不用加final。    ...void test() {         for (int i = 0; i < 2; i++) { /*马克-to-win:下面的y和str是局部变量,内部类访问时必须加final  */             ...            class Core {                 void display() {                     System.out.println("外部类

    60130
    领券