• java类的访问权限


    转载:http://www.cnblogs.com/xwdreamer/archive/2012/04/06/2434483.html

    1.解析

    Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符。

    1. private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
    2. default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。
    3. protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
    4. public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
    下面用表格的形式来展示四种访问权限之间的异同点,这样会更加形象。表格如下所示:
     

    同一个类

    同一个包

    不同包的子类

    不同包的非子类

    Private

         

    Default

       

    Protected

     

    Public

    2.Protected

    假设在包accesscontrol下面有AccessControlDemo和 Base 两个类,其中protected double price;是Base类的成员变量,因为两个类在同一个包中,所以在AccessControlDemo类中可以直接访问 System.out.println(base.price);具体实例如下:

    accesscontrol.AccessControlDemo

    复制代码
    package accesscontrol;
    
    public class AccessControlDemo {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Base base=new Base("123-1",120.1);
            System.out.println(base.price);
            
        }
    }
    复制代码

    accesscontrol.Base

    复制代码
    package accesscontrol;
    
    public class Base {
        
        private String isbn;
        protected double price;
        
        //默认构造函数
        public Base() {
    
        }
    
        //构造函数,如果只定义带参数的构造函数而不定义默认构造函数,那么Base的子类必须定义显式构造函数
        //Implicit super constructor Base() is undefined for default constructor. Must define an explicit 
    
        public Base(String isbn, double price) {
            this.isbn = isbn;
            this.price = price;
        }
        
    
        public String getIsbn() {
            return isbn;
        }
        public void setIsbn(String isbn) {
            this.isbn = isbn;
        }
        public double getPrice() {
            return price;
        }
        public void setPrice(double price) {
            this.price = price;
        }
        
    }
    复制代码

    但是假如我们将AccessControlDemo这个类移到test这个包中,我们会发现eclipse中提示错误,编译无法通过,因为在test包中对protected类型的成员变量不可见。

    假如我们在test包中创建一个Base类的子类Bulk,也就是说Bulk是Base类不同包的子类。那么在Bulk类中能够直接访问protected double price;这个基层自Base类的成员变量,实例如下:

    test.AccessControlDemo

    复制代码
    package test;
    
    public class AccessControlDemo {
        public static void main(String[] args) {
            Bulk bulk=new Bulk("123-1",120.1);
            bulk.print();
        }
    }
    复制代码

    test.Bulk

  • 相关阅读:
    使用ATL开发ActiveX控件
    [Silverlight]AutoCompleteBox控件的一个Bug?
    [Silverlight]一个简单的GroupBox控件
    WCF安全之ASP.NET兼容模式
    Mysql 性能优化记录
    【Python+Django+Pytest】数据库异常pymysql.err.InterfaceError: (0, '') 解决方案
    Django在使用logging日志模块时报错无法操作文件 logging error Permission Error [WinError 32]
    isinstance 判断一个对象属于或不属于多种数据类型
    CentOS 系统 查看 cpu核数
    我踩过的python的坑
  • 原文地址:https://www.cnblogs.com/frankM/p/4507517.html
Copyright © 2020-2023  润新知