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

    本章精华摘录

    编写一个Java源代码文件时,此文件被称为编译单元或转译单元。每个编译单元必须有一个后缀.java,而在编译单元内可以且只能有一个public类,否则编译器不会接受。如果编译单元之中还有额外的类,在包之外的世界是无法看见这些类的,因为他们不是public类,且这些类主要用于为public类提供支持

    当编译一个.java文件时,.java文件中的每一个类都会有一个输出文件,该文件名称与.java每个类的名称相同,只是多了一个后缀.class。因此,在编译少量.java文件时,会得到大量的.class文件。Java可运行程序时一组可以打包并压缩为一个java文档文件的.class文件。Java负责这些文件的查找、装载和解释。

    类库实际上是一组类文件,其中每个文件都有一个public类,以及任意数量的非public类,因此每个文件都有一个构件。如果希望这些构件(每一个都有独立的.java.class文件)从属于一个群组,就可以使用关键字package

    Java访问权限修饰符

    无修饰符:包访问权限

    void bite(){}
    //只向在包中的类提供访问权限
    

    默认包

    package access;
    
    class Cake {
        public static void main(String[] args) {
            Pie x = new Pie();
            x.bite();
        }
    }
    
    package access;
    
    class Pie {
        void bite(){
            System.out.println("yummy~o(* ̄▽ ̄*)ブ");
        }
    }
    

    Pie()f()享有包访问权限,Cake.java可以访问它们的原因是它们相处于相同的目录,并且未给自己设定任何包名称,java将这样的文件看作是隶属于该目录的默认包中,于是它们为该目录中所有其他的文件都提供了包访问权限。

    ps: 经过测试,把Pie.java和Cake.java均放在src文件目录下正常运行,故可知程序即使不在package中java仍会生成默认包并运行。

    public: 接口访问权限

    使用关键字public,表示public后紧跟的成员声明对每个人都是可用的,例:

    public void bite() {}
    //方法bite()对所有人都是可用的
    

    Cookie

    package access.dessert;
    
    public class Cookie {
        public Cookie() {
            System.out.println("Cookie Constructor");
        }
        void bite() {
            System.out.println("卡滋卡滋, yummy~!");
        }
    }
    

    Dinner上吃Cookie

    package access;
    
    import access.dessert.*;
    
    public class Dinner {
        public static void main(String[] args) {
            Cookie x = new Cookie();
            x.bite();//Error:'bite()' is not public in 'access.dessert.Cookie'. Cannot be accessed from outside package
        }
    }
    

    小结:如果使用了public修饰,import后就可以访问。若不使用修饰符,由于只向所在包中的类提供访问权,故import后也无法访问。

    private: 你无法访问

    关键字private:除了包含该成员的类,其他任何类都无法访问这个成员。private可允许你随意修改该成员,而不必考虑是否会影响到包内其他的类。

    任何可以肯定只是该类的一个“助手”方法的方法,都可以把它指定为private,以确保不会在包内的其他地方误用到它,也就防止了你会去改变或删除这个方法。将方法设为private确保你拥有这种选择权。

    IceCream.java

    package access;
    
    class Sundae{
        private Sundae() {}
        static Sundae makeASundae(){
            return new Sundae();
        }
    }
    
    public class IceCream {
        public static void main(String[] args) {
            //!Sundae x = new Sundae();
            //Error:'Sundae()' has private access in 'access.Sundae'
            Sundae x = Sundae.makeASundae();
        }
    }
    

    protected: 继承访问权限

    如果创建了一个新包,并自另一个包继承类,那么唯一可以访问的成员就是源包的public成员。有时基类的创建者希望有某个特定成员,把对它的访问权限赋予派生类而不是所有类,这需要protected来完成这一工作。protected也提供包访问权限,相同包内的其他类也可以访问protected元素。

    改进版的Cookie2

    package access.cookie2;
    
    public class Cookie {
        public Cookie() {
            System.out.println("Cookie Constructor");
        }
        protected void bite(){
            System.out.println("滋个滋个啊~滋个滋个啊( ̄▽ ̄)");
        }
    }
    

    ChocolateChip

    package access;
    import access.cookie2.*;
    public class ChocolateChip extends Cookie{
        public ChocolateChip() {
            System.out.println("ChocolateChip Constructor");
        }
        public void chomp(){
            bite();
        }//protected method
        public static void main(String[] args) {
            ChocolateChip choco = new ChocolateChip();
            choco.chomp();
        }
    }
    

    类访问权限

    如果获取了 一个access内部的类,用来完成在access中的public类所要执行的任务,如果你认为不久之后可能会想要完全改变原有方案并删除旧版本,代之以不同的版本。为了保留灵活性,需要确保客户端程序员不会依赖于隐藏在access之中的任何特定实现细节,只需将关键字public从类中拿掉,这个类就只拥有包访问权限了(只可以用于该包之中)。

    类不可以是private的:这样会使类除该类之外,其他任何类均不可访问。也不可以是protected的。

    :事实上,一个内部类可以是private或protected的

    故对于类的访问权限,只有包访问权限或public。如果不希望任何人对该类拥有访问权限,可以把所有的构造器指定为private,从而阻止任何人创建该类的对象。

    例外:在该类的static成员内部可以创建

  • 相关阅读:
    Page.EnableViewStateMac 属性
    ASP.NET2.0权限/角色管理表aspnet_Membership解析(转)
    Request.ServerVariables(HTTP_REFERER)
    对象不能从DBNull 转换为其他类型
    ASP.NET角色管理配置
    TextBox保存的文本在Label中显示
    SET NOCOUNT ON
    浅论ViewState及其与Session的关系(转)
    ASP.NET2.0权限/角色管理表aspnet_Applications解析(转)
    动态编辑控件宽高
  • 原文地址:https://www.cnblogs.com/Glov/p/13440284.html
Copyright © 2011-2022 走看看