Java中的访问控制权限

简介

Java中为什么要设计访问权限控制机制呢?主要作用有两点:

(1)为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分。

(2)为了让类库设计者可用更改类的内部工作方式,而不必担心会对用户造成重大影响。

Java中的访问权限控制的等级,按照权限从大到小依次为

Public -> protected -> 包访问权限(没有权限修饰词)-> private。

包(package)

Java中包(package)的概念和C++中命名空间(namespace)的概念很类似,都可以限制类的作用域。二者最大的差别在于,Java中的包隐式地指明了类的树形层级结构(同时也是Java源码文件的目录结构)。这样做的好处在于:可以通过文件系统中对于文件路径唯一性的要求来限制类的唯一性。

代码组织

编写一个Java源代码文件(.java文件)时,此文件通常被称为编译单元。在编译单元内最多允许有一个public类,且该类的名称必须与文件名完全相同(包括大小写)。

编译一个.java文件时,在.java文件中的每个类都会有一个.class输出文件,这个文件名和类名是相同的。Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR包,使用Java的jar文档生成器)的.class文件。Java解释器负责这些文件的查找、装载和解释。

类库实际上是一组类文件。其中每个.java文件最多允许有一个public类,以及任意数量的非public类。因此,每个文件都有一个构件。如果要将这些构件(每个构建有一个.java文件和若干个.class文件)组织起来,形成不同的群组,可以使用Java中的关键字package

包(package)的作用

(1)     把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

(2)     如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。

(3)     包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

创建包

Java中,使用package关键字来指定代码所属的包(命名空间)。

语法格式:


package pkg1[.pkg2[.pkg3…]];

注意点:

(1)     包的名字隐含地指出了代码的目录结构。

(2)     同一目录下的public类名(同时也是java文件名)应该是独一无二的。

(3)     包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。

(4)     如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。

(5)     package的名字一般全是小写字母。

例如:

查看java.util.ArrayList类的源码可以看到文件第一行代码为:


package java.util;

它的代码目录结构就是java/util/ArrayList.java

导入包

Java中,使用import关键字来导入包。

语法格式:


import package1[.package2…].(classname|*);

例:

还是以java.util.ArrayList来举例。如果以一个了类完整路径的方式来使用它,十分不方便。


java.util.ArrayList<String> list = new java.util.ArrayList<String>();

如果想要省略前面的路径,可以使用import关键字。


import java.util.ArrayList;

文件中使用了import导入包后,前面的声明list的代码就可以简化如下:


ArrayList<String> list = new ArrayList<String>();

访问权限修饰词

package:包访问权限

如果不提供任何访问权限修饰词,则意味着它是包访问权限

默认访问权限没有任何关键字,但通常是指包访问权限(有时也表示为friendly,有点像C++中的友元概念)。这意味着包中所有其他类都可以访问这个成员或方法,但是这个包之外的所有类不可以访问

例:

com.notes.packages.test.Info


package com.notes.packages.test;

publicclass Info {

void print() { System.out.println("default method -- print()"); }

}

com.notes.packages.test.PublicDemo01


package com.notes.packages.test;

publicclass PublicDemo01 {

publicstaticvoid main(String[] args) {

Info x = new Info();

x.print();

}

}

PublicDemo01和Info在同一个包下,可以访问Info的default级别的方法——print()。

com.notes.packages.PublicDemo02


package com.notes.packages;

import com.notes.packages.test.Info;

publicclass PublicDemo02 {

publicstaticvoid main(String[] args) {

Info x = new Info();

// x.print(); // Error

}

}

PublicDemo02和Info不在一个包下,不可以访问Info的包访问权限级别的方法——print()。

public:接口访问权限

使用public关键字,就意味着被声明的成员或方法对所有人都是可以访问的

例:如果将default级别权限例子中的print()方法权限设为public,则PublicDemo02可以访问。


package com.notes.packages.test;

publicclass Info {

publicvoid print() { System.out.println("public method -- print()"); }

}

private:无法访问

使用private关键字,就意味着被声明的成员或方法,除了本类,其他任何类都无法访问

应用场景:单例模式

protected:继承访问权限

新类(称之子类或派生类)通过继承可以复用一个现有类(称之父类或基类),然后扩展基类的成员、方法。有时,基类的创建者会希望某个特定成员,将它的访问权限赋予派生类而不是所有类。public无法做到这一点,为此,引入了protected来完成这一工作。protected也提供包访问权限,也就是说,派生类以及相同包内的其他类都可以访问protected成员或方法

例:子类继承父类后,可以访问父类的protected成员。


class Father {

private String a = "private";

protected String b = "protected";

public String c = "public";

};

class Son extends Father {

publicvoid print() {

// System.out.println("element a:" + super.a); // Error

System.out.println("element b:" + super.b);

System.out.println("element c:" + super.c);

}

}

publicclass ProtectedDemo01 {

publicstaticvoid main(String args[]) {

Son sub = new Son();

sub.print();

}

};

访问权限修饰词的注意点

前面各个例子中展示了类的成员、方法都可以用各种权限修饰词来修饰。

除此之外,还有一些需要注意的点:

(1)     静态成员、静态方法的权限修饰词的用法和普通成员、方法一样。

(2)     类虽然也可以被修饰词修饰,但是不可以用privateprotected两个权限修辞词。

(3)     有些书中将包访问权限又叫做默认访问权限。个人不建议这么去记,因为这很容易与Java Se8中新特性——default关键字混淆。这个关键字只能用于Interface,作用是允许程序员在Interface中定义接口的默认具体实现(以往的JDK版本是不允许这样的,你只能在接口中声明方法)。

时间: 2024-12-27 10:58:49

Java中的访问控制权限的相关文章

详解Java中的访问控制修饰符(public, protected, default, private)

Java中的访问控制修饰符已经困惑笔者多时,其中较复杂的情况一直不能理解透彻.今天下定决心,系统.全面地研究Java中的访问控制修饰符的所有方面,并整理成这篇文章,希望有同样疑惑的读者读完后能有所收获.如果文章中出现错误,欢迎评论指出,共同交流~ 说在前面:这篇文章只研究Java中访问控制修饰符声明类的变量/方法的情况. 先抛出结论: * 成员变量/方法的访问权限 *                                        private        default  

浅析Java中的访问权限控制

浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理? 场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1.fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理? 此时,访问权限控制便可以

Java中的访问权限解析

在Java中不同的对象和类拥有不同的访问权限,所以在java中对不同的类和对象进行权限的设置显得尤为重要. java中的权限主要分为四种,public,protect,private,和default在声明类和对象的时候如果没有注明权限则为默认的即(default).下面将对这四种权限仅向简单的解析,部分为网上博主的总结再加上个人总结 1.权限解析Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符.private:

java中的访问控制有什么用?如何用法?请举例

9.访问控制 (视频下载) (全部书籍) [新手可忽略不影响继续学习] 访问控制有什么用?在软件公司里是这么用的,我们想像一种场景,在你的类中,你编了三个私有方法,马克-to-win,别人当然都用不了,但在类外,你也是用不了的,你必须,在类里再编一个公共方法,别人就能随便用了!但是如果你的公共方法调用那三个私有方法的顺序是132的话,全世界人民只能调用那个公共方法,按照132的顺序,来使用那三个私有方法,他想按照123的顺序来调用那三个私有方法,都没办法.因为这个类的发布权在你手里,全世界人民只

Java中的访问权限

Java中有四种访问权限,从大到小依次是:public –> protected –> default(friendly) –> private. 简单说明下: public 作用域是全局: protected 作用域是类内部.同一包下.子类下: default 或称friendly,作用域是类内部.同一包下: private 作用域仅是类内部.   也可见下图:

java四种访问控制权限:public ,default,protected,private

四种访问权限的控制 范围 private default protected  public 同一个类中 √ √ √ √ 相同包不同类 × √ √ √ 不同包的子类中 × × √ √ 不同包非子类 × × × √

Java中的访问控制

修饰符 同一个类 同一个包 子类 整体 private Yes       default Yes Yes     protected Yes Yes Yes   public Yes Yes Yes Yes

Java访问控制权限

Java的访问控制权限相比于C++等语言可能稍微复杂一点,不过也不难理解.Java的访问控制权限分为两块--"类或接口的访问控制权限"与"变量和方法的访问控制权限". 1.类或接口的访问控制权限     类或接口的访问控制权限是指能不能用该类建立对象,接口能不能被实现等等.能够修饰类或接口的访问控制权限的修饰符(modifier)只有两个--public和friendly.不过,值得一说的是friendly并不是Java的关键字,它只是一个习惯叫法,指的是"

java中访问权限修饰符

java中的访问权限修饰符共有四种,分别为private.default.protected.public,它们的访问权限依次升高,private只能被本类所调用,default(不写的话默认为default)可以被同一个包下的所有类所调用,protected既可以被同一个包下的所有类所调用,也能被不同包下的子类所调用(即必须要有继承关系),而public则为公开的,项目下所有包的所有类都可进行调用. 代码测试如下: , 经测试结果如下: 除private类报错外,其余各访问权限修饰词均在本包其