java四个权限_java四种访问权限

引言

Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用。下面整理一下,在什么情况下,有哪些访问权限可以允许选择。

一、访问权限简介

访问权限控制: 指的是本类及本类内部的成员(成员变量、成员方法、内部类)对其他类的可见性,即这些内容是否允许其他类访问。

Java 中一共有四种访问权限控制,其权限控制的大小情况是这样的:public > protected > default(包访问权限) > private,具体的权限控制看下面表格,列所指定的类是否有权限允许访问行的权限控制下的内容:

访问权限本类本包的类子类非子类的外包类

public

protected

default

private

1、public: 所修饰的类、变量、方法,在内外包均具有访问权限;

2、protected: 这种权限是为继承而设计的,protected所修饰的成员,对所有子类是可访问的,但只对同包的类是可访问的,对外包的非子类是不可以访问;

3、包访问权限(default): 只对同包的类具有访问的权限,外包的所有类都不能访问;

4、private: 私有的权限,只对本类的方法可以使用;

注意: 要区分开 protected 权限、包访问权限,正确使用它们;

当某个成员能被所有的子类继承,但不能被外包的非子类访问,就是用protected;

当某个成员的访问权限只对同包的类开放,包括不能让外包的类继承这个成员,就用包访问权限;

使用访问权限控制的原因:

1)使用户不要碰触那些他们不该碰触的部分;

2)类库设计者可以更改类的内部工作的方式,而不会担心这样会对用户产生重大影响;

二、访问权限控制的使用场景

访问权限使用的场景可以总结为下面的五种场景,分别对访问权限的使用有不同的限制:

1. 外部类的访问控制

外部类(外部接口) 是相对于内部类(也称为嵌套类)、内部接口而言的。外部类的访问控制只能是这两种:public 、default 。

//public 访问呢权限的外部类,所有类都可以使用这个类

public class OuterClass {

}

//default 权限的外部接口,所有类、接口均可以使用此接口

interface OuterInterface{

}

2. 类里面的成员的访问控制

类里面的成员分为三类 : 成员变量、成员方法、成员内部类(内部接口)

类里面的成员的访问控制可以是四种,也就是可以使用所有的访问控制权限

public class OuterClass {

public int aa; //可以被所有的类访问

protected boolean bb; //可以被所有子类以及本包的类使用

void cc() { //default 访问权限,能在本包范围内使用

System.out.println("包访问权限");

}

//private权限的内部类,即这是私有的内部类,只能在本类使用

private class InnerClass{

}

}

注意:

这里的类里面的成员 是指类的全局成员,并没有包括局部的成员(局部变量、局部内部类,没有局部内部接口)。或者说,局部成员是没有访问权限控制的,因为局部成员只在其所在的作用域内起作用,不可能被其他类访问到。

public void count(){

//局部成员变量

public int amount;//编译无法通过,不能用public修饰

int money;//编译通过

//局部嵌套接口

class customer{//编译通过

}

}

上面的两种场景几乎可以适应所有的情况,但有一些情况比较特殊,还做了有些额外访问权限的要求

3. 抽象方法的访问权限

普通方法是可以使用四种访问权限的,但抽象方法是有一个限制:不能用private 来修饰,也即抽象方法不能是私有的,否则,子类就无法继承实现抽象方法。

4. 接口成员的访问权限

接口由于其的特殊性,所有成员的访问权限都规定得死死的,下面是接口成员的访问权限:

变量: public static final

抽象方法: public abstract

静态方法: public static,JDK1.8后才支持

内部类、内部接口 : public static

也因为所有的一切都默认强制规定好了,所以我们在用的时候,并不一定需要完整写出所有的修饰符,编译器会帮我们完成的,也就是,可以少写修饰符,但不能写错修饰符。

public interface Interface_Test {

public int aa = 6; //少写了 static final

int bb = 5; //

//嵌套接口,可以不写public static

interface cc{

}

}

5. 构造器的访问权限

构造器的访问权限可以是以上四种权限中的任意一种:

1、采用 private:一般是不允许直接构造这个类的对象,再结合工厂方法(static方法),实现单例模式。注意:所有子类都不能继承它。

2、采用包访问控制:比较少用,这个类的对象只能在本包中使用,但是如果这个类有static 成员,那么这个类还是可以在外包使用;(也许可以用于该类的外包单例模式)。

注意:外包的类不能继承这个类;

3、采用 protected :就是为了能让所有子类继承这个类,但是外包的非子类不能访问这个类;

4、采用 public :对于内外包的所有类都是可访问的;

注意: 构造方法有点特殊,因为子类的构造器初始化时,都要调用父类的构造器,所以一旦父类构造器不能被访问,那么子类的构造器调用失败,意味子类继承父类失败!

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

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

相关文章

java map removeall_Java删除Map中元素

前言&#xff1a;关于Java从Map中删除元素的使用&#xff0c;可以使用删除单个元素的事实Map.remove。示例&#xff1a;初始化一个Map对象Map map new HashMap<>();map.put(1, "value 1");map.put(2, "value 2");map.put(3, "value 3");m…

java中0x07_JAVA里0X00的表示

相信很多针对报文进行组织与拆解&#xff0c;在C、C里有memset的功能很容易完成字符串里填充0x00&#xff0c;在java里同样很容易做到&#xff0c;则是用\000,八进制来表示。测试代码如下&#xff1a;package j8583.example;import java.util.ArrayList;import java.util.Array…

java nio集群_java – Hazelcast:连接到远程集群

14:58:26.717 [main] INFO c.m.b.p.s.s.HazelcastCacheClient – creatingnew Hazelcast instance14:58:26.748 [main] INFO com.hazelcast.core.LifecycleService –HazelcastClient[hz.client_0_dev][3.2.1] is STARTING14:58:27.029 [main] INFO com.hazelcast.core.Lifecyc…

微信第三方扫描登录 java源代码_微信开放平台基于网站应用授权登录源码(java)...

1. 第三方发起微信授权登录请求&#xff0c;微信用户允许授权第三方应用后&#xff0c;微信会拉起应用或重定向到第三方网站&#xff0c;并且带上授权临时票据code参数&#xff1b;2. 通过code参数加上AppID和AppSecret等&#xff0c;通过API换取access_token&#xff1b;3. 通…

java性能优化方案_Java性能优化要点

Java性能优化要点本文介绍如何通过以下几点从Java中挤压出性能&#xff0c;该大部分经验来自于Netty作者。JITJava即时编译器当Java执行runtime环境时&#xff0c;每遇到一个新的类&#xff0c;JIT编译器在此时就会针对这个类别进行编译(compile)被优化成相当精简的原生型指令码…

java注解 源码_详解Java注解教程及自定义注解

详解Java注解教程及自定义注解更新时间&#xff1a;2016-02-26 11:47:06 作者&#xff1a;佚名 我要评论(0)Java注解提供了关于代码的一些信息&#xff0c;但并不直接作用于它所注解的代码内容。在这个教程当中&#xff0c;我们将学习Java的注解&#xff0c;如何定制注解&…

jpa mysql存储过程_spring data jpa 如何调用mysql存储过程?

A:首先定义存储过程依赖的jpa表&#xff1a;EntityTable(name"evenmngt_childthingtree_tmp")//数据库中的表名NamedStoredProcedureQuery(name "getChildTree1", procedureName "eventmngt.getChildTree1",parameters {StoredProcedureParam…

pdm 导入mysql 注释_PowerDesigner逆向导入MYSQL数据库并显示中文注释(转载)

我想直观的查看数据库表之间的关系与中文注释&#xff0c;发现Navicat Premium下的表模型功能&#xff0c;并没有注释功能:用起来不是很方便。所有想到了用PowerDesigner来逆向MYSQL中的表&#xff0c;并显示中文注释。一、安装ODBC驱动当前环境&#xff1a;window 10 64bitPow…

java高级反射_反射---Java高级开发必须懂的

理解反射对学习Java框架有很大的帮助&#xff0c;如Spring框架的核心就是使用Java反射实现的&#xff0c;而且对做一些Java底层的操作会很有帮助。一、Class类的使用1、万事万物皆对象&#xff0c;(当然&#xff0c;基本数据类型&#xff0c;静态成员不是面向对象(属于类的))&a…

win7卸载java_Win7彻底卸载Oracle 11g图文步骤(靠谱)

网上资料结合自己的操作整理出的一套靠谱的彻底卸载Oracle 11g的步骤&#xff01;(Win7)&#xff0c;具体内容详情如下所示&#xff1a;1&#xff1a;停掉所有Oracle相关的服务1.1打开服务方式如下&#xff1a;1.1.1&#xff1a;右击“计算机”–>管理–>服务和应用程序–…

vba与python相比2019_重大改变!Python 或将取代 VBA 成为 Excel 官方脚本语言

点击上方“CSDN”&#xff0c;选择“置顶公众号”关键时刻&#xff0c;第一时间送达&#xff01;如果微软的 Excel 中支持了人生苦短的 Python&#xff0c;你还会喜欢那个直接且易上手的 VBA 编程吗&#xff1f;近日&#xff0c;据国外媒体 BLEEPINGCOMPUTER 报道&#xff0c;微…

会话标识未更新 java_Appscan漏洞之会话标识未更新

本次针对 Appscan漏洞 会话标识未更新进行总结&#xff0c;如下&#xff1a;1. 会话标识未更新1.1、攻击原理在认证用户或者以其他方式建立新用户会话时&#xff0c;如果不使任何现有会话标识失效&#xff0c;攻击者就有机会窃取已认证的会话&#xff0c;此漏洞可结合XSS获取用…

arcgis的python接口_arcgis-Python的ArcGIS API-Esri Screenshots

作者:Esri### 作者邮箱:pythonesri.com### 首页:https://developers.arcgis.com/python/### 文档:None### 下载链接# ArcGIS API for PythonWork with maps and geospatial data in Python using The ArcGIS API for Python.Use simple and efficient tools powered by Web GIS…

gcc编译器java_「gcc编译器下载」gcc编译器下载各版本下载 - seo实验室

gcc编译器下载相关阅读RequestMapping(value"/download_index")public String downloadExceJava SE Development Kit 6u41Product / File DescriptionFile SizeDownloadpasswordLinux x8665.43 MBjdk-6u41-1.以流的方式下载.public HttpServletResponse download(Str…

Java输出小明算对多少题目_2014年Java方向C组第十题

标题&#xff1a;矩阵翻硬币小明先把硬币摆成了一个 n 行 m 列的矩阵。随后&#xff0c;小明对每一个硬币分别进行一次 Q 操作。对第x行第y列的硬币进行 Q 操作的定义&#xff1a;将所有第 ix 行&#xff0c;第 jy 列的硬币进行翻转。其中i和j为任意使操作可行的正整数&#xf…

iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解

IIf返回由逻辑测试确定的两个数值或字符串值之一。语法数字IIf(Logical EXPression, Numeric Expression1, Numeric Expression2)如果 Logical Expression 取值为 TRUE&#xff0c;则此函数返回 Numeric Expression1&#xff0c;否则&#xff0c;返回 Numeric Expression2。字符…

java 取pdf 文本域_java – 使用iText从pdf文件中提取文本列

我需要使用iText从pdf文件中提取文本.问题是&#xff1a;一些pdf文件包含2列,当我提取文本时,我得到一个文本文件,其中列被合并为结果(即同一行中两列的文本)这是代码&#xff1a;public class pdf{private static String INPUTFILE "http://www.revuemedecinetropicale.…

java 反射执行语句_JAVA反射机制

JAVA反射机制定义&#xff1a;JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取的信息以及动态调用对象的方法的功能称…

java 非静态 初始化_Java非静态代码块和实例初始化过程

1 非静态代码块非静态代码块特点①可以为实例变量(非静态的属性)初始化②每次创建对象的时候&#xff0c;都会执行一次&#xff0c;且先于构造器执行③若有多个非静态的代码块&#xff0c;那么按照定义的顺序从上到下依次执行④代码块中既可以调用非静态的变量和方法&#xff0…

java程序员面试怎么难为面试官_Java程序员面试这些多线程问题你知道吗?

在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。所以你应该准备很多关于多线程的问题。在投资银行业务中多线程和并发是一个非常受欢迎的话题&#xff0c;特别是电子交易发展方面相关的。他们会问面试者很多令人混淆的Java线程问题。面试官只是想确信面试者有…