资讯详情

资讯详情

爆肝一个月,Java 从入门到精通16 - 作用域

在Java中我们经常看到public、protected、private这些修饰符。在Java中这些修饰符可以用来限定访问作用域。public定义为public的class、interface可以被其他任何类访问package abc; public class Hello { public void hi() { } }上面的Hello是public因此可以被其他包的类访问package xyz; class Main { void foo() { // Main可以访问Hello Hello h new Hello(); } }定义为public的field、method可以被其他类访问前提是首先有访问class的权限package abc; public class Hello { public void hi() { } }上面的hi()方法是public可以被其他类调用前提是首先要能访问Hello类package xyz; class Main { void foo() { Hello h new Hello(); h.hi(); } }private定义为private的field、method无法被其他类访问package abc; public class Hello { // 不能被其他类调用: private void hi() { } public void hello() { this.hi(); } }实际上确切地说private访问权限被限定在class的内部而且与方法声明顺序无关。推荐把private方法放到后面因为public方法定义了类对外提供的功能阅读代码的时候应该先关注public方法package abc; public class Hello { public void hello() { this.hi(); } private void hi() { } }由于Java支持嵌套类如果一个类内部还定义了嵌套类那么嵌套类拥有访问private的权限// private public class Main { public static void main(String[] args) { Inner i new Inner(); i.hi(); } // private方法: private static void hello() { System.out.println(private hello!); } // 静态内部类: static class Inner { public void hi() { Main.hello(); } } }定义在一个class内部的class称为嵌套类nested classJava支持好几种嵌套类。protectedprotected作用于继承关系。定义为protected的字段和方法可以被子类访问以及子类的子类package abc; public class Hello { // protected方法: protected void hi() { } }上面的protected方法可以被继承的类访问package xyz; class Main extends Hello { void foo() { // 可以访问protected方法: hi(); } }package最后包作用域是指一个类允许访问同一个package的没有public、private修饰的class以及没有public、protected、private修饰的字段和方法。package abc; // package权限的类: class Hello { // package权限的方法: void hi() { } }只要在同一个包就可以访问package权限的class、field和methodpackage abc; class Main { void foo() { // 可以访问package权限的类: Hello h new Hello(); // 可以调用package权限的方法: h.hi(); } }注意包名必须完全一致包没有父子关系com.apache和com.apache.abc是不同的包。局部变量在方法内部定义的变量称为局部变量局部变量作用域从变量声明处开始到对应的块结束。方法参数也是局部变量。package abc; public class Hello { void hi(String name) { // 1 String s name.toLowerCase(); // 2 int len s.length(); // 3 if (len 10) { // 4 int p 10 - len; // 5 for (int i0; i10; i) { // 6 System.out.println(); // 7 } // 8 } // 9 } // 10 }我们观察上面的hi()方法代码方法参数name是局部变量它的作用域是整个方法即1 ~ 10变量s的作用域是定义处到方法结束即2 ~ 10变量len的作用域是定义处到方法结束即3 ~ 10变量p的作用域是定义处到if块结束即5 ~ 9变量i的作用域是for循环即6 ~ 8。使用局部变量时应该尽可能把局部变量的作用域缩小尽可能延后声明局部变量。finalJava还提供了一个final修饰符。final与访问权限不冲突它有很多作用。用final修饰class可以阻止被继承package abc; // 无法被继承: public final class Hello { private int n 0; protected void hi(int t) { long i t; } }用final修饰method可以阻止被子类覆写package abc; public class Hello { // 无法被覆写: protected final void hi() { } }用final修饰field可以阻止被重新赋值package abc; public class Hello { private final int n 0; protected void hi() { this.n 1; // error! } }用final修饰局部变量可以阻止被重新赋值package abc; public class Hello { protected void hi(final int t) { t 1; // error! } }最佳实践如果不确定是否需要public就不声明为public即尽可能少地暴露对外的字段和方法。把方法定义为package权限有助于测试因为测试类和被测试类只要位于同一个package测试代码就可以访问被测试类的package权限方法。一个.java文件只能包含一个public类但可以包含多个非public类。如果有public类文件名必须和public类的名字相同。喜欢这个系列的同学可以关注我爆肝一个月Python 从入门到精通
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →