Java访问权限控制(private,default,protected,public)


Java有四种访问控制权限:private,default,protected,public

 

 

一、private

我们在代码中做演示

 创建Person类,以Person类为主线,验证它的成员函数和成员变量在不同类、包、子类情况下的访问权限

 

(注意:包的命名要求包含字符均为小写,同时不能有特殊字符)

我们先为Person类创建private修饰的成员变量,测试在同一个类中是否可以使用

package example;

public class Person {
    private String name;

    public static void main(String[] args) {
        Person person = new Person();
        person.name = "艾边成";
    }
}

 

编译器未报错,表示说private修饰的成员变量可以在同一个类中被调用

接着我们在同一个包下的TestPerson类中试着去调用Person类中private修饰的name

编译器报错,表示说private修饰的成员变量不能在同一个包中使用

接下来我们创建Student类,测试Person类的子类是否可以调用private修饰的成员变量

编译器报错,表示说 (Student) 即便是Person的子类,也不能访问Person中private修饰的成员变量

这样看来,修饰符 private 的作用是很强的,只用在自己的类中才能被访问,超过了这个类,谁都不行

 

二、default

default 是默认修饰符,即成员函数或成员变量前没有修饰符时,默认访问权限为 default

package example;

public class Person {
    String gender;      //性别    无修饰符,默认为 default(默认)

    public static void main(String[] args) {
        Person person = new Person();
        person.gender = "男";
    }
}

当在同一个包下尝试调用时

package example;

public class TestPerson {
    public static void main(String[] args) {
        Person person = new Person();
        person.gender = "女";
    }
}

编译器未报错,可正常调用

当在子类中尝试调用时

 

编译器显示正常,但是值得注意的是,此时子类和我们的Person类在同一个包下,可归为上一种情况

于是我们在另一个包 (other) 中创建Person类的子类 Student

 

此时编译器报错,表示说默认修饰符 default 不能在子类中被调用,

当然此处的“子类”一定指和父类不在同一个包,我们用 import 导入所在的包中需要的类

三、protected

同样的方法,我们选择不同的位置逐个去测试

package example;

public class Person {
    protected int age;

    public static void main(String[] args) {
        Person person = new Person();
        person.age = 18;
    }
}

同一个类中没有问题

package example;

public class TestPerson {
    public static void main(String[] args) {
        Person person = new Person();
        person.age = 18;
    }
}

 

同一个包中没有问题

当在不同包的子类中调用时,有意思的事情发生了

 

编译器报错,这不符合我们的预期:在子类中是可以访问到protected的

老师告诉我们(后续我们会做出解释):不同包下的对象,不能直接通过父类对象去访问

我们要使用继承来稍稍改变代码

package other;

import example.Person;

public class Student extends Person{
    public static void main(String[] args) {
        Person person = new Person();

        Student student = new Student();
        student.age = 18;
    }
}

显示正常,用protected修饰的属性,子类可以继承过来,不在父类同一个包下也是可以继承访问到的

如果这时将继承用在同一个包下的Student类中,一定也是可以的

package example;

public class Student extends Person{
    public static void main(String[] args) {
        Person person = new Person();
        person.age = 18;

        Student student = new Student();
        student.age = 18;
    }
}

这是从继承的角度讲的(以后我们会解释)

四、public

任何地方都可以访问到

 

Java面向对象之包和内部类_基础课程_华为云学院_云计算培训-华为云 (huaweicloud.com)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM