java中private,public,protected详解
参照甲骨文的java文档:点击打开链接
访问级别
访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。有两个级别的访问控制:
1.在顶级
- public或package-private(没有显式修饰符即默认权限)。
类可以用修饰符public声明,在这种情况下,类对所有类都可见。如果一个类没有修饰符(默认,也称为package-private),它只在自己的包中可见。
2.在成员级别
- public,private,protected或package-private(没有显式修饰符即默认权限)。
在成员级别,也可以使用public修饰符或无修饰符(package-private),如同顶级类一样,具有相同的含义。
对于成员,除public和默认外有两个附加的访问修饰符:private和protected:
private修饰符指定该成员只能在其自己的类中访问。
protected修饰符指定该成员只能在其自己的包(如package-private)中访问,此外还可以由另一个包中的该类的子类访问。
下表显示了对每个修饰符允许的成员的访问权限。
第一列指示类本身是否有权访问由访问级别定义的成员。正如你可以看到,一个类总是有权访问它自己的成员。
第二列指示与该类(不管其父级)相同的包中的类是否具有对成员的访问权限。
第三列指示在此包外部声明的该类的子类是否有权访问成员。
第四列指示是否所有类都具有对成员的访问权限。
访问级别通过两种方式影响您
当您使用来自另一个源(例如Java平台中的类)的类时,访问级别将确定您自己的类可以使用的那些类的哪些成员
第二,当你写一个类时,你需要决定每个成员变量和类中的每个方法应该具有什么访问级别。
让我们看一下类的集合,看看访问级别如何影响可见性。下图显示了此示例中的四个类以及它们之间的关系。
此例中:
One包有Alpha和Beta两个类,Two包中有AlphaSub和Gamma类,其中AlphaSub继承Alpha
下表显示了Alpha类的成员(成员变量、成员函数)对于可应用于它们的每个访问修饰符的可见性。
Alpha类内所有成员都可以访问
Beta与Alpha在同一包中,因而Alpha的私有成员Beta不能访问
Alphasub与Alpha不在同一包中,但AlphaSub是Alpha的子类,因而AlphaSub不能访问Alpha的默认和私有成员
Gamma与Alpha位于不同包且无继承关系,因而Gamma只能访问Alpha的public成员
选择访问级别的提示:
如果其他程序员使用你的类,你想要确保不会发生滥用错误。访问级别可以帮助您这样做。
1.使用对特定成员有意义的最严格的访问级别。使用私人,除非你有一个很好的理由不使用。
2.避免使用公共字段(常量除外)。 (本教程中的许多示例使用公共字段。这可能有助于简要说明一些要点,但不推荐用于生产代码。)公共字段往往会将您链接到特定实现
并限制您在更改代码时的灵活性。
参照甲骨文的java文档:点击打开链接
文档看完了就实际编写例子验证一下吧(只验证了成员函数):
其中每个类中的test方法是用来测试的
Alpha.java
分别定义了四个public,protected、默认,private权限的方法
package com.one;public class Alpha
{public void test(){this.pub();this.pro();this.def();this.pri();}public void pub(){System.out.println( "public");}protected void pro(){System.out.println( "protected");}void def(){System.out.println( "default");}private void pri(){System.out.println( "private");}
}
Beta.java
和Alpha在同一包下
package com.one;public class Beta
{public void test(){Alpha alpha = new Alpha();alpha.pub();alpha.pro();alpha.def();alpha.pri();}}
AlphaSub.java
AlphaSub作为Alpha的子类,用super进行验证。
package com.two;
import com.one.Alpha;public class AlphaSub extends Alpha
{public void test(){super.pub();super.pro();super.def();super.pri();}
}
Gamma.java
与Alpha不同包且无继承关系
package com.two;
import com.one.Alpha;public class Gamma
{public void test(){Alpha alpha = new Alpha();alpha.pub();alpha.pro();alpha.def();alpha.pri();}
}
接下来就开始验证:
1.验证Alpha类
import com.one.Alpha;class Test
{public static void main(String[] args) {new Alpha().test();}
}
分别编译Alpha.java和Test.java:
F:\javaStuff>javac -d F:\javaStuff Alpha.javaF:\javaStuff>javac Test.javaF:\javaStuff>java Test
public
protected
default
private
编译没有报错,即证明四种访问权限在类内都是可以访问的
2.验证Beta类
依次编译Alpha.java和Beta.java
F:\javaStuff>javac -d F:\javaStuff Alpha.javaF:\javaStuff>javac -d F:\javaStuff Beta.java
Beta.java:11: 错误: pri()可以在Alpha中访问privatealpha.pri();^
1 个错误
可以看到编译Beta,java时报错,提示Alpha类中的pro方法是私有的,不可访问
3.验证AlphaSub类
依次编译Alpha.java和AlphaSub.java
F:\javaStuff>javac -d F:\javaStuff Alpha.javaF:\javaStuff>javac -d F:\javaStuff AlphaSub.java
AlphaSub.java:10: 错误: def()在Alpha中不是公共的; 无法从外部程序包中对其进行访问super.def();^
AlphaSub.java:11: 错误: pri()可以在Alpha中访问privatesuper.pri();^
2 个错误
编译报错
Alpha的def方法为默认权限无法在外部包访问
Alpha的pri方法为私有权限无法在外部包访问
4.验证Gamma类
依次编译Alpha.java和Gamma.java
F:\javaStuff>javac -d F:\javaStuff Alpha.javaF:\javaStuff>javac -d F:\javaStuff Gamma.java
Gamma.java:10: 错误: pro()可以在Alpha中访问protectedalpha.pro();^
Gamma.java:11: 错误: def()在Alpha中不是公共的; 无法从外部程序包中对其进行访问alpha.def();^
Gamma.java:12: 错误: pri()可以在Alpha中访问privatealpha.pri();^
3 个错误
3个错误
Alpha的def方法为默认权限无法在外部包访问
Alpha的pri方法为私有权限无法在外部包访问
Alpha的pro方法为保护方法无法被外部非子类访问
代码的目录结构如下
因为编译Beta、AlphaSub和Gamma时都有编译错误自然就不会生成com.two包了
java中private,public,protected详解相关推荐
- Java中的Runtime类详解
Java中的Runtime类详解 1.类注释 /**Every Java application has a single instance of class Runtime that allows ...
- Java 中的伪共享详解及解决方案
转载自 Java 中的伪共享详解及解决方案 1. 什么是伪共享 CPU 缓存系统中是以缓存行(cache line)为单位存储的.目前主流的 CPU Cache 的 Cache Line 大小都是 ...
- Java中的static关键字详解
** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...
- Java中的main()方法详解
源文作者:leizhimin 源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...
- java中Freemarker list指令详解
java Freemarker中list指令主要是进行迭代服务器端传递过来的List集合. 定义 <#list nameList as names> ${names} </#list ...
- java中properties作用,Java中Properties的使用详解
Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支 持的配置文件,配置文件中很多变量是经常改变的,这样做也 ...
- java中list和map详解
java中list和map详解 一.概叙 List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口, List下有ArrayList,Vector,LinkedL ...
- stringtokenizer java_基于Java中的StringTokenizer类详解(推荐)
StringTokenizer是字符串分隔解析类型,属于:Java.util包. 1.StringTokenizer的构造函数 StringTokenizer(String str):构造一个用来解析 ...
- Java中的运算符——逻辑运算符详解
逻辑运算符主要包括逻辑与( & ),逻辑或( | ),逻辑异或( ^ ),短路与( && ),短路或( || ).所有逻辑运算符的特点是操作数都是布尔类型,并且最终的运算结果也 ...
- Java中的运算符——赋值运算符详解
赋值运算符主要是这几种:=.+=.-=.*=./=.%=,其它和二进制相关的内容这里就不详细解释了.赋值类的运算符包括基本赋值运算符(=)和扩展的赋值运算符(+=.-=.*=./=.%=).我们来看一 ...
最新文章
- Java 动态语言
- Java判断语句 循环语句
- 多雨季节 数据中心亦要“防汛”
- SAP-ABAP程序发送邮件
- Docker的学习笔记(开发的技术分享转发)
- 模仿Linux内核kfifo实现的循环缓存
- hbase的2.2.4版本支持哪个版本的hadoop_Hadoop 2.7 不停服升级到 3.2 在滴滴的实践
- eclipse 方法补全快捷键设置
- PPAPI开发之路(一)环境配置
- 造节新案例,这家互联网公司用一场声音节圈住了声控党的心!
- 第二章 第七课 Scratch作品:神奇的小猫(脚本块:外观)
- 【蓝桥杯专题】 贪心(C++ | 洛谷 | acwing | 蓝桥)
- python 爬取拉钩网数据
- 在 Flutter 中自定义画笔 Painter
- 使用Git对Word或Excel文件进行版本管理
- java封神OL_MobaXterm:远程终端登录软件封神选手
- UTC和GMT时间辨析
- IMS核心构成与基本业务过程
- 深入理解JVM(四)JVM的垃圾回收机制
- OpenCV轮廓提取和椭圆拟合