java基础-类成员访问权限控制

一 前言

这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心。本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性;将类成员使用不同的访问级别控制,在数据封装后,其他的类成员想要访问当前类成员,就必须要有足够的权限才能访问;这样做的目的就是我可以随意修改不想让其他类成员没有权限访问的数据,只要约定好相关的协议,不影响其他类成员访问即可;

二 权限修饰词介绍

  1. public 意指公有的意思,其修饰的成员权限最低,表示任何成员都可以访问;注意点是一个java源文件中只能有一个类被声明为public
  2. defaut 默认级别,成员没有修饰符号,在同一个包内能被其他成员访问;
  3. protected 受保护的意思;表示子类能够继承父类的方法;在同一个包内被其修饰的成员,其子类能够访问;注意点是不可以修饰外部类
  4. private 私有的意思;权限最高,表示只允许类内部成员可以访问;注意点是不可以修饰外部类
修饰符 同一个类中 同一个包中的其他类 不同包的子类中 不同包的非子类中
public true true true true
protected true true true
default true true
private true

三 具体实施

3.1 public

在com.youku1327.base.authority2 包中创建了一个星球类,有个成员是shine表示光线,对应的getShine方法使用public修改,方法意思是获得光线;

package com.youku1327.base.authority2;

/**
 * @Author lsc
 * <p> 星球类 </p>
 */
public class Planet {

    private String shine = "好耀眼";

    public String getShine(){
        return shine;
    }
}

在 com.youku1327.base.authority1 包中创建类ZSZXZ, 使用import com.youku1327.base.authority2.Planet;导入 Planet星球类;在main方法中创建星球类,调用获得光线的方法,得到输出结果是 好耀眼;验证了public权限最低,不同包之间得非子类就可以访问;

package com.youku1327.base.authority1;

import com.youku1327.base.authority2.Planet;

/**
 * @Author lsc
 * <p> </p>
 */
public class ZSZXZ {

    public static void main(String[] args) {
        // 创建星球实体
        Planet planet = new Planet();
        // 访问公有成员
        String shine = planet.getShine();
        // 好耀眼
        System.out.println(shine);
    }

}

3.2 protected

将 星球类的getShine方法修饰符号改为 protected;

package com.youku1327.base.authority2;

/**
 * @Author lsc
 * <p> 星球类 </p>
 */
public class Planet {

    private String shine = "好耀眼";

    protected String getShine(){
        return shine;
    }
}

在com.youku1327.base.authority1中创建Earth类继承星球类Planet(初学者只要理解extends关键字表示继承的意思),继承的方法是 getShine方法,然后在主类中创建地球实例,调用getShine方法,实际上是调用 Planet的 getShine 方法(super.getShine(),super意指高级,表示父类 );验证了不同包的子类可以调用父类被protected修饰的成员;

package com.youku1327.base.authority1;

import com.youku1327.base.authority2.Planet;

/**
 * @Author lsc
 * <p> 地球类</p>
 */
public class Earth extends Planet {

    @Override
    protected String getShine() {
        // 调用了父类的getShine方法
        return super.getShine();
    }
    // 执行前注释掉ZSZXZ中的main方法
    public static void main(String[] args) {
        // 创建地球
        Earth earth = new Earth();
        // 好耀眼
        System.out.println(earth.getShine());
    }
}

在回去看看原来的ZSZXZ类的getShine发现报错了;验证了不同包的非子类,使用protected修饰无法访问;

java基础-类成员访问权限控制

3.3 default

将 Planet 星球类 的 getShine 方法的修饰符去掉,代码如下

package com.youku1327.base.authority2;

/**
 * @Author lsc
 * <p> 星球类 </p>
 */
public class Planet {

    private String shine = "好耀眼";

    String getShine(){
        return shine;
    }
}

随着发现 之前的地球类报错了,我们把整个地球类注释掉;验证了default修饰的成员不能夸包访问;

java基础-类成员访问权限控制

我们在 Planet 的同级包下创建Moon类,调用 Planet的getShine方法,成功执行;验证了default修饰的成员能在同一个包中被访问;

package com.youku1327.base.authority2;

/**
 * @Author lsc
 * <p> </p>
 */
public class Moon  {

    public static void main(String[] args) {
        // 创建星球实体
        Planet planet = new Planet();
        // 访问公有成员
        String shine = planet.getShine();
        // 好耀眼
        System.out.println(shine);
    }

}

3.4 private

将 Planet 星球类 的 getShine 方法的修饰符改为private;

package com.youku1327.base.authority2;

/**
 * @Author lsc
 * <p> 星球类 </p>
 */
public class Planet {

    private String shine = "好耀眼";

    private String getShine(){
        return shine;
    }
}

发现 之前的 的Moon类主方法中的getShine方法报错了,验证了private在同包不同类中不可以被访问;getShine() 中可以使用 shine 字段,验证了同一个类中可以使用private修饰的成员;

 private String shine = "好耀眼";

    private String getShine(){
        return shine;
    }
}

发现 之前的 的Moon类主方法中的getShine方法报错了,验证了private在同包不同类中不可以被访问;getShine() 中可以使用 shine 字段,验证了同一个类中可以使用private修饰的成员;

java基础-类成员访问权限控制

上一篇:Projecteuler584 Birthday Problem Revisited


下一篇:(18)What a planet needs to sustain life