Java访问修饰符

    |     2015年3月30日   |   Java面向对象   |     0 条评论   |    1724

Java 用修饰符控制类、属性和方法的访问权限以及其他能力,通常写在语句最前面。例如:

public class className {
    // body of class
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
    // body of method
}

修饰符分访问修饰符和非访问修饰符。本节只讲访问修饰符(也叫访问控制符):能管住类、成员变量、方法能被谁用的那几个关键字。面向对象里,它们就是用来保护类、变量、方法和构造方法的那道门。

一、四种访问权限

Java 支持四种访问权限:

c

修饰符 谁能访问 注意
public 任何其他类 跨包要 import;公有方法和变量会被子类继承;main 必须是 public
protected 同包任意类 + 不同包的子类 不能修饰类和接口
默认(不写) 同一个包内可见 接口里的变量隐式 public static final,方法默认 public
private 只能被所属类访问 类和接口不能声明为 private;对外用 Getter / Setter

二、public:公有的

声明为 public 的类、方法、构造方法和接口,能被任何其他类访问。几个 public 类若不在同一个包,需要导入对方所在的包。因为有继承,类的公有方法和变量都能被子类继承。

下面的方法用了公有访问控制:

public static void main(String[] arguments) {
    // body of method
}

Java 程序的 main() 必须是 public,否则解释器跑不起来。

三、protected:受保护的

声明为 protected 的变量、方法和构造方法:同一个包里谁都能用,不同包里只有子类能用。它不能修饰类和接口;方法和成员变量可以是 protected,接口的成员不行。

子类能访问父类的 protected 方法和变量,不相关的类就进不去。下面父类用了 protected,子类重写了 bark():

public class Dog {
    protected void bark() {
        System.out.println("汪汪,不要过来");
    }
}

class Teddy extends Dog {  // 泰迪
    void bark() {
        System.out.println("汪汪,我好怕,不要跟着我");
    }
}

若把 bark() 改成 private,除了 Dog 谁都进不去;改成 public,所有类都能进。只想给子类看见,就用 protected。

四、private:私有的

private 最严:方法、变量、构造方法只能被所属类访问。类和接口不能声明为 private。私有变量对外只能走公共的 Getter / Setter,用来藏实现细节、保护数据。

public class Dog {
    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

name、age 是私有的,别的类不能直接读改。于是提供两对 public 方法:getName() / setName()、getAge() / setAge()。

this 是 Java 关键字,可先看站内《Java this关键字详解》。访问私有变量的方法习惯命名:变量名前加 get / set,并把首字母大写,也就是常说的 Getter 和 Setter。

五、默认:不写任何关键字

不写修饰符的属性和方法,对同一个包内的类可见。接口里的变量都隐式声明为 public static final,接口方法默认是 public。

class Dog {
    String name;
    int age;

    void bark() {  // 汪汪叫
        System.out.println("汪汪,不要过来");
    }
    void hungry() {  // 饥饿
        System.out.println("主人,我饿了");
    }
}

六、继承时怎么收紧、放宽

还不熟继承的可以先跳过,或去看《Java继承和多态》。规则是:

  • 父类 public 的方法,子类也必须是 public。
  • 父类 protected 的方法,子类只能是 protected 或 public,不能改成 private。
  • 父类默认修饰的方法,子类可以改成 private。
  • 父类 private 的方法不能被继承。

想让类被所有人用,就声明为 public;只想给本包用,就省略修饰符。成员数据则按需要设成 public、protected,或者省略。

一句话总结:能给全世界的用 public,只给子类和同包的用 protected,只给同包的就什么都不写,藏起来的用 private,对外再开 Getter / Setter。

转载请注明来源:Java访问修饰符
本文链接地址:https://ai.zhousir.top/?p=73

上一篇:

下一篇:

回复 取消