• Java关键字(一) 修饰符private、protected、public和default的作用域


    一、private、protected、public和default的作用域

    我们经常用着四种修饰符去修饰变量、方法和类,但是这四种的作用域都一样吗? 其中private和public可能是最多人知道的,但是protected和default可能就不知道其具体的作用域是哪些范围。先对其四种进行说明再通过案例进行证明:

    public:具有最大访问权限。 可以被同一项目下的任何类所调用,一般用于对外的情况。

    protected:与public不同的是不同包下的类是不能使用的,但是其子孙类除外。所以我认为这是特意为子类设计的。

    default:它是针对本包设计的,它所修饰的在本包下的其他类都访问。

    private:只为类本身提供。是一种封装的体现。

    二、案例

    案例:先声明一个类,可以供子类继承。

    package com.yuanfy.test.scope1;
    /**
     * @Description: 父类,其中有四种修饰符所修饰的变量和方法
     * @author yuanfy
     * @date 2017年12月8日 下午5:04:35 
     */
    public class Person {
        private String name;
        int age;
        protected String color;
        
        public Person(){}
        
        public Person(String name, int age, String color) {
            super();
            this.name = name;
            this.age = age;
            this.color = color;
        }
    
        public void say(){
            System.out.println(this.name + " say: I am " + this.color + " Person");
        }
    }

    测试1:同包下面测试 四种作用域,从中可以看出private不支持在同包下的其他类使用,其他三种是支持在同包下其他类调用的。

    package com.yuanfy.test.scope1;
    /**
     * @Description: 同包下面测试 四种作用域
     * @author yuanfy
     * @date 2017年12月8日 下午5:11:12 
     */
    public class PersonTest {
        public static void main(String[] args) {
            Person person = new Person("James", 32, "red");
            System.out.println("name:" + person.name);//编译报错,所以private修饰的 是不能在同包下的其他类访问
            System.out.println("age:" + person.age);// default
            System.out.println("color:" + person.color);//protected
            person.say();//public
        }
    }

     测试2:在子孙类下测试 四种作用域(不同包的情况下,同包相当于测试1),从下面测试代码中可以看出:private和default所修饰的,不支持在子孙类下调用的,其他两种是支持在子孙类下调用的。

     1 package com.yuanfy.test.scope2;
     2 import com.yuanfy.test.scope1.Person;
     3 /**
     4  * @Description: 在子孙类下测试 四种作用域
     5  * @author yuanfy
     6  * @date 2017年12月8日 下午5:24:30 
     7  */
     8 public class BlackPerson extends Person{
     9 
    10     public BlackPerson(String name, int age) {
    11         super(name, age, "black");
    12     }
    13     public static void main(String[] args) {
    14         BlackPerson person = new BlackPerson("James", 32);
    15         
    16         System.out.println("name:" + person.name);//private 编译报错,所以private修饰的 是不能在不同包下的子孙类访问
    17         System.out.println("age:" + person.age);// default  编译报错,所以default修饰的 是不能在不同包下的子孙类访问
    18         System.out.println("color:" + person.color);//protected 
    19         person.say();//public
    20     }
    21 }

    测试3:不同包下面测试 四种作用域,从下面测试案例中可以看到只有public才支持不同包下的其他类(子孙类除外)调用,其他三种都不支持。

     1 package com.yuanfy.test.scope2;
     2 
     3 import com.yuanfy.test.scope1.Person;
     4 
     5 /**
     6  * @Description: 不同包下面测试 四种作用域
     7  * @author yuanfy
     8  * @date 2017年12月8日 下午5:11:12 
     9  */
    10 public class PersonTest2 {
    11     public static void main(String[] args) {
    12         Person person = new Person("James", 32, "red");
    13         
    14         System.out.println("name:" + person.name);//private 编译报错,所以private修饰的 是不能在其他包下的任何类访问(除了自身)
    15         System.out.println("age:" + person.age);// default 编译报错,所以default修饰的  是不能在其他包下访问的。
    16         System.out.println("color:" + person.color);//protected 编译报错,所以default修饰的  是不能在其他包下访问的。
    17         person.say();//public
    18     }
    19 }

    所以经过上面案例分析可以得出他们分别对应有效的作用域,如下表:

    作用域 当前类 同一包内 子孙类(不同包) 其他包
    public
    protected ×
    default × ×
    private × × ×
     
  • 相关阅读:
    Android之弹出/隐藏系统软键盘
    Android之自定义侧滑菜单
    2017-2018-2 20179204 PYTHON黑帽子 黑客与渗透测试编程之道
    2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法
    2017-2018-2 20179204《网络攻防实践》第十二周学习总结 免杀技术
    2017-2018-2 20179204《网络攻防实践》第十一周学习总结 SQL注入攻击与实践
    2017-2018-2 20179204《网络攻防实践》第十周学习总结 缓冲区溢出漏洞实验
    2017-2018-2 20179204《网络攻防实践》第九周学习总结
    2017-2018-2 20179204《网络攻防实践》第八周学习总结
    2017-2018-2 20179204《网络攻防实践》第七周学习总结
  • 原文地址:https://www.cnblogs.com/yuanfy008/p/8006604.html
Copyright © 2020-2023  润新知