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

为什么内部类可以访问私有方法?

内部类可以访问私有方法的原因是因为内部类是外部类的一个内部成员,它可以访问外部类中的所有私有成员。在Java中,内部类可以访问外部类中的所有成员,包括私有成员。这种设计可以使得内部类更加灵活,可以更好地实现封装和代码复用。

例如,下面的代码演示了一个内部类访问外部类的私有方法:

代码语言:java
复制
public class OuterClass {
    private void privateMethod() {
        System.out.println("This is a private method.");
    }

    public class InnerClass {
        public void accessPrivateMethod() {
            privateMethod();
        }
    }
}

在这个例子中,内部类InnerClass可以访问外部类OuterClass中的私有方法privateMethod()。这是因为内部类是外部类的一个成员,它可以访问外部类中的所有成员。

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

相关·内容

_类成员函数可以访问本类对象的私有成员

成员函数可以访问本类对象的私有成员 sList是一个类 私有成员是head,有一个成员函数的形参是本类对象(的引用,引不引用不影响结论和原因) ==为什么呢!...head明明是b的私有成员,为什么可以访问了!!??== 因为!...对象b是sList类的,而这个intersection函数是sList的成员函数 head虽然是sList类的对象的私有成员,但是是在sList类访问的 ==就是 在类访问了本类(的实例化对象)的私有成员...本来就是类的成员,只是抽象和实例化的问题 这非常合理地体现了 类 的封装性 这个就是不行的,在类外访问了 这一点是非常好用的,可以利用这一点 ==用成员函数肆无忌惮地访问对象的私有成员!...==只要声明函数是类的成员函数,将外部同类对象设为形参(或加个引用)就可以了!! 不必再为如何访问到同类外部对象的私有成员而苦思了!

85530

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

可以看到,外部类OutClass除了默认构造器和私有的属性:name,id,address还多了三个静态的方法,这三个方法不是我们手写的。是编译器自动生成的,什么作用呢。...将指向外部类的引用作为参数给那三个外部类中的静态方法 然后我们去反编译看看那三个静态方法怎么实现的 又是祭出伟大的反编译工具 ? 看得出,这三个方法都是返回外部类对应的私有属性!...不过对于这点我还有点要说明,编译器很智能,它会扫描内部类,查看是否调用的外部类私有属性,只有调用了才会生成对应的acess$xxx方法!...,为这些私有属性创造acess$xxx静态方法。...这个方法是返回对应的私有属性的值。所以可以在一个类的外部获取一个类的私有属性的值 推荐文章 老板:kill -9的原理都不知道就敢到线上执行,明天不用来了 2020年国内互联网公司的薪酬排名!

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

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

    1.5K20

    谈谈Python:为什么类中的私有属性可以在外部赋值并访问

    Python:为什么类中的私有属性可以在外部赋值并访问?...问题引入 在慕课网上学习Python**类中的私有属性**的时候,看到了一个同学的提问: 将count改为__count,为什么实例变量在外部仍然可以修改__count?这里print p1....所以我们在外部用“属性名”访问私有属性的时候,会触发AttributeError,从而实现“私有属性”的特性。但通过“类名属性名”也可以访问这些属性。...#在类中新加的属性,可以通过实例来访问 print(p1.new_of_class) 输出: I'm new in p1! I'm new in Person! 问题解决。...以上这篇谈谈Python:为什么类中的私有属性可以在外部赋值并访问就是小编分享给大家的全部内容了,希望能给大家一个参考。

    2.9K10

    【Python】面向对象 - 封装 ② ( 访问私有成员 | 对象无法访问私有变量 方法 | 类内部访问私有成员 )

    一、访问私有成员 1、对象无法访问私有变量 在下面的 Python 类 Student 中 , 定义了私有的成员变量 , # 定义私有成员 __address = None 该私有成员变量..., 只能在类内部进行访问 , 类的外部无法进行访问 ; 在 类外部 创建的 Student 实例对象 , 是无法访问 __address 私有成员的 ; 使用 实例对象 访问 类的私有成员 , 编译时不会报错...Tom 18 Process finished with exit code 1 2、对象无法访问私有方法 在类中 定义私有成员方法 # 定义私有成员方法 def __say(self...在 Student 类中 , 定义了 私有成员变量 和 私有成员方法 : # 定义私有成员 __address = None # 定义私有成员方法 def __say...__address}") 并且在 say 成员方法 中 , 调用了 上述 私有的 成员变量 和 成员方法 : def say(self): print(f"{self.name}

    25920

    为什么你的私有可以很像PaaS?

    这就是为什么私有云计算的未来,在于立足于另外一个开源平台 - Apache Mesos- 之上,并且以更加像一个PaaS平台的面貌示人。...为什么选择私有PaaS而不是私有IaaS? 有一个很争议的观点,把目光仅仅集中在可复制(replicating)的IaaS云平台,如AWS,是一个一开始就错误的想法。...毕竟,AWS当初引人注目是仅仅是因为凭信用卡几分钟可以使用,而不是因为它看起来是部署应用最好或者最简单的方式。...Apollo使用了很多额外的组件,这包含Terraform和Packer,来让用户可以构建私有的IaaS和私有的PaaS环境。...然而,Yelp和其他公司都证明,Marathon也可以用来作为更加自定义化层的基础-通常会牵涉到特定的用来配置运行其上的容器的方法

    2.6K40

    为什么局部内部类访问外边的局部变量必须为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

    如何访问及调用类中私有成员及方法

    name}"); } } 三、将System.Reflection引用进来,这里是本随笔的关键所在,如下图所示: using System.Reflection; 四、如何设置及访问...在这里我们使用反射技术,使用Type类里的反射机制进行访问, 1)公用部分,具体代码如下: Person person = new Person(); Type type = typeof(Person...: fInfo.SetValue(person,"CNXY"); 3)访问name字段,访问方法如下代码所示: var name = fInfo.GetValue(person); 4)name字段结果如下...说明: BindingFlags.NonPublic:搜索非公有方法的成员; BindingFlags.Instance:搜索成员实例,包括字段及方法等。 五、如何访问Display私有方法?...说明: Invoke用于调用方法,后面的参数使用数组的方法,如有一个参数,则输入一个参数的object数组,如有多个参数,则输入多个参数的object数组。

    2.7K20

    通过Gtest访问C++静态、私有、保护变量和方法

    访问私有变量和私有方法比较复杂,不太推荐,因为它会破坏类的封装。...p.x = args.pramx(); EXPECT_FLOAT_EQ(p.process(args.prama(),args.pramb()),args.result()); } 另外,还可以通过公共接口类来访问私有和保护对象和方法...5,通过公共接口类来访问私有和保护对象和方法 5.1 通过公共接口类来访问私有对象和方法 MyClass.h // MyClass.h class MyClass { private: int...EXPECT_EQ(1, obj.GetValue()); // 验证私有方法的行为 } 5.2通过公共接口类来访问保护对象和方法 同样也可以通过公共接口类来访问保护对象和方法。...EXPECT_EQ(42, obj.GetValue()); // 验证保护方法的行为 } 这里介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,下一节将介绍如何通过JUnit访问

    22610

    PHP为什么empty可以访问不存在的索引

    同样是函数, 为什么empty访问不存在的索引就不会报错呢?...但是, 冥冥中我是感觉他们是有区别的, 你要问我为什么, 来: ? 有没有发现, 编译器在显示的时候, empty函数和is_array函数的颜色不一样....再看一个可以展示其区别的例子: $isArrFun = 'is_array'; var_dump($isArrFun(2)); $empFun = 'empty'; var_dump($empFun(1...在第二次调用的时候, 报错: 没有empty方法. 是不是仿佛懂了些什么, 进一步验证它并不是函数. 既然语言构造器是一些预定义操作, 那么大概率要比函数的调用更有效率....对了, 再悄悄告诉你, PHP 中, 系统函数是可以被重新定义的, 只要你写一个同名函数就行, 但是关键字这几个老兄不吃这一套哦.

    64320

    为什么ping不通网站 但是却可以访问该网站?

    二、DNS服务器的问题 当IE无法浏览网页时,可先尝试用IP地址来访问,如果可以访问,那么应该是DNS的问题,造成DNS的问题可能是连网时获取DNS出错或DNS服务器本身问题,这时你可以手动指定DNS服务...(地址可以是你当地ISP提供的DNS服务器地址,也可以用其它地方可正常使用DNS服务器地址。)...为了提高网站访问速度,系统会自动将已经访问过并获取IP地址的网站存入本地的DNS缓存里,一旦再对这个网站进行访问,则不再通过DNS服务器而直接从本地DNS缓存取出该网站的IP地址进行访问。...所以,如果本地DNS缓存出现了问题,会导致网站无法访问可以在“运行”中执行ipconfig /flushdns来重建本地DNS缓存。...六、HOSTS文件的问题 HOSTS文件被修改,也会导致浏览的不正常,解决方法当然是清空HOSTS文件里的内容。

    8.4K20

    数组 为什么数据可以随机访问为什么数组下标都是从0开始?

    对应的还有非线性表结构(数据没有先后顺序的,二叉树,堆等) 连续内存空间:计算机在分配内存空的时候都会对应分配一个内存地址,连续的内存空间对应的是指连续的内存地址,计算机是通过访问内存地址会获取内存中的值...相同的数据类型:相同的数据类型,换句话可以说数据存储所占用内存大小一样 特性 - 随机访问 基于上面的概念描述,下面来分析一下数组的最大特性:随机访问 非随机访问:就是存取第N个数据时,必须先访问前(...N-1)个数据 (链表) 随机访问:就是存取第N个数据时,不需要访问前(N-1)个数据,直接就可以对第N个数据操作(数组) 如下图所示: 为什么数组下标都是从0开始?...*4(数据类型占用的内存) = 1008 第三个内存地址的位置 假设下标从0开始:我们想获取第3个值得花 首地址(1000)+ 2 *4(数据类型占用的内存) = 1008 省去了一个减的动作 提高了访问的效率

    79810

    通过JUnit5访问Java静态、私有、保护变量和方法

    在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。...2,访问Java私有变量和方法 私有变量和方法通过反射机制来实现。...《通过Gtest访问C++静态、私有、保护变量和方法》和这篇《通过JUnit5访问Java静态、私有、保护变量和方法》两篇文章可以看出: 对于私有变量和方法:在C++中通过友类可以访问;在Java中通过反射机制可以访问...对于保护变量和方法:在C++中和Java中通过继承类可以访问。 所以在C++中测试类访问私有变量和方法可将测试类设为被测试类的友类;在Java中测试类访问私有变量和方法通过反射机制来实现。...在C++中测试类访问保护变量和方法可将测试类设为被测试类的继承类;在Java中可以建立被测类的集成类,对集成类进行测试。 最后一句话,不建议测试私有变量和方法,如果万不得已,可以先考虑代码的重构。

    13310

    java9-可以在interface中定义私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法。只允许我们定义public访问权限的方法、抽象方法或静态方法。...但是从Java 9 开始,Interface 接口中允许定义私有方法私有静态方法。下面我们就来为大家介绍其语法规则,和为什么要有这样的设计。...一、Java 9接口定义私有方法 从Java 9开始,我们可以在Interface接口中添加private的私有方法私有静态方法。这些私有方法将改善接口内部的代码可重用性。...接口中私有方法只能在接口内部的方法里面被调用。 接口中私有静态方法可以在其他静态和非静态接口方法中使用。 接口中私有非静态方法不能在私有静态方法内部使用。...void defaultMethod() { privateMethod(); //可以调用接口中的私有方法 privateStaticMethod(); //可以调用接口中的私有静态方法

    1.7K20

    为什么start方法不能重复调用?而run方法可以

    thread2.start(); } 以上程序的执行结果如下: 从上述结果可以看出,二者调用之后的执行效果都是一样,都可以成功执行任务。...区别3 因为 run 方法是普通方法,而普通方法可以被多次调用的,所以 run 方法可以被调用多次;而 start 方法是创建新线程来执行任务,因为线程只能被创建一次,所以它们的第三个区别是:run...方法可以被调用多次,而 start 方法只能被调用一次。...为什么start不能被重复调用?...执行速度不同:调用 run 方法会立即执行任务,调用 start 方法是将线程的状态改为就绪状态,不会立即执行。 调用次数不同:run 方法可以被重复调用,而 start 方法只能被调用一次。

    70910
    领券