概述
阅读《java核心技术 卷I》中“受保护访问”时,读得一知半解。书中对protected关键字作用一笔带过。而protected访问级别确实不太好理解。下面对java的4种访问级别按照访问性递增顺序整理如下:
一、私有(private)
被private修饰的成员变量和方法,仅仅对本类可见,只能被本类的内部方法调用。(案例略)
助记:我的东西中,private修饰的部分,我不跟别人分享,只有自己才能知道。
二、缺省(package-private)
当不使用修饰符时(不要使用default关键字,会报错),在技术上被称为“缺省访问级别”,成员变量和方法默认是对本包可见。(案例略)
助记:我的东西中,没有访问修饰符声明的部分,默认可以和我的邻居(住附近的那些人)分享。
三、受保护(protected)(重点)
一个类Parent中的protected成员变量和方法可以被它的子孙类继承,比如Son是Parent的子类,Grandson是Son的子类,那么Grandson、Son类都继承Parent类的protected成员变量和方法,如上图所示。
如果Son(Grandson同理)类在自身中创建了一个Son实例,那么该实例总是可以通过“.”运算符访问继承的或自己内部定义的protected变量和方法;但是在另外一个类中,比如在Other类中用Son类创建了一个实例son,该实例通过"."运算符访问protected变量和方法的权限规则如下:
- 对于子类Son中定义声明的protected成员变量和方法,只要Other对象和Son类在同一个包中,实例son就可以访问这些protected成员变量和方法。
- 对于子类Son从父类继承而来的protected成员变量和方法,需要追溯到这些protected成员变量和方法所在的“祖先”类,比如Son的祖先是Parent类,只要Other类和Parent类在同一个包中,son实例就能访问继承自Parent类的protected变量和方法。
助记:我的东西中,protected修饰的部分,不仅可以和邻居(住附近的那些人)分享,也可以跟不在家(虽然不在同一个包)的儿子分享【但有一些的限制,见下面案例】。
案例代码如下:
Parent类
package com.learning.protectedDemo;
/**
* 父类(基类).
*/
public class Parent {
protected void getName() {
System.out.println("I'm Parent!");
}
}
Son类
package com.learning.protectedDemo.package_one;
import com.learning.protectedDemo.Parent;
/**
* Son类.(位置:和Parent类不同包。)
*/
public class Son extends Parent {
// Son自身也可以定义protected访问级别的方法
protected void sing() {
System.out.println("I'm son!");
}
public static void main(String[] args) {
Parent parent = new Parent();
parent.getName(); //(1) 编译失败。子类与父类不在同一包中时,子类中不能访问父类实例的protected方法。只有当子类与父类同包时,子类中才能访问父类实例的protected方法。
Son son = new Son();
son.sing(); //(2) 编译通过。原因:在Son类自身中创建了一个Son类的实例,那么该实例总是可以通过“.”运算符访问继承的或自己定义的protected变量和方法;
son.getName(); //(3) 编译通过。原因同上。
}
}
Other类
package com.learning.protectedDemo.package_one;
import com.learning.protectedDemo.Parent;
/**
* 其他类.(位置:和Son类同包,和Parent类不同包)
*/
public class Other {
public static void main(String[] args) {
Son son = new Son();
son.sing(); //(4) 编译通过:由于Other类和Son类在同一个包下,所以可以声明Son实例,通过实例中定义的protected修饰的sing方法;
son.getName(); //(5) 编译失败:由于Son类中的getName方法是继承于Parent类,Other类和Parent类不在同一个包下,无法访问Son类继承而来的protected方法。
Parent parent = new Parent();
parent.getName(); //(6) 编译失败:由于Other类和Parent类不在同一个包内,Other类中不可以访问Parent类实例的protected方法;
}
}
四、共有(public)
被public修饰的成员变量和方法,对外部完全可见。声明对象实例后(无论在什么位置),实例均可通过“.”直接访问pulic成员变量和方法。(案例略)
助记:我的东西中,public修饰的部分,可以和任何人分享。
五、总结
修饰词 | 本类 | 同一个包的类 | 继承类 | 其他类 |
---|---|---|---|---|
private | √ | × | × | × |
无(默认) | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
六、参考资源
- Java 中的权限修饰符(protected)
- java protected修饰符说明
- 【Java面试题】访问修饰符public、private、protected、default(默认不写) 区别
最后
以上就是冷酷铅笔为你收集整理的java——访问修饰符(private/public/protected/缺省)学习的全部内容,希望文章能够帮你解决java——访问修饰符(private/public/protected/缺省)学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复