前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >作用域

作用域

作者头像
背雷管的小青年
发布2020-07-08 11:02:06
4790
发布2020-07-08 11:02:06
举报

作用域

public

定义为publicclassinterface可以被其他任何类访问:

代码语言:javascript
复制
package abc;

public class Hello {
    public void hi() {
    }
}

上面的Hellopublic,因此,可以被其他包的类访问:

代码语言:javascript
复制
package xyz;

class Main {
    void foo() {
        // Main可以访问Hello
        Hello h = new Hello();
    }
}

private

定义为privatefieldmethod无法被其他类访问:

代码语言:javascript
复制
package abc;

public class Hello {
    // 不能被其他类调用:
    private void hi() {
    }

    public void hello() {
        this.hi();
    }
}

实际上,确切地说,private访问权限被限定在class的内部,而且与方法声明顺序无关。推荐把private方法放到后面,因为public方法定义了类对外提供的功能,阅读代码的时候,应该先关注public方法:

代码语言:javascript
复制
package abc;

public class Hello {
    public void hello() {
        this.hi();
    }

    private void hi() {
    }
}

protected

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

代码语言:javascript
复制
package abc;

public class Hello {
    // protected方法:
    protected void hi() {
    }
}

上面的protected方法可以被继承的类访问:

代码语言:javascript
复制
package xyz;

class Main extends Hello {
    void foo() {
        Hello h = new Hello();
        // 可以访问protected方法:
        h.hi();
    }
}

package

最后,包作用域是指一个类允许访问同一个package的没有publicprivate修饰的class,以及没有publicprotectedprivate修饰的字段和方法。

代码语言:javascript
复制
package abc;
// package权限的类:
class Hello {
    // package权限的方法:
    void hi() {
    }
}

只要在同一个包,就可以访问package权限的classfieldmethod

代码语言:javascript
复制
package abc;

class Main {
    void foo() {
        // 可以访问package权限的类:
        Hello h = new Hello();
        // 可以调用package权限的方法:
        h.hi();
    }
}

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

局部变量

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

代码语言:javascript
复制
package abc;

public class Hello {
    void hi(String name) { // ①
        String s = name.toLowerCase(); // ②
        int len = s.length(); // ③
        if (len < 10) { // ④
            int p = 10 - len; // ⑤
            for (int i=0; i<10; i++) { // ⑥
                System.out.println(); // ⑦
            } // ⑧
        } // ⑨
    } // ⑩
}

我们观察上面的hi()方法代码:

  • 方法参数name是局部变量,它的作用域是整个方法,即①~⑩;
  • 变量s的作用域是定义处到方法结束,即②~⑩;
  • 变量len的作用域是定义处到方法结束,即③~⑩;
  • 变量p的作用域是定义处到if块结束,即⑤~⑨;
  • 变量i的作用域是for循环,即⑥~⑧。

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

final

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

final修饰class可以阻止被继承:

代码语言:javascript
复制
package abc;

// 无法被继承:
public final class Hello {
    private int n = 0;
    protected void hi(int t) {
        long i = t;
    }
}

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

代码语言:javascript
复制
package abc;

public class Hello {
    // 无法被覆写:
    protected final void hi() {
    }
}

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

代码语言:javascript
复制
package abc;

public class Hello {
    protected void hi(final int t) {
        t = 1; // error!
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作用域
    • public
      • private
        • protected
          • package
            • 局部变量
              • final
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档