zoukankan      html  css  js  c++  java
  • 访问控制权限

    一、简介

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

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

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

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

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

    二、包(package)

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

    1. 代码组织

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

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

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

    2. 包(package)的作用

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

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

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

    3. 创建包

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

    语法格式:package pkg1[.pkg2[.pkg3…]];

    注意点:

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

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

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

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

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

    4. 导入包

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

    三、访问权限修饰词

    1. package:包访问权限

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

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

    示例:

    package com.notes.packages.test;
    
    public class Info {
        void print() { System.out.println("default method -- print()"); }
    }
    package com.notes.packages.test;
    
    public class PublicDemo01 {
        public static void main(String[] args) {
            Info x = new Info();
            x.print();
        }
    }

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

    package com.notes.packages;
    import com.notes.packages.test.Info;
    public class PublicDemo02 {
        public static void main(String[] args) {
            Info x = new Info();
            // x.print(); // Error
        }
    }

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

    2. public接口访问权限

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

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

    package com.notes.packages.test;
    public class Info {
        public void print() { System.out.println("public method -- print()"); }
    }
    3. private:私有访问

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

    应用场景:单例模式

    4. protected:继承访问权限

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

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

    class Father {
        private String a = "private";
        protected String b = "protected";
        public String c = "public";
    };
    
    class Son extends Father {
        public void print() {
            // System.out.println("element a:" + super.a); // Error
            System.out.println("element b:" + super.b);
            System.out.println("element c:" + super.c);
        }
    }
    
    public class ProtectedDemo01 {
        public static void main(String args[]) {
            Son sub = new Son();
            sub.print();
        }
    };

    四、访问权限修饰词的注意点

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

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

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

    参考

    https://www.cnblogs.com/jingmoxukong/p/5182331.html

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 3000米排名预测
    Java实现 蓝桥杯VIP 算法提高 3000米排名预测
    Java实现 蓝桥杯VIP 算法提高 班级排名
    Java实现 蓝桥杯VIP 算法提高 班级排名
    Java实现 蓝桥杯VIP 算法提高 班级排名
    Java实现 蓝桥杯VIP 算法提高 班级排名
    当时忍住就好了(要抵住诱惑,也不要在极端情绪下做出决定,一切向前看)
    MFC中的模态对话框与非模态对话框,模态对话框测试
    在iOS中创建静态库
    delphi三层架构(使用SATRDA改造,客户端代码不变)
  • 原文地址:https://www.cnblogs.com/myitnews/p/12940185.html
Copyright © 2011-2022 走看看