1. 概述

  1. 老生常谈的内容
  2. 巩固一下自己 要摇摇欲坠的基础
  3. 内容确实不怎么高级...

2. 常规解释

1. 概述

  1. 简单说下什么情况
  2. 在单纯考虑 public, protected, 以及 private 的情况下
    1. 先暂时不要受到其他 修饰词 的干扰
    2. 比如
      1. public int var01;
      2. protected int var02;
      3. int var03;
      4. private int var04;

2. 解释

            │ Class │ Package │ Subclass │ Subclass │ World
            │       │         │(same pkg)│(diff pkg)│
────────────┼───────┼─────────┼──────────┼──────────┼────────
public      │   +   │    +    │    +     │     +    │   +
────────────┼───────┼─────────┼──────────┼──────────┼────────
protected   │   +   │    +    │    +     │     +    │
────────────┼───────┼─────────┼──────────┼──────────┼────────
no modifier │   +   │    +    │    +     │          │
────────────┼───────┼─────────┼──────────┼──────────┼────────
private     │   +   │         │          │          │    

1. 横坐标

  1. 这个暂时不解释

2. 结论

  1. public

    1. 在哪里都可被访问, 这个毋庸置疑
  2. protected
    1. 本类 和 同包 可以访问
    2. 子类 (包内 和 包外) 都可以访问
  3. no modifier
    1. 仅在 同包 的类之间, 可以互相访问
    2. 包以外 的 所有类, 都不可以访问
  4. private
    1. 只有本类可以访问

3. 其他

  1. 关于 subclass

    1. 对于 subclass, 我有疑问

      1. 是否包含 间接的子类
    2. 验证策略
      1. 有一个类 A1, 有变量 protected p
      2. 在另外的包里, 创建一个 subclass A2, 再创建这个类的 subclass A3
      3. 尝试在 A3 的 main 方法里访问 protected p
    3. 结论
      1. A3 的 main 方法里, 可以访问 protected p
      2. 表中的 subclass(diff pkg), 包含了 间接子类
  2. 关于 父类
    1. 对于 包外的父类, 我有疑问

      1. world 里, 是否包含 包外的父类
    2. 验证策略
      1. 有类 A1
      2. 另一个包里, 有 subclass A2, A2 有 protected 变量 p
      3. 尝试在 A1 的 main 方法里创建 A2 实例, 并尝试访问 p
    3. 结论
      1. 访问失败
      2. 包外的父类, 包含在 world 中

4. 其他

1. 其他问题

  1. java 的变量, 方法, 类, 接口 有很多的修饰词

    1. 访问控制相关, 已经提到
    2. static 会对 变量, 方法, 代码块, 生效
    3. final 会对 变量, 方法, 类生效
    4. abstract 会对 变量, 方法生效
    5. 然后这些东西, 排列组合之后, 又会让人陷入沉思
      1. 当然, 以上很可能会漏掉一些

2. 面试碰到了一个问题

  1. 问题

    1. 一个 private static 的变量
    2. 能否在该类的 main 方法中, 通过一个该类的是实例访问
  2. 我说
    1. 不能, 那是相当的自信
    2. 解释, 倒也没解释出来
    3. 凭感觉, 我是这么解释的
      1. 这个变量是 private
      2. 只能在 这个变量的方法里执行
      3. 但是这个 main 方法, 并不是那个对象的 main 方法, 所以不能取到 private 变量
      4. 如果要取, 只能在该类的其他方法里取
  3. 结论
    1. 当然是我错了
    2. 我自己尝试了一下, 是可以取到的
    3. 面试中我的思路不对, 并且对 访问控制的认识, 并不充分
      1. static 大概有这些认识, 但愿没错, 日后会确认

        1. static 变量, 是类独一份
        2. static 变量, 可以通过 实例 或者 类本身 来调用
        3. static 方法, 里面没有 this对象, 所以无法直接访问 实例变量
        4. static 变量初始化的时机, 通常在 类 装载后, 就会执行
        5. static 代码块, 在 初始化 的时候, 执行
    4. 如果重新分析, 思路大概会是这样
      1. protected 关键字, main方法 确定在 作用域内
      2. static 关键字, 可以由 变量实例 或者 类对象 直接调用
      3. 所以没有问题, 可以调用
  4. 后续
    1. 首先是了解哪些关键字相关的内容

      1. 单独作用
      2. 配合作用
    2. java 的类加载机制
      1. 这个说起来要深不深要浅不浅的, 早晚得看

ps

  1. ref

    1. https://stackoverflow.com/questions/215497/what-is-the-difference-between-public-protected-package-private-and-private-in
    2. https://www.cnblogs.com/aflyun/p/9562885.html
    3. https://www.cnblogs.com/jswang/p/7699643.html

Java 访问控制规则简介的更多相关文章

  1. Java基础-正则表达式(Regular Expression)语法规则简介

    Java基础-正则表达式(Regular Expression)语法规则简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正则表达式的概念 正则表达式(Regular Exp ...

  2. java.math包简介

    java.math包提供了java中的数学类 包括基本的浮点库.复杂运算以及任意精度的数据运算   '可以看得到,主要包括三个类一个枚举 BigDecimal和BigInteger接下来会详细介绍 先 ...

  3. [java] jsoup使用简介-汇率换算器实现-插曲2

    [java] jsoup使用简介-汇率换算器实现-插曲2 // */ // ]]>   [java] jsoup使用简介-汇率换算器实现-插曲2 Table of Contents 1 系列文章 ...

  4. Java Servlet 技术简介

    Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...

  5. Java基础类库简介

    Java基础类库简介 一.常用的基础类库:11个jar(Java Archive,Java归档)包 作为java语言使用者,我们可以感受到java语言带来的优势(平台无关.面向对象.多线程.高效易扩展 ...

  6. Java多线程概念简介 多线程中篇(一)

    Java的线程与操作系统的线程   在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...

  7. 《Java编程思想第四版》附录 C Java 编程规则

    附录 C Java 编程规则 本附录包含了大量有用的建议,帮助大家进行低级程序设计,并提供了代码编写的一般性指导: (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符 ...

  8. java 红包规则

    java 红包规则 拼手气红包: 规则:最大金额:全部金额/个数*倍数 最小金额:0.01 最后一个红包是全部金额-领取金额 随机分配 package com.utils; import java.m ...

  9. Emmet(Zen Coding)语法规则简介

    ———Emmet(Zen Coding)语法规则简介——— [Zen Coding可谓快速开发HTML和CSS的利器,主要采用仿css类选择器方式编写代码,以下是该利器的基本语法规则和代码示例] 基础 ...

随机推荐

  1. Ubuntu18.04 vmware环境下配置静态ip

    各种linux系统发行版本配置静态ip方法各不相同,dhcp获取的话ip可能会变动,如果用xshell等工具连接的时候还要改ip,很是麻烦: 参考了网上各种配置Ubuntu18.04配置静态ip的方法 ...

  2. 解决python3 UnicodeDecodeError: 'gbk' codec can't decode byte

    本来想写个html来玩玩,结果读取文件得时候就BUG了.... 以下代码读取html中无中文没有问题. def handle_request(client): buf = client.recv(10 ...

  3. [BZOJ 1972][Sdoi2010]猪国杀

    1972: [Sdoi2010]猪国杀 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 364  Solved: 204[Submit][Status][D ...

  4. JavaScript浏览器检测之客户端检测

    客户端检测一共分为三种,分别为:能力检测.怪癖检测和用户代理检测,通过这三种检测方案,我们可以充分的了解当前浏览器所处系统.所支持的语法.所具有的特殊性能. 一.能力检测: 能力检测又称作为特性检测, ...

  5. Ubuntu root 密码忘记-恢复

    @Ubuntu root 密码忘记-恢复 2012-04-27 11:09:22 方法一: 如果用户具有sudo权限,那么直接可以运行如下命令: #sudo su root #passwd #更改密码 ...

  6. js oc与线程

    分属不同的线程 //定义需要暴露给js的内容,这里我们只暴露personName和queryPersonName接口 @protocol PersonProtocol <JSExport> ...

  7. [Python 多线程] Lock、阻塞锁、非阻塞锁 (八)

    线程同步技术: 解决多个线程争抢同一个资源的情况,线程协作工作.一份数据同一时刻只能有一个线程处理. 解决线程同步的几种方法: Lock.RLock.Condition.Barrier.semapho ...

  8. Emgu学习之(三)——操作图像数据

    Visual Studio Community 2015 工程和代码:http://pan.baidu.com/s/1jHmlQeE 内容 在这篇文章中将提到以下内容: 修改像素值 图像ROI 图像加 ...

  9. virtualbox+vagrant学习-4-Vagrantfile-8-WinSSH

    WinSSH WinSSH通信器是专门为OpenSSH的Windows本机端口构建的.它不依赖于类posix的环境,这种环境消除了额外的软件安装(如cygwin)以获得适当功能的需求. 想获得更多的信 ...

  10. linux使用秘钥登录(禁用root密码登录)

    目的:为了巩固线上外网服务器的安全,避免黑客攻击植入木马,初步决定禁用root密码登录(安全强度低),统一使用秘钥登录(4096位长度,安全性较高) 具体操作如下: 一.生成ssh秘钥: ssh-ke ...