`

[#0x0004] 关于class和class member的访问权限

    博客分类:
  • Java
EXT 
阅读更多

1. class的访问权限

 

  class的访问权限只有public和package两种,不存在private和protected(内部类是特例)。
  每一个编译单元(即.java文件)至多只能有一个public class,且如果有的话,该public class名必须与文件名相同。
  class访问权限是member访问权限的基础。

2. member的访问权限


  当一个class是可访问的时候,member的访问权限才有意义。
  private、package、protected、public,具体的就不详细说了。
  protected包含package权限。

 

7月27日补充:member的访问权限是针对类而言的

  public: 对所有类可见。

  protectd: 对其Ext Class可见 + package。

  package: 对同一pkg内的类可见。

  private: 仅对member所在的类可见。

  我们这里说的都是Class,而不是Object。有时候在理解上会有这样的混淆:

class Test
{
	private int i;
}

public class PrivateTest
{
	public static void main(String[] args)
	{
		Test t = new Test();
		System.out.println("i = " + t.i); // syntax error
	}
}

  我们的确是获得了Test对象t,i也的确是t的member,不过我们访问i是在PrivateTest类中,根据private的定义,这里依旧是会出错。

  所以说,member的访问权限是针对类而言的,而不是针对对象。不能单纯地以为只要获得了对象(引用),就能随便访问对象中的所有成员。

 

10月10日补充:可见的意思

  如果类A的字段i对类B可见,则在类B中可以通过类的对象引用(假设有A a = new A();)(如果是static字段,则是通过类名)来访问字段i,即:可以在类B中直接写a.i(如果是static字段,则是可以写A.i)。

  那么,我们现在回头看,如果类A的字段i是:

  public: 对所有类可见            --> 即:所有的类中都可以写a.i或是A.i

  protectd: 对其Ext Class可见 + package  --> 即:只有与类A同包的类,或是类A的子类中可以写a.i或是A.i

  package: 对同一pkg内的类可见       --> 即:只有与类A同包的类中可以写a.i或是A.i

  private: 仅对member所在的类可见     --> 即:只有类A本身可以直接用a.i或是A.i

 

  这里又涉及到另外一个问题,即我自己常用的表达:private、package不可继承。其实这里private、package权限字段是由于对子类不可见所以不能继承。[#0x0006]里面的那个理解很好:可以理解为ext class隐式包含一个base class,base class根据member的访问权限决定是否将member暴露给ext class。

分享到:
评论

相关推荐

    resize_size_value.rar_Class Size

    在C++中,结构体和类非常相似,主要区别在于默认的成员访问权限。当一个类的成员是另一个结构体或类时,该成员的大小会直接加到类的总大小上。 文件名中,"resize_size_value.pass.c"可能是一个测试用例,用于验证...

    Google C++ Style Guide(谷歌C++编码规范 )

    Classes**:在C++中,`struct`和`class`非常相似,主要区别在于`struct`默认成员访问权限为`public`,而`class`默认成员访问权限为`private`。选择使用哪种取决于具体的场景需求。 ##### 4. **Functions(函数)**...

    stdafx.h代码

    class CResourceException;// Win resource failure exception class CUserException; // Message Box alert and stop operation class CGdiObject; // CDC drawing tool class CPen; // a pen / HPEN wrapper...

    Google命名规范中文版本

    2. **成员(member of a class)**:包括嵌套类、属性、方法或构造方法;即除了初始化和注释之外的类的所有顶级内容。 3. **注释(comment)**:文中特指实现注释(implementation comments),而非文档注释(Javadoc)。 #...

    .NET高级代码审计(第六课) DataContractSerializer反序列化漏洞1

    DataContractSerializer是.NET Framework中用于序列化和反序列化数据的主要组件,主要用于Windows Communication Foundation (WCF)服务之间的数据交换。在本篇第六课中,我们将探讨其反序列化原理和可能的攻击向量。...

    Google对外发布C++编码规范

    Classes**:在C++中,struct和class的区别主要在于默认访问权限不同,通常struct用于表示数据结构,而class用于实现抽象的数据类型。 - **Inheritance**:继承是面向对象编程的核心概念之一,应谨慎使用以避免复杂...

    Java选择题武汉大学JAVA基础.pdf

    public、protected、private定义了类成员的访问权限,以及默认访问权限。 22. Java中类的声明 public class、extends、implements是声明Java类的关键字。 23. Java中方法的声明 方法的声明可以是static、final、...

    Google C++ Style Guide(Google C++编程规范)高清PDF

    On the other hand, you must include the header file for Foo if your class subclasses Foo or has a data member of type Foo. Sometimes it makes sense to have pointer (or better, scoped_ptr) members ...

    逆向C++编程,反汇编技术

    call member_function ; 成员函数调用 ``` #### B. 识别类 一旦能够识别类的构造函数,接下来的任务就是确定整个类的定义。这包括识别类的成员变量、成员函数以及其他相关信息。 **1)识别构造函数和析构函数** ...

    c 编码规范

    - **Non-member, Static Member, and Global Functions**:非成员函数、静态成员函数和全局函数都有各自的适用场景。全局函数应尽量避免使用,以减少命名冲突和提高模块化程度。 - **Local Variables**:局部变量只...

    Google C++ 编程规范(精心制作的链接文档-方便查看学习)

    Classes**:结构体(struct)和类(class)在C++中有不同的默认访问级别,应根据实际需求选择合适的类型。 - **Inheritance**:继承是一种强大的机制,但也可能带来复杂性和难以维护的问题,因此需要谨慎使用。 -...

    Google C++编程规范中文版

    - **外部函数、静态成员函数和全局函数 (Nonmember, Static Member, and Global Functions):** 这些函数应尽可能地减少使用,以降低代码间的耦合度。如果必须使用,应该确保它们具有明确的责任和边界。 - **局部...

    Python中如何获取类属性的列表

    attributes_only = [member for member in all_members if not inspect.isroutine(member[1])] print(attributes_only) ``` #### 四、小结 通过上述介绍,我们可以看到,在Python中获取类属性列表有很多种方法,每...

    (重要)AIX command 使用总结.txt

    可以用该用户登录系统, 使用命令“ulimit -f”和“ulimit -Hf”可分别显示其fsize,fsize_hard的大小. //如何查看小型机适配器卡及硬盘的微码级别microcode level lscfg -vl device_name //查询SSA卡的微码级别 #...

    C#版ActiveX + JS +Flex通讯 完整实现

    1:加載: <object id="mycontrol" classid="clsid:4A44CF4E-F859-4328-AA22-3E9D7AFFF1AB" codebase="Hello.CAB" > 2:調用ActiveX方法 ('AUTOREAD_MEMBERSHIP')" value="AUTOREAD_MEMBERSHIP" id="button1" /> 3...

    ELF Tool Chain:BSD许可的ELF工具链-开源

    程序头表(Program Header Table)是ELF文件的重要组成部分之一,它包含了关于程序加载和执行时所需的段信息。 - **程序头表的结构**:每个程序头条目都描述了一个程序段,包括它的起始地址、结束地址、类型等。 - **...

    apktool documentation

    // pkgId of framework-res.apk determines number (which is 0x01) $ apktool if com.htc.resources.apk I: Framework installed to: 2.apk // pkgId of com.htc.resources is 0x02 $ apktool if ...

    一个win32下的ARM开源编译器

    mov r1,0x4567 | movw r1,0x4567 ;immediate could not be encoded Other instructions than just what is shown above are also affected. The last part of the principles, the smaller the better, may ...

Global site tag (gtag.js) - Google Analytics