1、权限修饰符

        在Java中,经常看到public、protected、private这些修饰符,这些修饰符可以用来限定访问作用域。

(1)public

        定义为public的类(class)、接口(interface)可以被其它任何类访问。

        定义为public的字段(field)、方法(method)可以被其它类访问,前提是首先有访问class的权限。

(2)private

        定义为private的字段(field)、方法(method)无法被其他类访问。实际上,private访问权限被限定在类(class)的内部,而且与方法声明顺序无关。

        推荐把private方法放到后面,因为public方法定义了类对外提供的功能。

        由于Java支持嵌套类,如果一个类内部还定义了嵌套类,那么嵌套类拥有访问private的权限。定义在一个class内部的class称为嵌套类(nested class)。

public class Main {
    private static void hello() {   // 私有方法
        System.out.println("private hello");    
    }
    
    // 静态内部类
    static class Inner {
        public void hi() {
            Main.hello();  // 访问外部类私有方法        
        }    
    }
}

(3)protected

        protected作用于继承关系。定义为protected的字段和方法可以被子类访问,以及子类的子类。

2、 包package、局部变量和final

(1)package

        包作用域是指一个类允许访问同一个package的没有public、private修饰的class,以及没有public、protected、private修饰的字段和方法。

        只要在同一个包,就可以访问package权限的class、field和method。

        注意:包名必须完全一致,包没有父子关系,com.apache和com.apache.abc是不同包。

(2)局部变量

        在方法内部定义的变量称为局部变量,局部变量作用域从变量声明处开始到对应的块结束。方法参数也是局部变量。

        使用局部变量时,应该尽可能把局部变量的作用域缩小,尽可能延后声明局部变量。

(3)final

        Java提供了一个final修饰符,final与访问权限不冲突,它有很多作用:

                用final修饰class可以阻止被继承;

                用final修饰method可以阻止被子类覆写;

                用final修饰field可以阻止被重新赋值;

                用final修饰局部变量可以阻止被重新赋值。

3、总结

        如果不确定是否需要public,就不声明为public,即尽可能少地暴露对外的字段和方法。

        把方法定义为package权限有助于测试,因为测试类和被测试类只要位于同一个package,测试代码就可以访问被测试类的package权限方法。

        一个".java"文件只能包含一个public类,但可以包含多个非public类,如果有public类,文件名必须和public类的名字相同。