Java内部类和外部类互相访问问题

保姆级教程:在RK3576上配置USB网卡从零到外网访问(附udev规则详解) 本文提供了在RK3576开发板上配置USB网卡的完整教程,涵盖从内核驱动、udev规则到网络路由的全流程。重点讲解了如何利用USB Gadget功能实现高速网络连接,并构建稳定的算力集群,确保多设备间通信及外网访问。 阅读详情

今天在分析android的AMS的时候,发现在AMS中出现了内部类访问外部类私有方法的操作,一时之间觉得有些奇怪:为毛private的方法可以被访问??之前的认识是private方法是不可以通过对象方式调用的,但是现在的代码确实这么做了!!为什么呢?
带着这个问题,我google了一下,最终找到了这个stackoverflow的帖子:
http://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members
帖子中有很多人给予了热情的回复,大家可以看一下。要说明这个问题,需要说明一下在什么样的情况下使用内部类:
1. 你的某个类中的部分功能需要放在一个单独的类中实现,这样比较有利于代码的可读性和可维护性
2. 但是这部分的功能和现在这个类中的一些方法有这密切的关系。
这个时候,你就应该使用内部类,可以看到,内部类的设计目的就是为了将外部类中的一些功能方便地隔离出来,但是为了方便这个类的操作,所以这个类需要对外部类的一些属性和方法进行访问。也就是说这个时候,内部类只是外部类的一部分和外部类中的某个成员变量没有什么区别,当然可以互相访问了,包括私有属性和方法!这是从设计上对这个问题的解释,从编译和JVM角度来说的话,那就是java在编译的时候内部类和外部类的数据处理是共享的,也就是说所有的数据都是可以互相看到的。
下面给出一个测试代码,实际测试一个内部类和外部类的互相访问的问题:

/*************************************************************************
    > File Name: Demo.java
    > Author: Baniel Gao
    > Mail: createchance@163.com 
    > Created Time: Tue 28 Jun 2016 04:25:01 PM CST
 ************************************************************************/

class OuterClass {

    private int OuterPrivateInt = 0;
    public int OuterPublicInt = 1;

    public OuterClass() {

    }

    private void OuterPrivateMethod() {
        System.out.println("outer private method.");
    }

    public void OuterPublicMethod() {
        System.out.println("outer public method.");
    }

    public void outerTest() {
        System.out.println("***********************Outer Test***********************");

        InnerClass innerObj = new InnerClass();

        // access inner private member
        System.out.println("inner class private int: " + innerObj.InnerPrivateInt);

        // access inner public member
        System.out.println("inner class public int: " + innerObj.InnerPublicInt);

        // call inner public method
        innerObj.InnerPublicMethod();

        // call inner private method
        innerObj.InnerPrivateMethod();

        System.out.println("***********************Outer Test*********************** \n");

        // inner test one
        innerObj.innerTestOne();

        // inner test two
        innerObj.innerTestTwo();
    }

    class InnerClass {

        private int InnerPrivateInt = 2;

        public int InnerPublicInt = 3;

        private void InnerPrivateMethod() {
            System.out.println("inner private method.");
        }

        public void InnerPublicMethod() {
            System.out.println("inner public method.");
        }

        public void innerTestOne() {
            System.out.println("***********************Inner Test One***********************");

            // call outer class private method
            OuterPrivateMethod();

            // call outer class public method
            OuterPublicMethod();

            // access outer class private member
            System.out.println("outer class private int: " + OuterPrivateInt);

            // access outer class public member
            System.out.println("outer class public int: " + OuterPublicInt);

            System.out.println("***********************Inner Test One*********************** \n");
        }

        public void innerTestTwo() {
            System.out.println("***********************Inner Test Two***********************");

            OuterClass outerObj = new OuterClass();

            // access outer class private member
            System.out.println("outer class private int: " + outerObj.OuterPrivateInt);

            // access outer class public member
            System.out.println("outer class public int: " + outerObj.OuterPublicInt);

            // call outer class private method
            outerObj.OuterPrivateMethod();

            // call outer class public method
            outerObj.OuterPublicMethod();

            System.out.println("***********************Inner Test Two***********************");
        }
    }
}
public class Demo {

    public static void main(String[] arg) {
        OuterClass obj = new OuterClass();

        obj.outerTest();
    }

}

运行结果如下:
这里写图片描述
从实际的运行结果来看,内部类和外部类的访问就是通行的,可以自由访问!

激光三角测量法:斜射与直射式技术的原理与应用解析 本文深入解析激光三角测量法中斜射式与直射式技术的原理、应用及对比。斜射式适用于高精度小范围测量,尤其擅长处理反光表面;直射式则适合大范围位移检测,结构更简单。文章详细介绍了两种技术的光路分析、数学建模、应用场景及选型建议,并探讨了系统校准与误差分析方法,为工业检测领域提供实用参考。 阅读详情

相关推荐

百度飞桨+文心大模型实战:生成式AI工程师认证备考全攻略(含真题解析)

本文详细解析百度飞桨与文心大模型结合的生成式AI工程师认证备考策略,涵盖认证体系、学习路径、核心技能突破及真题分析。帮助开发者掌握大模型原理、飞桨平台操作和文心大模型应用,高效通过工信部与百度联合认证考试。

loss4bartender的博客 682

JAVA基础编程——包和访问控制权限

在C/C++中,是通过.h文件和.cpp文件进行功能区分的,通常一个.cpp文件会对应一个.h文件,而如果不同模块之间需要进行交互操作,或者需要进行接口调用的话,就需要包含对应的.h文件,以表示当前的模块包含了对应模块,因此就可以调用对应模块的接口了。而JAVA中只存在一种.java文件,因此便通过包和包管理实现了这种功能。 在JAVA中,可以将大型的类进行独立,不同功能分别保存到不同的包中,然后将所有包中的程序文件进行编译执行,这样产生的代码便会更易于维护。 包 在JAVA中,源程序文件是.java

止步听风的博客 900

基于Transformer的CFD代理模型:AeroTransformer原理、实现与优化

计算流体动力学(CFD)仿真是航空航天、汽车工程等领域的关键技术,但其高计算成本限制了设计优化效率。代理模型通过机器学习方法学习输入参数与流场输出间的映射关系,能实现秒级预测,大幅加速仿真流程。Transformer架构凭借其全局注意力机制,能有效建模流场中的长程物理关联,克服了传统卷积神经网络在捕捉全局依赖上的局限。通过预训练与微调策略,模型能先在大规模多样化数据集上学习通用流体规律,再针对特定任务快速适配,显著提升了小样本下的泛化能力与工程实用价值。AeroTransformer项目正是这一技术路线的典

weixin_33509203的博客 359

内部类和外部类之间的相互调用

内部类: ①静态内部类中可以有非静态的方法 ②当内部类中有静态方法或者静态成员变量时,一定是静态内部类 一般内部类在外部类的成员变量位置,像这样: 1 public class Outer { 2 class Inner{ 3 4 } 5 } 1、外部类访问内部类:    内部类被static修饰:可以直接new     Inner i...

大JAVA解决方案 2374

GD32F407工程模板搭建全记录:从零整理固件库、创建文件夹到编译通过

本文详细记录了GD32F407工程模板的搭建过程,从固件库整理、目录规划到Keil环境配置,帮助开发者快速搭建可维护的嵌入式工程结构。重点介绍了开发环境搭建、工程目录设计、Keil配置及常见编译问题解决方案,适合嵌入式开发者参考。

weixin_29164497的博客 119

逆向分析PerimeterX px3:从混淆JS到生成有效令牌的完整实战

在Web安全与数据采集领域,反自动化防护是保障服务稳定和数据安全的关键技术。其核心原理是通过收集浏览器环境指纹和用户行为特征,动态生成加密令牌来区分真人用户与自动化脚本。这项技术的工程价值在于平衡安全性与用户体验,广泛应用于电商、金融、社交等需要防止恶意爬虫和自动化攻击的场景。本文聚焦于业界广泛部署的PerimeterX px3防护方案,通过JavaScript逆向工程,深入剖析其令牌生成机制。我们将探讨如何运用动态调试、反混淆工具和算法还原等关键技术,突破px3的防护壁垒,为自动化测试和数据采集提供稳定可

diankui6178的博客 526

java 内部类与外部类之间的成员互相访问《java编程思想》

01:内部类 可以访问 外部类 的 任何成员,包括private成员。 02:外部类 访问 内部类 的成员 需要 创建 内部类的 对象,之后 可以 访问 内部类 的 任何 成员,包 括private成员,需要注意的是成员内部类不可以有静态成员。 03:当外部类 的成员 和 内部类的 成员重名时单单用this是区分不了的。在内部类中访问外部类的成员 时可以用如下语法区分 : <外部类类名>.this.<外部类中需要被访问的成员名>; 04:解释 外部类 为什么可以直接访问 内部类的 所

qq_19373729的博客 2579

保姆级教程:在摩尔线程MTT S80上快速部署Ollama运行DeepSeek R1模型(附性能测试)

本文提供了一份详细的保姆级教程,指导用户在摩尔线程MTT S80显卡上部署Ollama并运行DeepSeek R1模型。内容涵盖从驱动安装、Docker环境配置到模型拉取、性能测试的全流程,并分享了实测数据与优化技巧,旨在帮助开发者快速在国产GPU平台上实现高效的大语言模型推理。

weixin_29091837的博客 525

内部类和 外部类相互访问

内部类: ①静态内部类中可以有非静态的方法 ②当内部类中有静态方法或者静态成员变量时,一定是静态内部类 1、外部类访问内部类:    内部类被static修饰:可以直接new     Inner in = new Inner();    内部类没有被static修饰:得先new出来外部类的实例,再new内部类的     Inner in = new Outer().n...

weixin_30685029的博客 623

PaddleOCRv5训练自己的模型-微调文字识别模型

本文介绍了使用PaddleOCR微调文字识别模型的具体步骤。首先需要按照官方格式准备数据集,包括图片和标注文件。然后进行模型训练,包括环境安装、预训练模型下载、配置文件修改等关键环节,特别针对训练中可能出现的类别数不匹配问题提供了三种解决方案。文章还详细说明了模型导出为静态图格式的方法,以及如何调用训练好的模型进行推理。整个过程涉及多个技术细节,如早停机制设置、断点续训方法等,为需要提升OCR识别精度的开发者提供了实用指导。

weixin_43827982的博客 3176

高德地图轨迹回放,消息框内展示车辆速度且随车辆移动-升级支持调整速度、回放进度

使用高德地图回放车辆GPS轨迹,并添加速度和回放进度条,并支持调整,效果如下: 新增的功能: 在基础版本,有如下升级 速度条:可以拖动以调整车辆回放速度,且从当前位置继续回放 进度条:进度条表示车辆已回放的百分比,且拖动进度条车辆定位到相应的位置并继续回放 ###思路分析 高德和marker回放相关的API //主要靠他回放 moveAlong(path:Array,speed:Number,f:Function,circlable:Boolean) //点移动到另一个位置,移动进度条车辆跟随移动

博客 1万+

内部类可以直接访问外部类成员吗_还好面试官还没问,赶紧把【内部类】的知识点补上!...

目录1. 内部类的含义知道内部类这个概念,除了在用链表时定义节点类时,其余情况具体怎么使用感觉很生疏。再次回顾到这个知识点了,做一个系统的总结内部类,从字面意思上理解为 “定义在类内部的类”。可以把它理解为汽车的发动机,只能在汽车的内部使用,给火车它就用不了了;人体的心脏,在人体里面维持着血液循环,拿出来人就凉了。这些 “内部的部件”,是只能够依赖于外部而使用的,我们称这种类为内部类。内部类是依赖...

weixin_35355560的博客 3537

【推荐100个unity插件】动画重定向,快速在不同角色间共享动画,共用非人形Humanoid(泛型generic)动画——Retarget Pro

Retarget Pro是一款高效的Unity动画重定向工具,可快速在不同角色间共享动画。主要特点包括:1分钟快速设置,支持编辑器和运行时重定向;适用于人形、动物、武器等各类角色;提供基础重定向、IK重定向和FPS专用重定向三种功能模块;通过Rig组件和骨架资产实现骨骼链匹配,支持批量处理。插件包含示例项目和预设资源,操作简便且效果优于Unity原生Humanoid系统,特别适合处理手指等精细动画。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 547

内部类与外部类之间的访问

目 录 1.内部类与外部类 2.内部类的特点:内部类可以直接访问外部类的成员(成员变量和成员方法),包括私有成员。 3.内部类与外部类之间的访问 在测试类中调用成员内部类中的方法: 外部类访问成员内部类中的成员: 静态的成员内部类,只能访问外部类的静态成员 私有的成员内部类,外界就无法直接创建其对象,可以通过外部类的方法访问 局部内部类,在外界没有直接创建其对象的语法 局部内部类访问外部类的局部变量: 1.内部类与外部类 将一个类A 定义到另一个类B的内部,...

naoguoteng的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Java基础】一个Java文件可以有多个类(外部类、内部类)

1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同。2、为什么一个java源文件中只能有一个public类?每个编译单元(文件)都只能有一个public类,这表示,每个编译单元都有单一的公共接口,用public类来表现。该接口可以按要求包含众多的支持包访问权限的类。public类的名称文件名相同成员内部类。...

qq_43783527的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java内部类、外部类之间访问权限

Java内部类、外部类之间访问权限啥是内部类内部类可以访问外部类的所有成员吗那外部类能访问内部类的所有成员吗静态内部类呢 啥是内部类 顾名思义,内部类就是在一个类中定义了另一个类,比如在类A中定义了一个类B,B就是A的内部类。 class A{ String a = "a"; class B{ String b = "b"; } } 内部类可以访问外部类的所有成员吗 修改一下代码,外部类A中有多种访问权限的字符串,在内部类B中的方法去打印这些字符串,先抛开static来看。 public cl

qq_44381427的博客 5161

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

内部类和外部类之间互相访问

内部类与外部类之间的成员互相访问  内部类可以访问外部类的任何成员,包括private成员。  外部类访问内部类的成员需要创建内部类的对象,之后可以访问内部类的任何成员,包括private成员,需要注意的是成员内部类不可以有静态成员。  当外部类的成员和内部类的成员重名时单单用this是区分不了的。在内部类中访问外部类的成员时可以用如下语法区分  .this.; 1、普通内部类 pac

wangkjs的博客 3404

Java——访问内部类的方法

内部类: 将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。 访问特点: • 内部类可以直接访问外部类中的成员,包括私有成员。 • 而外部类要访问内部类中的成员必须要建立内部类的对象。 内部类的位置: 内部类定义在成员位置上 • 可以被private static成员修饰符修饰。 • 被stati...

caigen0001的专栏 1万+

Java内部类和外部类

Java内部类和外部类 在Java语言中,可以把一个类定义到另外一个类的内部,在类里面的这个类就叫作内部类,外面的类叫作外部类。在这种情况下,这个内部类可以被看成外部类的一个成员(与类的属性和方法类似)。还有一种类被称为顶层(Top-level)类,指的是类定义代码不嵌套在其他类定义中的类。 内部类 内部类主要有四种类型: 静态内部类(Static Inner Class) 成员内部类(Me...

weixin_41924879的博客 2161

Java的外部类和内部类

一、概念 1.1、定义 外部类:这是一个相对内部类的概念,如果一个类中嵌套了另外一个类,我们就把这个类叫做外部类。 内部类:顾名思义,就是定义在里边的那个类。 内部类可以作用在方法里以及外部类里,作用在方法里称为局部内部类,作用在外部类里分为实例内部类和静态内部类。 二、内部类与外部类的互访 2.1、外部类和内部类的类访问修饰符 外部类只有两种访问控制符,即public和default(包...

qq_44543551的博客 2102

外部类与内部类

什么是外部类、内部类 public class Outer { class Inner{ } } 如上述代码,Outer是一个外部类,Inner是一个内部类,内部类也可以用public、static等修饰,但要注意: 1.静态内部类中可以有非静态的方法; 2.当内部类中有静态方法或者静态成员变量时,一定是静态内部类。 外部类与内部类的区别与联系: 内部类可以访问外部类所有的方法和属性,如果内部类和外部类有相同的成员方法和成员属性,内部类的成员方法调用要优先于外部类即内部

Moum_j的博客 5344

[Java]内部类和外部类

外部类,外部类与main方法的联系,内部类,成员内部类,静态内部类,局部内部类,匿名内部类

2302_80281315的博客 1400

Java基础-访问权限、外部类、内部类

修饰符类内部同一包内不同包的子类不同包的非子类private✓✗✗✗default✓✓✗✗protected✓✓✓✗public✓✓✓✓。

Jianshu_Ma的博客 1322

内部类 和外部类之间的访问关系

外部类和内部类的访问 1成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。 2.外部类访问内部类 首先,要有内部类的对象 但是内部类是依附于外部类存在的 所以,先要创建外部类的对象。(方式如下:) 内部类之间的访问: 非静态内部类调用非静态内部类直接调用new类 非静态调用静态 直接调用new类 静态内部类调用静态内部类直接调用new...

qq_35306443的博客 1725

为什么内部类能访问外部类的private成员

此文文转载文 原文链接: https://droidyue.com/blog/2014/10/02/the-private-modifier-in-java/ 这篇文章通过反编译讲解了为什么内部类能用外部类private成员和为什么外部类能用内部类private成员 在Java编程中,使用private关键字修饰了某个成员,只有这个成员所在的类和这个类的方法可以使用,其他的类都无法访问到这个pri...

qq_40940540的博客 6800

Java外部类、内部类、局部内部类访问控制全解析

本文通过学校-班级的类比,解析Java中外部类、成员内部类和局部内部类的访问控制规则。外部类只能使用public或默认修饰符,protected/private会导致编译错误;成员内部类作为外部类的成员,可以灵活使用四种访问修饰符;局部内部类由于作用域限制,不能使用任何访问修饰符。文章通过代码示例验证了不同修饰符的效果,并强调内部类的访问控制本质上是限制外部类之外的代码访问权限,其中private内部类只能通过外部类方法间接访问。

wentorrihi0818的博客 725
上一篇: Android智能指针浅析
下一篇: Android ActivityManagerService(AMS)的启动分析
createchance
博客等级 码龄15年 156粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值