当前位置: 首页 > 面试题库 >

私有成员访问Java

伍耀
2023-03-14
问题内容

是在类级别还是在对象级别的私有成员访问权限。如果是在对象级别,则以下代码不应编译

    class PrivateMember {
   private int i;
   public PrivateMember() {
      i = 2;
   }
   public void printI() {
      System.out.println("i is: "+i);
   }
   public void messWithI(PrivateMember t) {
      t.i *= 2;
   }
   public static void main (String args[]) {
      PrivateMember sub = new PrivateMember();
      PrivateMember obj = new PrivateMember();
      obj.printI();
      sub.messWithI(obj);
      obj.printI();
   }
}

请说明在sub的messWithI()方法中访问obj的成员i是否有效


问题答案:

正如DevSolar所说的,它处于(顶级)类级别。

从Java语言规范的6.6节开始:

否则,如果将成员或构造函数声明为私有,则仅当访问发生在包含成员或构造函数的声明的顶级类(第7.6节)的主体内时,才允许访问。

请注意,没有迹象表明它仅限于特定对象的成员。

从Java
7开始,编译器不再允许访问类型变量的私有成员。因此,如果该方法具有类似的签名,public <T extends PrivateMember> void messWithI(T t)则访问将是编译器错误t.i。但是,那不会改变您的特定情况。



 类似资料:
  • 问题内容: 如您所知,Spring可以将值注入私有实例变量,而Hibernate可以访问持久类的私有变量。但是,我什至不能通过反射来调用类的受保护方法!Spring和Hibernate如何公然破坏安全性?更重要的是,我该怎么做?:D 问题答案: 在没有禁止性安全管理器的情况下运行时,可以获取相应方法或字段低谷反射的实例,然后在其上调用setAccessible()。 使用Java安全管理器,您当然

  • 注意:如果friend函数只是在类中声明并在外部实现,那么Clang和GCC都会拒绝该代码。

  • 问题内容: 我正在研究TypeScript中私有成员的实现,但我感到有些困惑。Intellisense不允许访问私有成员,但是在纯JavaScript中,仅此而已。这使我认为TS无法正确实现私有成员。有什么想法吗? 问题答案: 就像类型检查一样,成员的隐私仅在编译器中强制执行。 私有属性被实现为常规属性,并且不允许类外的代码对其进行访问。 为了使某些东西真正成为类的私有对象,它不能成为该类的成员,

  • 我知道我们可以通过反射访问私有构造函数,就像@Sanjay T.Sharma在回答我的问题时提到的:“instanceof void”总是返回false吗? 不过,@Duffymo表示: 您可以使用反射访问私有的所有东西--方法、构造函数、数据成员、所有东西。 如何访问私有方法和私有数据成员? 是否可以通过反射访问局部变量? 是否有方法防止任何人访问私有构造函数、方法和数据成员?

  • 问题内容: 有什么方法可以使“私有”变量(在构造函数中定义的变量)可供原型定义的方法使用? 这有效: 但这不是: 我习惯于在构造函数中定义方法,但出于以下两个原因而逐渐远离它。 问题答案: 不,没有办法。这基本上是相反的范围。 在构造函数内部定义的方法可以访问私有变量,因为所有函数都可以访问定义它们的作用域。 在原型上定义的方法未在构造函数的范围内定义,并且将无法访问构造函数的局部变量。 您仍然可

  • 我知道如何访问私有变量,但我正在尝试测试以下类: ProcessStatusResult: 在我的测试中,我需要在ProcessStatusBody中获取ProcessStatus来验证它,但我不知道如何做到这一点。 有没有一种方法可以使用反射(或其他方法)来访问它,而不必仅仅为了测试而在ProcessStatusResult中添加getter?