zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    luogu 1865 数论 线性素数筛法
    洛谷 2921 记忆化搜索 tarjan 基环外向树
    洛谷 1052 dp 状态压缩
    洛谷 1156 dp
    洛谷 1063 dp 区间dp
    洛谷 2409 dp 月赛题目
    洛谷1199 简单博弈 贪心
    洛谷1417 烹调方案 dp 贪心
    洛谷1387 二维dp 不是特别简略的题解 智商题
    2016 10 28考试 dp 乱搞 树状数组
  • 原文地址:https://www.cnblogs.com/frankM/p/4507517.html
Copyright © 2011-2022 走看看