java权限控制最小访问原则_[Java教程]Java之路(五) 访问权限控制

[Java教程]Java之路(五) 访问权限控制

0 2016-12-09 01:00:14

在Java中,所有事物都具有某种形式的访问权限控制。

访问权限的控制等级从最大到最小依次为:public,protected,包访问权限(无关键词)和private。

public,protected和private这几个Java访问权限修饰词在使用时,是置于类中每个成员(域或者方法)定义之前的。

一、类成员的访问权限

取得对某成员的访问权的唯一途径是:

1).使该成员成为public。无论谁在哪里,都可以访问该成员;

2).通过不加访问权限的修饰词并将其他类放置于同一包内的方式给成员赋予包访问权限,包内的其他类可以访问该成员;

3).继承而来的类既可以访问public成员也可以访问protected成员。

4).提供访问器和变异器方法,以读取和改变数值。

1.包访问权限

默认访问权限没有任何关键字,但通过是指包访问权限,这表示当前报中的所有其他类都对那个成员有访问权限,但是对于这个包之外的所有类,这个成员确是private。

包访问权限将包内所有相关的类组合起来,以使它们彼此之间可以轻松地相互作用。

注意:如果两个类处于相同的目录下,并且没有给自己设定任何包名称,Java会将这样的文件自动看作是隶属于该目录的默认包之中,于是这些文件互相之间有包访问权限。

下面的例子说明了这个问题://类Cake和Pie处于同一目录下,没有明确的显示在任何包中class Pie{ void f(){ System.out.println("Pie.f()"); }}class Cake{ public static void main(String[] args){ Pie x = new Pie(); x.f(); }}//输出为Pie.f()

2.public:接口访问权限

使用关键字public,就意味着其后的成员声明对所有人可用,特别是使用类库的客户程序员也是如此。

3.private:你无法访问

关键字private表示出了包含该成员的类之外,其他任何类都无法访问这个成员。同一包内的其他类不可以访问这个类的private成员,因此这相当于自己隔离了自己。

private关键字的这种作用有许多用途,比如,控制如何创建对象,阻止别人直接访问某个特定的构造器(或全部构造器)。看下面的例子:class Sundae{ private Sundae(){} static Sundae makeASundae(){ return new Sundae(); }}public class IceCream { public static void main(String[] args){ Sundae x = Sundae.makeASundae(); }}

这个例子里,我们可以通过调用makeASundae()方法来创建Sundae对象,但是不能通过构造器来创建。

这对于类中的private域同样适用。

但是要注意一点,不能因为在类中某个对象的引用是private,就认为其他的对象无法拥有该对象的public引用。

4.protected:继承访问权限

如果创建了一个新包,并自另一个包继承类,那么唯一可以访问的成员就是源包的public成员。

有时,基类的创建者希望将某个特定成员的访问权限赋予派生类而非所有类,这就需要使用关键字protected来实现。

注意,protected也提供包访问权限,即相同包内的其他类也可以访问此类的protected元素。

二、接口和实现

访问权限的控制通常被称为具体实现的隐藏。

把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。

出于两个重要的原因,访问权限控制将权限的边界划在了数据类型的内部:

1.要设定客户端程序员可以使用和不可以使用的界限。可以在结构中建立自己的内部机制,儿不必担心客户端程序员会偶然地将内部机制当做是他们使用的接口的一部分。

2.接口和具体实现进行分离。

三、类的访问权限

Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的。

修饰词必须放在关键字class之前。例如:public class Widget{......}或improt access.Widget;

要知道,类不可以是private的(如果类是private的,那么除了该类之外,其他任何类都不可以访问它),也不可以是protected的(其实一个内部类可以是private或protected的,但这是特例,后续文章中叙述),只可以是包访问权限或public的。

如果不希望其他人访问该类,可以把该类的所有构造器都指定为private,阻止任何人创建该类的对象。但这也有例外,这种做法不能阻止你在该类的static成员内部创建该类。我们来看下边的例子:class Soup1{ private Soup1(){} public static Soup1 makeSoup(){ //使用静态方法创建对象 return new Soup1(); }}class Soup2{ private Soup2(){} private static Soup2 ps1 = new Soup2(); //使用单例模式创建对象 public static Soup2 access(){ return ps1; } public void f(){}}public class Lunch { void testPrivate(){ //Soup1 soup = new Soup1; 不能执行 } void testSingleton(){ Soup2.access().f(); }}

我们可以看到,Soup1和Soup2类的构造器都是private的,谁也无法直接使用构造器来创建该类的对象了。但是我们也可以使用这两个类:在Soup1中创建一个static方法,在这个方法中使用构造函数创建一个Soup1对象并返回它的引用;Soup2的创建用了设计模式中的单例模式,只能创建它的一个对象。Soup2类的对象是作为Soup2的一个static private成员而创建的,所以有且仅有一个,而且除非是通过public方法access(),否则是无法访问到它的。

此外,一些限制也值得注意:

1.每个编译单元都只能有一个public类。

2.public类的名称必须完全与含有给编译单元的文件名相匹配,包括大小写。

3.如果编译单元内没有带public的类,这时可以对文件随意命名。

本文网址:http://www.shaoqun.com/a/267687.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

JAVA

0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jndi tcp_spring配置下通过tomcat的jndi服务连接数据库

在开发OA系统因为采用了springhibernate架构,其中数据源很多,采用jdbc注入到spring中,结果时间长了,数据库容易断开,改成了jndi,jndi由spring去管理1、配置jndi文件文件位置%TOMCAT_HOME% \conf\Catalina\l…

php 下拉菜单 多个值,PHP,而foreach下拉菜单在所有下拉菜单中都具有相同的选定值...

3个带值的下拉菜单$options1 array( 1> Equals, ≠ Does not Equal, > Is greater than, ≥ Is greater than or equal to, < Is less than, ≤ Is less than or equal, ? Contains, ? Does not contain);$counter_maximum 3;while ($counter < $counter_maxim…

php 安装pdo odbc,PHP PDO ODBC连接

我们正在尝试通过PHP中的ODBC创建与SQL数据库的连接.这是我们目前的脚本&#xff1a;$cnx new PDO("odbc:Driver{EFR};Serverlocalhost;Port:7004;DatabaseEFR;UidLcLfVJFLTKTCEHRO;Pwd*********;");该驱动程序正在Qlikview中工作,该Qlikview也连接到此数据库.这个驱…

php 鼠标点击图片放大,css3如何实现鼠标放上图片放大?(附代码)

在css3的学习中&#xff0c;我们会经常做一些小的动画效果&#xff0c;这感觉非常有趣&#xff0c;所以今天的这篇文章将给大家来介绍关于css3实现图片放大的一个效果&#xff0c;有兴趣的小伙伴可以看一下。我们都知道css3中增加了一个transform属性应用于元素的2D或3D转换&am…

php 文件保存函数,php 写入和读取文件函数

//读取文件函数function readfromfile($file_name) {if (file_exists($file_name)) {$filenumfopen($file_name,"r");flock($filenum,lock_ex);$file_datafread($filenum, filesize($file_name));rewind($filenum); //osphp.com.cnfclose($filenum);return $file_dat…

java入职华为,通过这9个Java面试题,就可以入职华为啦

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1&#xff0e;Java程序的种类有(BCD )A&#xff0e;类(Class) B&#xff0e;Applet C&#xff0e;Application D&#xff0e;Servlet2&#xff0e;下列说法正确的有( BCD)A&#xff0e; 环境变量可在编译source code时指定B&#x…

java hive查询,hive查询报错

我在每次添加where条件&#xff0c;或者使用子查询时&#xff0c;都会报这个错误。以下是报错详情java.lang.Exception: java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTaskj…

java死锁怎么用jvm调试,线程死锁演示,线程锁演示,模拟JVM的线程次序调度

线程死锁演示&#xff0c;线程锁演示,模拟JVM的线程次序调度模拟JVM的线程次序调度注释A&#xff0c;不注释B&#xff0c;一般不死锁注释B&#xff0c;不注释A&#xff0c;死锁都不注释&#xff0c;随机package org.he.bin;/** * author BenHe * email qing878gmail.com * for …

脉位调制解调 matlab,通信原理与matlab仿真v2 第五章 DBPSK调制解调器(1)

在毕业设计的相关课程中&#xff0c;已经提及了这个DPSK调制方式。不过如果把它放在理论教学课程中来讲&#xff0c;就需要补充一些基本知识。当然还会给同学们看一下实际在卫星通信中使用的DBPSK程序。之前讲到了BPSK&#xff0c;回顾一下发送滤波器的知识吧。由于信号要在信道…

matlab scatter3函数,MATLAB3维散点图scatter3plote.pptx

MATLAB3维散点图scatter3plote第三章 Matlab图形绘制;主要内容;3.1 二维曲线的绘制;yrand(100,1);plot(y);x0:0.01*pi:2*pi;y[sin(x’),cos(x’)];plot([x’,x’],y);;Matlab绘图命令中的各种选项;2、特殊的二维图形函数;②极坐标系函数polar&#xff0c;调用形式为&#xff1a…

php首页遍历出商品详情页,ECSHOP首页/分类页/详情页各页面调用显示销量

1、在首页新品、热卖、精品等调用商品销售打开 includes/lib_goods.php在文件尾部?>前添加以下代码&#xff1a;function get_buy_sum($goods_id){$sql "select sum(goods_number) from " . $GLOBALS[ecs]->table(order_goods) . " AS g ,".$GLOBA…

matlab地址数据类型uns,使用matlab生成sine波mif文件

使用matlab生成sine波mif文件作者&#xff1a;lee神在使用altera 的FPGA中的rom過程中常常會使用到.mif文件或.hex文件。對於初學者&#xff0c;無論mif還是hex都是很令人疑惑的東西&#xff0c;這里就對mif文件的格式及其創建做一點簡單的說明。Mif是memory initialization fi…

matlab计算频域动态性能指标,基于MATLAB自动控制系统时域频域分析与仿真.doc

word文档 可编辑复制word文档 可编辑复制基于MATLAB的自动控制系统时域频域分析与仿真摘 要自动控制系统就是在无人直接操作或干预的条件下&#xff0c;通过控制装置使控制对象自动的按照给定的规律运行&#xff0c;使被控量按照给定的规律去变化的系统。在现代工业生产中&…

php历史上的今天源码,代码获取历史上的今天发生的事_基础知识

//http://history.sturgeon.mopaas.com //主页//http://history.sturgeon.mopaas.com/jsonp?callback? //jsonp接口//http://history.sturgeon.mopaas.com/jsonp //json接口//http://history.sturgeon.mopaas.com/jsonp/11 //历史上的1月1日//http://history.sturgeon.mopaas…

OpenAI科学家Hyung Won Chung演讲精华版

文章目录 第一个观点&#xff1a;涌现第二个观点&#xff1a;如何扩大规模1、标记化2、嵌入3、计算4、评估&#xff08;损失函数&#xff09;5、反向传播 最近从Google跳槽到OpenAI的AI科学家 Hyung Won Chung 比较拗口&#xff0c;我就简称尚哥了 他最近做了一个技术演讲 …

php如何实现购物时数量增减,1、vuex状态管理--购物车数量增减

GIF.gif1、购物车数量增减-import { mapState,mapMutations} from vuex //引入mapState、mapMutations映射函数export default{computed:{...mapState({changableNum:state > state.headerStatus.changableNum, //用模块headerStatus里的状态 changableNumdisabled:state &g…

oracle9i目录不停增长,丢失所有文件、拥有全备份,缺少后增加的文件

1.测试,移除当前所有文件从备份中恢复数据文件及控制文件(丢失后增加的文件)SQL> startup;ORACLE 例程已经启动。Total System Global Area 47259136 bytesFixed Size 454144 bytesVariable Size 29360128 bytesDatabase Buffers 16777216 bytesRedo Buffers 667648 bytes数…

oracle中存储过程和函数有什么区别,Oracle中存储过程和函数的区别

Oracle中存储过程和函数的区别存储过程和函数&#xff1a; www.2cto.com例子&#xff1a;[sql]//创建过程create or replace procedure add_emailinfo(namee email_info.fullname%type &#xff0c;address email_info.email_address%type )isbegininsert into email_info(ful…

oracle数据分布不均,oracle性能优化操作七:索引提高数据分布不均匀时查询效率...

索引的选择性低&#xff0c;但数据的分布差异很大时&#xff0c;仍然可以利用索引提高效率。 A、数据分布不均匀的特殊情况下&#xff0c;选择性不高的索引也要创建。 表ServiceInfo中数据量很大&#xff0c;假设有一百万行&#xff0c;其中有一个字段DisposalCourseFlag&#…

php读取excel的数据,php读取excel文件数据

require_once $_SERVER[‘DOCUMENT_ROOT‘].‘/Classes/PHPExcel.php‘;require_once $_SERVER[‘DOCUMENT_ROOT‘].‘/Classes/PHPExcel/IOFactory.php‘;function getReadExcel($uploadfile,$time){$extension substr($uploadfile,strrpos($uploadfile,‘.‘)1);switch ($ex…