Java中四种权限修饰符

发布时间:2023年12月31日

权限修饰符概述

修饰符作用域
private同一个类中
default同一个类中,同一个包中子类、无关类
protected同一个类中,同一个包中子类、无关类,不同包的子类
public同一个类中,同一个包中子类、无关类,不同包的子类、无关类

Code 分析

private:私有的

  • 我们可简单理解为,你的钱是私有的,不能给别人用,只能自己用,代码如下,可尝试自己敲下,理解即可。

class Test{
    // 私有的常量
    private final String name = "heng";
    // 私有的变量
    private int age;
    // 私有的方法
    private void print(){
        // 同一类中,可找到此常量
        System.out.println(name);
        // 同一类中,可找到此变量,new Test() 是匿名对象
        new Test().age = 3;
        System.out.println("Hello");
    }
}

public class TestPrivate {
    public static void main(String[] args) {
        // 创建测试类对象
        Test t = new Test();
        // 报错,因为不在同一个类中,找不到这个变量
        t.age = 1024;
        // 报错,因为不在不同一个类中,找不到此方法
        t.print();
        // 报错,因为不在同一个类中,找不到这个常量
        System.out.println(t.name);
    }
}

综上,我们可以看到 private 只适用于本类中


default:默认的

  • 我们首先创建两个包 test1 和 test2,在包test1下再创建两个类,Test 和 TestDefault1,在包test2下创建一个类TestDefautl2。无关类指的就是两个类没有继承关系。

  • 编写 Test 类代码,并正确运行,输出如下图所示,表明 default 修饰同一个类中可以被访问到(默认就是不写修饰符即可)

    // Test 类
    public class Test {
        // 默认的常量
        final String name = "heng";
        // 默认的变量
        int age;
        // 默认的方法
        void print(){
            System.out.println("Hello");
        }
    
        public static void main(String[] args) {
            // 创建测试类对象
            Test t = new Test();
            // 给默认变量赋值,并输出
            t.age = 3;
            System.out.println(t.age);
            // 输出默认常量
            System.out.println(t.name);
            // 调用默认方法
            t.print();
        }
    }
    
  • 编写 TestDefault1 类,仅需将 Test 类中主方法拿过来即可,并正确运行,输出如下图所示,表明在同一个包无关类也能访问被 default 修饰的

    public class TestDefault1 {
        public static void main(String[] args) {
            // 创建测试类对象
            Test t = new Test();
            // 给默认变量赋值,并输出
            t.age = 3;
            System.out.println(t.age);
            // 输出默认常量
            System.out.println(t.name);
            // 调用默认方法
            t.print();
        }
    }
    
  • 修改,TestDefault1 代码,让其继承 Test 类,并运行,发现可正确运行,表明 同一个包中子类也可以访问被 default 修饰的

    public class TestDefault1 extends Test {
        public static void main(String[] args) {
            // 创建测试类对象
            Test t = new Test();
            // 给默认变量赋值,并输出
            t.age = 3;
            System.out.println(t.age);
            // 输出默认常量
            System.out.println(t.name);
            // 调用默认方法
            t.print();
        }
    }
    
  • 编写 TestDefault2 类,将 Test 中主方法拿过来即可,这里需注意,我们需要在 TestDefault2 类中将 Test 类导入进来, 不同包子类即可让 TestDefault2 继承 Test 即可,我们发现不同包子类,无关类都报错。

综上所述:default 修饰的只能在 同一个类中,同一个包中子类、无关类才能被访问到


protected:受保护的

  • 理解了上述两个修饰符之后,后边的我们就比葫芦画瓢,即可,我们运用default时候,创建的 test1 和 test2 两个包和里边的3个类,将修饰符改为 protected

  • 首先我们看同一个类中,即将default修改为protected 的 Test 类

  • 我们看同一个包中的子类和无关类,无关类可自行删除继承

  • 我们看不同包中的子类,这里需要注意,我们此时通过父类对象访问父类成员时候会报错,但是我们可通过子类对象访问父类的成员

  • 不同包中的无关类,可删除继承自行测试,结果是无法编译的

综上所述:protected 修饰的 同一个类中,同一个包中子类、无关类、不同包的子类是可被访问到的,但需要注意的是,当不同包的子类访问是,用的是子类对象


public:公有的

  • 我们还是运用上述代码,将 Test 类中的 protected 修改成 public 即可

  • 首先,我们看 同一个类中

  • 其次,我们再看 同一个包中子类、无关类(无关类不再演示)

  • 最后,我们看 不同包中的子类、无关类(注意:不同包无关类是不能通过子类访问的,可不要迷糊了!)

综上所述:同一个类中,同一个包中子类、无关类、不同包的子类、无关类

最后,送大家一句话:不要害怕失败,因为失败是成功的一部分!!!

文章来源:https://blog.csdn.net/weixin_45754463/article/details/135304552
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。