类的包访问权限:《Java编程思想》中一段话的困惑

在《java编程思想第三版》(陈昊鹏 饶若楠等译)的第五章隐藏具体实现中,5.4节的最后一段话是:

“正如前面所提到的,如果没能为类访问权限指定一个访问修饰符,它就会缺省得到包访问权限。这意味着该类的对象可以由包内任何其他类来创建,但包外则是不行的。(一定要记住,相同目录下的所有不具有明确package声明的文件,都被视作是该目录下缺省包的一部分。)然而,如果该类的某个static成员是public的话,则客户端程序员仍旧可以调用该static成员,尽管他们并不能生成该类的对象。”

刚开始我对最后一句话的理解是:如果某个类没有指定访问修饰符,但其中有static成员是public的话,在包外的类中仍然可以调用该类的static的public方法或访问static的public成员字段。

于是我做了下面的实验:(我的classpath没有设置,是默认值,即是当前路径;我CMD的当前路径Thinking in java。)
  在Thinking in java/chapter5/下有Test.java,代码如下

package chapter5;

class Test
  {
    public static int i=0;
    public static void print()
    {
    System.out.println("class Test public static procedure");
    }

public void println()
    {
    System.out.println("class Test public procedure");
    }
  }

在Thinking in java/下有Test1.java,代码如下

import chapter5.*;

public class Test1
  {
    public static void main(String[] args)
    {
    int a;
    a=Test.i;
    //Test.print();
    }
  }

接着,编译Test1.java,结果编译器报错,说Test类不是公开类,不可以调用其方法或访问其成员字段。

结论:
  1、《Java编程思想》那段话应该是错误的,至少说应该是有歧义的。(手上没有英文原版,所以原版是怎么描述的,不大清楚)
  2、具有包访问权限的类,包外的类是不可以调用,无论是一般的方法、字段,还是静态方法及字段。
  3、具有包访问权限的类,其成员声明为public和protected是没有意义的,因为在包外不能访问也不能继承的。

再顺便提一句,在很多书中,都说如果类的成员是public的,那么无论是谁,无论在哪里,都可以访问该成员的。这种说法其实是不准确的,因为它有个前提,那就是那类必须是public。

Ps:我只是个初学者,这是我自己的总结,如果有错误,请高手斧正。

附Julysea评论
下面是我做的测试,和原文的代码稍有出入

Test.java

package javaforum.inner;

class Test {  
  public static final int PUBLIC_STATIC_NUMBER = 100;  
  static int DEFAULT_STATIC_NUMBER=200;
  public int PUBLIC_NUMBER=300;
  protected int PROTECTED_NUMBER=400;
  private int PRIVATE_NUMBER=500;
}

Main.java
package javaforum;

import java.lang.reflect.Field;

public class Main {
  public static void main(String[] args) throws Exception {
    Class clazz = Class.forName("javaforum.inner.Test");
    Field field1 = clazz.getField("PUBLIC_STATIC_NUMBER");
    //被注释掉的语句根本就不能通过编译
    //Field field2 = clazz.getField("DEFAULT_STATIC_NUMBER");
    Field field3 = clazz.getField("PUBLIC_NUMBER");
    //Field field4 = clazz.getField("PROTECTED_NUMBER");
    //Field field5 = clazz.getField("PRIVATE_NUMBER");
     
    //没有下面一句,程序编译没问题,执行会报错
    field1.setAccessible(true);
    System.out.println(field1.getInt(null));
    field3.setAccessible(true);
    //虽然上面一句没报错,可是下面一句仍然不可以执行
    System.out.println(field3.getInt(null));      
  }
}

可以看到的是利用java的反射机制,确实可以办到作者的意图。而且,也只能到public staic 为止,其他存取限定下的数据,用反射也是不可以取到的。似乎原来的翻译中“仍旧可以调用”改为“仍然能够存取”,可能更好。

类的包访问权限:《Java编程思想》中一段话的困惑相关推荐

  1. NIO 类的基本用法 --《JAVA编程思想》79

    JDK 1.4 引入了 java.nio.* 新类库提升 I/O 读写速度, 效率的提升主要得益于 nio 类库中采用的数据结构更接近于操作系统执行 I/O 的方式:通道和缓冲器. 通道作为数据仓库, ...

  2. 《JAVA编程思想》学习笔记:第1-4章(Java概述)

    全书目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章 ...

  3. 《JAVA编程思想》学习笔记:第21章(并发)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  4. 《JAVA编程思想》学习笔记:第8章(多态)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  5. 《JAVA编程思想》学习笔记:第16章(数组)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  6. 《JAVA编程思想》学习笔记:第19章(枚举)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  7. java学习笔记 java编程思想 第6章 访问权限控制

    文章目录 6.1 包:库单元(the library unit) 6.1.1 代码组织 6.1.2 创建独一无二的包名 练习1 练习2 6.1.3 定制工具类 6.1.4 用import改变行为 练习 ...

  8. java学习笔记 java编程思想 第7章 复用类

    文章目录 7.1 组合语法 练习1 7.2 继承语法 7.2.1 初始化基类 练习3 练习4 练习5 带参数的构造器 练习6 练习7 练习8 练习9 练习10 7.3 代理 练习11 7.4 结合使用 ...

  9. 《Java编程思想》第四版读书笔记 第十四章 类型信息

    2019独角兽企业重金招聘Python工程师标准>>> 14.2 RTTI运行时类型识别. Class对象包含了与类有关的信息,Java使用Class对象来执行其RTTI.每个类都有 ...

最新文章

  1. 【Unity】12.5 Navmesh Obstacle组件
  2. Bing API 2的体验
  3. 软件开发人员标准薪金 人月_软件产品测试周期
  4. 2012年初二晚越秀公园游灯有感一二
  5. latex中插图心得
  6. html 微博下拉菜单,jQuery实现模仿微博下拉滚动条加载数据效果
  7. 怎样做高质量的财务分析?
  8. 无监督学习 | DBSCAN 原理及Sklearn实现
  9. sqlserver evaluation是什么版本_SQL Server 基础知识
  10. linux pdf to txt,PDF转换为TXT
  11. 比特币技术公司创始人:ICO是一场被骗子玩弄的网络泡沫
  12. mercurial和svn_DBA Mercurial简介–处理文件和更改
  13. 一个很好的String组合连接的方法(StringBuffer)
  14. http 502错误怎么解决?
  15. 微信保存图片提示失败_微信为什么保存不了图片
  16. nb移动udp_电信NB物联网平台不仁不义有人来管管吗?
  17. Python多进程写Kafka
  18. 一个喜欢研究车的80后开车人,自己的经验和感受
  19. 启发式算法求解混合整数线性优化问题—— 生产计划安排和资源分配
  20. 计算机站课作文400字,关于电脑教室的作文400字

热门文章

  1. 南京邮电考研计算机科学大纲,2019年南京邮电大学811数据结构考研大纲
  2. 华硕服务器主板z8na-d6开关位置,华硕双路服务器主板Z8NA-D6
  3. mysql年月分表_MySQL之按月拆分主表并按月分表写入数据提高数据查询速度
  4. mysql 普通索引和唯一索引_MySQL 普通索引和唯一索引的区别
  5. wordcount代码_Scala小案例之wordcount
  6. mysql的实验环境_第04 章 MYSQL实验环境创建
  7. python图像配准的原理_python利用sift和surf进行图像配准
  8. 网络七层协议_Nginx七层负载均衡原理解析
  9. 怎么重置mysql密码是多少钱_mysql怎么重置密码
  10. java用1234组成,用javasecp代码展现数字1234可以组成多少个三位数