阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

作用域

283次阅读
没有评论

共计 2841 个字符,预计需要花费 8 分钟才能阅读完成。

在 Java 中,我们经常看到 publicprotectedprivate 这些修饰符。在 Java 中,这些修饰符可以用来限定访问作用域。

public

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

package abc;

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

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

package xyz;

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

定义为 publicfieldmethod可以被其他类访问,前提是首先有访问 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

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

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 class),Java 支持好几种嵌套类。

protected

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

package abc;

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

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

package xyz;

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

package

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

package abc;
// package 权限的类:
class Hello {// package 权限的方法:
    void hi() {}}

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

package abc;

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

注意,包名必须完全一致,包没有父子关系,com.apachecom.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 i=0; i<10; 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。

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

final

Java 还提供了一个 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 类的名字相同。

小结

Java 内建的访问权限包括 publicprotectedprivatepackage权限;

Java 在方法内部定义的变量是局部变量,局部变量的作用域从变量声明开始,到一个块结束;

final修饰符不是访问权限,它可以修饰 classfieldmethod

一个 .java 文件只能包含一个 public 类,但可以包含多个非 public 类。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计2841字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7822055
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024 程序员】我劝你赶紧去免费领一个 AWS、华为云等的主机 每年 10 月 24 日,程序员们都会迎来...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...