java protected 的细节

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

时间: 2024-08-26 01:06:36

java protected 的细节的相关文章

java.lang.String细节

String field;@Testpublic void test01() {    String a = "aaa";    String b = "aaa";    String c = new String("aaa");    String d = new String("aaa");    System.out.println(a == b);       //output: true    System.out.

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

Java提高--常见Java集合实现细节(1) 2018年04月18日 15:07:35 阅读数:25 集合关系图 Set和Map set代表一种集合元素无序.集合元素不可重复的集合 map代表一种由多个key-value对组成的集合 set和map的关系 set和map的接口十分类似. Map的key有一个特征:所有key不能重复,且key之间没有顺序,也就是说将所有key组合起来就是一个Set集合. Map-->Set : Map中提供了  Set<k> keySet()  返回所有

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

前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了. 代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨:但是如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的. 代码优化的目标

Java 代码注意细节

代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 代码优化细节 1.尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的.为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写.如果指定了一个类为final,则该类所有的方法都是final的.Java编译器会寻找机会内联所有的final方法,内联对于提升Java

Java程序优化细节

1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:    1).控制资源的使用,通过线程同步来控制资源的并发访问;    2).控制实例的产生,以达到节约资源的目的;    3).控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信. 2. 尽量避免随意使用静态变量 要知道,当某个对象被定义为stataic变量所引用,那么gc通常是不会回收这个对象所占有的内存,如

[email&#160;protected]小细节

关于@RequestBody  参数类型自己的包装类,还是类似String/int,区别: [email protected] LoginParmar parmar String user_number = parmar.getUser_number(); String user_password = parmar.getUser_password(); [email protected] String accessToken JSONObject json = JSONObject.fromO

reverse words in a string(java 注意一些细节处理)

题目:reverse words in a string Given an input string, reverse the string word by word. For example,Given s = "the sky is blue",return "blue is sky the". 解析:将字符串中的单词逆序输出 借助一个堆栈,从前向后遍历字符串,遇到空,跳过,直到非空字符,拼接word,等再次遇到空时,得到一个word,加入堆栈, 以此类推,直到

java和python细节总结

//JAVA中对arrayList的初始化,能够分配空间,不能之间让一个ArrayList赋值给另外一个ArrayList,这样是引用赋值,当一个改变时候,另外一个也改变 List<String> tmp = new ArrayList<String>(Arrays.asList(new String[sub.size()])); //python中List.append(另外一个list),当另外一个List值改变时候,List也会改变,所以一般会先声明一个list变量,将另外一

java protected 与默认权限的区别

作用域   当前类    同package   子孙类 其他package  public √   √  √ √  protected √ √ √ ×  friendly(default) √ √ × ×  private √ × × ×  friendly 就是默认访问权限(成员变量前面不加public protected 和 private)重点看protected和fiendly两种权限的区别:对于protected成员变量,子孙类在任何地方都能访问(包内或者包外),但是对于friendl