1. java的权限控制--大部分人都被错误洗脑了。

一个重大的坑,或者一个重大的误区,或者说一个洗脑了成千上万java编程者的错误概念就是:

public private protected 是基于方法和对象的。

比如说,private修饰的东西,对象不能访问,但是类中的方法可以访问。

比如说,public修饰的东西,对象和类中的方法都可以访问。

上面简直是误人子弟,你可以把这个概念全部当作垃圾回收了。

2.正解是什么?

我们先来讲 public 和 private ,请看一篇文章中截取的一部分:

In the JVM, like in Java, every member has an associated access attribute: public, private, protected, or default. The attribute determines the circumstances in which the member can be accessed. Let m be a member declared in a class c that belongs to a package p. If m is public, it can be accessed by (code in) any class. If m is private, it can be accessed only by c. If m has default access, it can be accessed only by any class that belongs to p.

好,我大致翻译一下:

java中的每个成员(member)都有一个访问控制修饰符:public,private,protected,或者啥也不写,就是默认。这个访问控制修饰符就决定了“这个成员能被访问到的坏境”。

假设有个类c,属于一个包p,c中有一个成员m。

如果m是public的,注意了,看清了后面这一句:“m就能被任何类中的代码访问”。【看清英文中的 by(code in) 】.

如果m是private的,“m就只能被c类中的代码访问”。

默认情况下,后面也讲了,如果m是默认,就是啥也不写,在本包内部,相当于public。

好,贴一段代码,让你明白这种说法是啥意思:

class C{
private int a;
public void printa(C c){
System.out.println(c.a);
}
}

上面的代码,我很明显访问了,C类中的a变量。而且是通过c.a这种方式访问的,也就是“洗脑观点中的[通过对象访问]”,照“洗脑观点”来说,这一句就是编译不通过了。

然而,这一句很明显,没啥错,为啥。你照正解去解读:

我访问的环境是在哪?在C类中,意思就是说,我这句代码出现在C类中,记得上面的【by code in】么?。这样当然可以访问C类的a。【你甭管是哪个对象的a,跟具体对象无关系】【你甭管是哪个对象的a,跟具体对象无关系】【你甭管是哪个对象的a,跟具体对象无关系】重要的事说三遍。

3.再来讲复杂一点的 protected。

还是先搬英文:

If m is protected, things are slightly more complicated. First, m can be accessed by any class belonging to p, as if it had default access. In addition, it can be accessed by any subclass s of c that belongs to a package different from p, with the following restriction: if m is not static, then the class o of the object whose member is being accessed must be s or a subclass of s, written o ≤ s (if m is static, the restriction does not apply: m can be always accessed by s). The relationship among c, s, o, m, and p is depicted in Figure 1, where the double-line arrow labeled by + denotes one or more direct superclasses and the double-line arrow labeled by ∗ denotes zero or more direct superclasses.

好,我还是先翻译:

如果m是protected的,情况就略微复杂了呢。

第一,m可以被本包中的其他类随意访问,注意,我们说类的时候,你一定要加一句,by code in,来反洗脑。也就是说,m可以被本包中任意类的代码访问。

下面这个写的复杂了,我简化一下说法,画个图:

假设p是包名,k是包名,也就是说,不是一个包。

s继承自c。

那么s类中的代码想要访问m,有一个限制:

O必须是s或者s的子类类型。

也就是英文中的o ≤ s。

这样做的原因是,自己去想吧。。。。。。。

或者你可以自己找一下这篇文章:

Checking Access to Protected Members in the Java Virtual Machine

java protected 的细节的更多相关文章

  1. Java总结——常见Java集合实现细节(1)

    Java提高——常见Java集合实现细节(1) 2018年04月18日 15:07:35 阅读数:25 集合关系图 Set和Map set代表一种集合元素无序.集合元素不可重复的集合 map代表一种由 ...

  2. java基础部分细节

    访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权限. 默认的,也称为 default,在同一包内可见,不使用任何修饰符. 私有的,以  ...

  3. java 代码的细节优化

    前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑 的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用 ...

  4. java protected修饰符说明

    1. 简介 对protected修饰符进行阐述,结合Object类的clone方法进行说明.其中clone方法如下:protected Object Object.clone(): 关于protect ...

  5. java基础-反射(细节)

    java面试题--java反射机制? Java反射机制的作用:1)在运行时判断任意一个对象所属的类.2)在运行时判断任意一个类所具有的成员变量和方法.3)在运行时任意调用一个对象的方法4)在运行时构造 ...

  6. Java集合详解8:Java的集合类细节精讲

    Java集合详解8:Java集合类细节精讲 今天我们来探索一下Java集合类中的一些技术细节.主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充.可能不全面,还请谅解. 本文参考:http:// ...

  7. Cordova插件中JavaScript代码与Java的交互细节介绍

    在Cordova官网中有这么一张架构图:大家看右下角蓝色的矩形框"Custom Plugin"--自定义插件.意思就是如果您用Cordova打包Mobile应用时,发现您的移动应用 ...

  8. 35个Java代码优化的细节,你知道几个?

    前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没 ...

  9. Java 代码注意细节

    代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 代码优化细节 1.尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final ...

随机推荐

  1. ORM小练习代码

    DOG类 namespace RupengORM { public class Dog { public Dog() { } /// <summary> /// 显示提供无参构造函数 // ...

  2. Spark算子选择策略

    摘要  1.使用reduceByKey/aggregateByKey替代groupByKey 2.使用mapPartitions替代普通map 3.使用foreachPartitions替代forea ...

  3. Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析

    Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析     Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析1 存 ...

  4. iOS-网络处理

    1.iOS-网络基础 2.iOS-网络处理框架AFN 3.iOS-网络爬虫

  5. Adobe Photoshop CC 打开时报错~配置错误:请卸载并重新安装该产品

    后期会在博客首发更新:http://dnt.dkill.net 异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 个人估计,要么安 ...

  6. C#单例模式详解

    C#要实现单例模式必须要有以下三点: 声明私有静态成员.私有化构造函数.静态函数返回实例. private static GameManager s_GameManager=null; private ...

  7. Html标签的语义化

    为了使我们的网站更好的被搜索引擎抓取收录,更自然的获得更高的流量,网站标签的语义化就显得尤为重要.所谓标签语义化,就是指标签的含义. 为了更好的理解标签的语义化,先看下面这个例子: 1 <tab ...

  8. C#互斥体——Mutex

    Mutex对象是一个同步基元,可以用来做线程间的同步. 若多个线程需要共享一个资源,可以在这些线程中使用Mutex同步基元.当某一个线程占用Mutex对象时,其他也需要占用Mutex的线程将处于挂起状 ...

  9. Java中的网络编程

    ​ Java中的网路编程主要是Java的Socket编程,属于JavaEE中的高级的部分,以下内容是对java网路编程的一个小结,代码都是经过编译调试的 C/S程序应用:客户/服务器模式,如QQ客户端 ...

  10. EntityFramework 7 Left Join Where is error(Test record)

    First of all, my English is very poor, so I may not be a very good expression, very sorry! In this b ...