访问修饰符

修饰符 当前类 同一包内 子孙类(同一包) 子孙类(不同包) 其他包
public Y Y Y Y Y
protected Y Y Y Y/N N
default Y Y Y N N
private Y N N N N

1、访问修饰符控制类、方法、属性的访问权限

2、外部类(顶层类)只能使用 public、default、static、abstract、final 修饰

3、内部类

(1)静态内部类、成员内部类可以使用四种访问修饰符

(2)局部内部类因为属于局部变量,所以不能使用访问修饰符

 

default

1、默认访问修饰符:不使用任何关键字

2、在同一包内可见,不使用任何修饰

3、使用对象:类、接口、变量、方法

4、使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的

5、接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public

 

private

1、私有访问修饰符:private

2、在同一类内可见

3、使用对象:变量、方法。 注意:不能修饰类(外部类)

4、私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private

5、声明为私有访问类型的变量只能通过类中公共的 getter 方法被外部类访问

6、Private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据

 

public

1、公有访问修饰符-public

2、对所有类可见

3、使用对象:类、接口、变量、方法

4、被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问

5、如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。

6、由于类的继承性,类所有的公有方法和变量都能被其子类继承

 

protected

1、对同一包内的类和所有子类可见

2、使用对象:变量、方法。 注意:不能修饰类(外部类)

3、可见性

(1)同一包内,普通类或子类都可以访问父类的 protected 成员

(2)不同包内,在子类中创建子类对象,可以访问父类的 protected 成员

(3)不同包内,在子类中,只有子类实例可以访问其从父类继承的 protected 方法,而在子类中不能访问父类实例(所调用)的 protected 方法

(4)不同包内,在子类中创建另一个子类的对象,不能访问公共父类的 protected 成员

(5)子类可以直接访问父类的 protected static 成员

(6)不论子类、父类是否在同一个包中,不在 protected 所在包的其他类,都不能通过子类、父类的对象访问 protected 成员

(7)不论是否在一个包内,父类中可以访问子类实例(对象)继承的父类 protected 修饰的方法(子父类访问权限特点:父类访问域大于子类)

package p1;
public class Father1 {
    protected void f() {
    }
}

package p1;
public class Son1 extends Father1 {
}

package p2;
public class Son2 extends Father1{
}

package p1;
public class Test {
    public static void main(String[] args) {
        
        Son1 son1 = new Son1();
        son1.f(); // Compile OK

        Son2 son = new Son2();    
        son2.f(); // Compile OK
    }
}

(8)若子类与基类(父类)不在同一包中,父类中不可以使用子类实例调用(父类中没有)子类中特有的(自己的)protected 修饰的成员(因为没有满足同一包内和继承获得 protected 成员的关系)

package P1;
public class Test {
    public static void main(String args[]) throws CloneNotSupportedException {
        MyObject obj = new MyObject();
        obj.clone(); // Compile Error      -----(1)
    }
}

package P2;
public class MyObject extends Test {
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
posted @ 2022-03-20 17:34  半条咸鱼  阅读(181)  评论(0)    收藏  举报