文章目录

  • 1.访问权限从何而来?
  • 1.1.私有(private)
  • 1.1.1私有变量和私有方法
  • 1.1.2 例子
  • 1.2.公有(public)
  • 1.2.1 公有变量和方法
  • 1.2.2 例子
  • 1.3.友好(无修饰符)
  • 1.3.1 友好变量和方法
  • 1.4.受保护(protected)
  • 1.4.1 受保护的变量和方法
  • 2.四种修饰符的差异


1.访问权限从何而来?

我们已经知道当一个类创建了一个对象后,该对象可以通过 . 操作符访问自己的变量,使用其中的方法。
实际上在Java中我们通过对象操作的变量和使用类中的方法是有限制的,我们并不是能随心所欲的访问一个对象的所有变量或所有方法的。
其限制的主要原因是在声明变量和方法时的修饰符,访问权限修饰符大概分为四类:
私有(private),公有(public),友好(无修饰符),保护(protected)

1.1.私有(private)

1.1.1私有变量和私有方法

在定义的类的时候在声明变量/方法前加上private修饰符,表示声明的是私有变量或方法,其访问权限是只能在自己类中的访问。当在另外一个类中用一个类创建了一个该类的对象后,该对象不能访问自己的私有变量,调用类中的私有方法。

想要对数据的操作只能在本类中处理就可以使用private这个关键字。

1.1.2 例子

public class PersonPrivate {
    private int x;
    private int getX() {
        return x;
    }
    private void setX(int x) {
        this.x = x;
    }
}

java中private与final java的private和public_修饰符


我们可以看到,在另一个类中创建PersonPrivate对象后,无法通过该对象调用其中定义的private变量或方法。

1.2.公有(public)

1.2.1 公有变量和方法

用public修饰的成员变量和方法我们称之为公有变量和方法。
在任何一个类中用另一个类创建了一个对象,可以通过该对象访问其中的共有变量和方法。

1.2.2 例子

public class PersonPublic {
    public int x;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
}

java中private与final java的private和public_java中private与final_02

我们可以看到,在另一个类中创建该类的对象后,可以直接访问该类定义的public方法和变量。

1.3.友好(无修饰符)

1.3.1 友好变量和方法

不用private,public,protected修饰符修饰的成员变量和方法被称为友好变量和友好方法。这种变量和方法的可见性只允许同一包的其他类创建对象后可以用对象进行访问。
在同一包中的前提下在任何一个类中用一个类创建了一个对象,该对象能访问该类中的友好变量和方法,否则不可见。

public class PersonFriend {
    int x;
    void set(int x){
        this.x = x;
    }
    int getX(){
        return x;
    }
}

当在同一个包里的时候,可见

java中private与final java的private和public_成员变量_03

下面再另一个包中创建PersonFriend对象并试图访问:

java中private与final java的private和public_私有变量_04

可以发现,无法进行访问。

1.4.受保护(protected)

1.4.1 受保护的变量和方法

用protected修饰的成员变量和方法被称为受保护的成员变量和方法。当在另外一个类中用一个类创建了一个对象后,如果两个类在同一包中,那么该对象可以访问该类的protected变量和方法,否则不可见。

大家可能会有一个疑惑:友好和受保护的用法好像相同,其实他们还是有差别的
(1)子类和父类在同一包中的继承性:除了private成员变量和方法,其他的都继承了。

public class PersonExtend {
    public int x;
    private int y;
    int z;
    protected int n;
}
public class PersonSon extends PersonExtend{
    public int name;
}

java中private与final java的private和public_成员变量_05

可以看到,除了私有变量y,其他的都继承了。

(2)子类和父类不在同一包中:子类只继承父类的protected和public成员,友好成员不继承了。(这里protected和友好类的差别出现了)
这里将父类和子类放在不同的包中:

package exa09;
public class PersonExtend {
    public int x;
    private int y;
    int z;
    protected int n;
}
package exa08;

import exa09.PersonExtend;

public class PersonSon extends PersonExtend {
    public int name;
}

java中private与final java的private和public_java_06

这里可以看到,这时只继承了protected和public的变量。

2.四种修饰符的差异

类声明时,如果在关键字class前加上public关键字,我们称为public类,不加则是友好类。

我们可以在任何另外一个类中使用public类创建对象,但要在另一个类中用友好类创建对象时,必须要保证它们在同一包中。

java中private与final java的private和public_私有变量_07

代码地址:
https://gitee.com/yan-jiadou/study/tree/master/Java%E5%9F%BA%E7%A1%80%E5%AD%A6%E4%B9%A0/src/main/java/exa09