需要解释:Java中的私有访问修饰符

Posted

技术标签:

【中文标题】需要解释:Java中的私有访问修饰符【英文标题】:Need explanation on: Private Access modifier in java 【发布时间】:2018-02-13 21:45:41 【问题描述】:

我在 Java 中有两个类:Fist 类正在扩展 Person 类。我在Person 中有一个变量eyecolor,它是私有的,我有一个公共的setter 和getter。

现在,如果我在 Fist 类中扩展它,那么我可以设置变量并且也可以获取它。

我的问题是,如果 eyecolorPerson 类的私有成员,为什么我在使用私有成员时没有收到错误消息?为什么这段代码有效? eyecolor 数据成员是否被继承?

人物类

package lets_start;

public class Person 
    private String eyecolor;

    public String getEyecolor() 
        return eyecolor;
    

    public void setEyecolor(String eyecolor) 
        this.eyecolor = eyecolor;
    

拳类

package lets_start;

public class Fist extends Person 
    public static void main(String[] args) 
        Fist f = new Fist();
        f.setEyecolor("Brown");
        System.out.println(f.getEyecolor());
    

输出:

棕色

【问题讨论】:

通过公共 getter getEyecolor. 我不确定,你的问题是什么。 Fist 继承了公共的 getter 和 setter 方法。 仅在Person 类中访问私有字段。如果您在类Fist 中创建一个方法,其中您尝试直接访问字段eyecolor,那么它将无法编译。 现在请查看问题 “为什么我没有收到使用私人会员的错误?”因为您没有直接访问它,所以您使用的是公共吸气剂。 “眼睛颜色数据成员是继承的吗?”不,它没有,它继承了公共 getter/setter 【参考方案1】:

要从子类访问/编辑它,请创建字段protected/package-private 或使用您在Person 中定义的getter/setter。

见https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html


为什么我可以从它的子类访问它,而不会出现使用私有成员的错误?为什么这段代码有效? eyecolor 数据成员 get 是继承的吗?

因为您通过继承自Personpublic getter/setter 访问它。为了更清楚,eyecolor 字段不是继承的,getter/setter 是。

如果不清楚,请随时编辑您的问题或评论。

【讨论】:

【参考方案2】:

您访问的不是私有成员,而是访问公共方法。

访问私有成员如下所示,会产生编译时错误:

package lets_start;

public class Fist extends Person 
    public static void main(String[] args) 
        Fist f = new Fist();
        f.eyecolor = "Brown";
        System.out.println(f.eyecolor);
    

【讨论】:

所以当我这样做时值被存储在哪里:f.setEyecolor("Brown");

以上是关于需要解释:Java中的私有访问修饰符的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中的访问修饰符和包

java 访问修饰符

Scala访问修饰符

Java 修饰符

java中的访问修饰符

简单的描述Java中的构造函数,及访问修饰符