java 接口访问权限_详解Java之路(五) 访问权限控制

在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.mzph.cn/news/528078.shtml

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

相关文章

java for foreach 效率_Java中LinkedList的fori和foreach效率比较

在《Java中ArrayList的fori和foreach效率比较》中对ArrayList的两种循环方式进行了比较,本次对LinkedList的两种遍历方式进行效率的比较。1. list的元素为自定义的对象自定义的Student类public class Student {private String name;private Integer age;public Stud…

java teechart怎么用_TeeChart使用范例

在窗体上加入TeeChart控件,并通过属性加入4个TLineSeries,分别命名为Series1,Series2,Series3,Series4,并添加一按钮Button1,其Click事件为:procedure TForm1.Button1Click(Sender:TObject);beginSeries1.FillSampleValues(200);Series2.FillSampleValue…

java c标签 if有值_c标签 if else c标签 总结

[b]STL标签用法关键字:JSTL标签、、、、、、、、原来一直没有看过,我说过我是新手,但是好多资料上似乎也不重视 JSTL 。我看项目源代码发现其中使用到了这个标签库,感觉其还真是方便,页面看起来更加清爽。减少了 JAVA …

java多态的两种形式_java核心(八):继承与方法重写、final、多态性的两种描述形式...

一、继承的作用子类继承父类的属性和方法,实现代码的复用;子类扩充自己的标准,实现精细化的类型定义。二、子类构造方法的限制子类在实例化的时候,默认先实例化父类对象,然后再实例化本类对象;子类构造方法…

java bean状态_无状态和有状态企业Java Bean

我将通过Java EE 6教程,我试图了解无状态和有状态会话bean之间的区别。如果无状态会话bean不在方法调用之间保留它们的状态,为什么我的程序执行它的方式?package mybeans;import javax.ejb.LocalBean;import javax.ejb.Stateless;LocalBeanSt…

java 树的数据结构_Java数据结构之树(二叉树)

一、概述1.以二叉树为例熟悉树形结构,二叉树的定义如下:1.1.二叉树:是结点有限的集合,这个集合或者是空,或者由一个根结点或两棵互不相交的称为左子树和右子树的二叉树组成。二叉树是一个递归的定义,从中可…

java 纯面向对象_Java到底是不是一种纯面向对象语言?

原标题:Java到底是不是一种纯面向对象语言?Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它。在我刚开始学习 Java 的前面几年,我从书本里知道了 Java 是遵循 “面向对象编程范式(Object Orie…

java爬虫post 404_POST 后台404错误

今天在开发一个用户信息更新模块的时候遇到了两个问题:1、在我提交form表单的时候我希望在提交表单之后页面不刷新,同时返回更新数据2、向后台POST表单信息的时候,后台显示POST url 404的错误解决第一个问题的使用使用jquery.form的插件进行异…

java防止重复启动bat_java调用exe,及调用bat不成功的解决办法

开门见山的说,文件目录如下想调用123.exe,但是尝试了几次调用不到,然后写了个bat。初始内容如下echo offD:cd test"123.exe"双击可以运行,但是java代码无法调用,怪事。于是,辗转反侧,苦思冥想&am…

freetextbox java_FreeTextBox 增加按钮

红色部分是我自己添加上去的,它默认的文件夹是aspnet_client\FreeTextBox,所以ButtonImage这个属性是指在aspnet_client\FreeTextBox\images里的psn.gif图片。ScriptBlock 当然是指要执行的确JS事件了。其它类型的ToolbarButton有:Bold 加粗…

mysql for 语句执行顺序_MySQL使用profile分析SQL语句执行过程

分析SQL执行带来的开销是优化SQL的重要手段。在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析。该参数可以在全局和session级别来设置。对于全局级别则作用于整个MySQL实例,而session级别紧影响当前session。该参数开启后,后续执行的…

java jdbc 操作_Java:JDBC操作

内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如:DriverManager类Connection接口Statement接口ResultSet接口1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");2.Connection conn Dri…

java 线程 函数_java – 从后台线程调用主线程上的函数

更新我已经更新了这个问题,使用建议的SwingWorker类包含Java实现的源代码,以实现与Objective-C示例相同的结果.希望这将有助于未来的冒险家.Document myDoc ...;Model myModel ...;SwingWorker analyzeDocument new SwingWorker() {Overridepublic Dictionary doInBackgroun…

java se5和8_javaSE_8系列博客——Java语言的特性(三)--类和对象(5)--定义方法...

以下是一个典型的定义一个方法的示例:public double calculateAnswer(double wingSpan, int numberOfEngines,double length, double grossTons) {//do the calculation here}方法声明的唯一必需元素是方法的返回类型,名称,一对括号()和大括号…

下面选项中不是开发java程序的步骤是_Java基础试题及其答案2

Java试题1) java程序中,main方法的格式正确的是()。(选择一项)a)static void main(String[] args)b)public void main(String[] args)c)public static void main(String[]s)d)public static void main(String[] args)2)给定java代码,如下:pub…

java java.doc_使用 javadoc 自动生成 Java 文档

Java 的注释,单行,多行的语法就不在赘述了。javadoc tags给 Java 源码文件书写注释,使用常见的 Java 注释可以实现一些,也可以通过如下的 Javadoc 的 Tags 来实现一些特殊的比如跳转,参数返回值等特殊标记。javadoc 标…

java增删改一键生成_easyCode(java自动生成增删改查代码)

【实例简介】读取数据库表结构 自动生成增删改查代码【实例截图】【核心代码】package com.isoftstone.autocoding;import com.isoftstone.autocoding.common.Column;import com.isoftstone.autocoding.common.Table;import com.isoftstone.autocoding.utils.CamelCaseUtils;im…

java8.0 platform图_Java Platform SE binary语言-Java编程32位/64位版(jdk-jeb)下载V8.0.2510.8官方安装版-西西软件下载...

Java编程32位/64位版(jdk-jeb)是一款功能强大的计算机编程语言工具,Java技术让您可以在安全的计算环境下工作和游戏。使用 Java您可以畅玩网络游戏、与世界各地的朋友聊天、计算按揭利息,还可以在 3D 模式下浏览图像,诸多功能不一而足。软件特…

java同时关闭两个窗口_在一个窗口中同时关闭多个窗口的问题(Swing中事件多点传送的问题) | 学步园...

class A{}A中包含有:JFrame frameA;JButton btnA;class B{}B中包含有:final JFrame frameB;Static boolean wantToSave true;frameB.addWindowListener( new WindowAdapter(){pubilic void windowClosing(windowEvent we…

JAVA数组扁平化整合_5种方法实现数组扁平化

数组扁平化概念数组扁平化是指将一个多维数组变为一维数组[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]复制代码实现1. reduce遍历数组每一项,若值为数组则递归遍历,否则concat。function flatten(arr){return arr.reduce((result, item)> {retur…