文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java中默认的访问权限作用域解析

2024-04-02 19:55

关注

Java默认的访问权限作用域

作用域 当前类 同一包(package) 子孙类 其他包
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N

1、要点

关于抽象类

JDK 1.8以前,抽象类的方法默认访问权限为protected

JDK 1.8时,抽象类的方法默认访问权限变为default

关于接口

JDK 1.8以前,接口中的方法必须是public的

JDK 1.8时,接口中的方法可以是public的,也可以是default的

JDK 1.9时,接口中的方法可以是private的

Java的访问权限控制

今天我们来一起了解一下Java语言中的访问权限控制。在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制。考虑两个场景:

场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理?

场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1、fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理?

此时,访问权限控制便可以起到作用了。

在Java中,提供了四种访问权限控制:默认访问权限(包访问权限),public,private以及protected。

注意,上述四种访问权限,只有默认访问权限和public能够用来修饰类。修饰类的变量和方法四种权限都可以。(本处所说的类针对的是外部类,不包括内部类)

下面就分别针对修饰类和修饰类的成员来讲述这四种访问权限控制。

1.修饰类

默认访问权限(包访问权限):用来修饰类的话,表示该类只对同一个包中的其他类可见。

public:用来修饰类的话,表示该类对其他所有的类都可见。

下面通过几个例子来看一下两者的区别:

例1:

Main.java:


package com.cxh.test1;  
public class Main { 
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub         
        People people = new People("Tom");
        System.out.println(people.getName());
    } 
}

People.java


package com.cxh.test1; 
class People {           //默认访问权限(包访问权限) 
    private String name = null;     
    public People(String name) {
        this.name = name;
    }     
    public String getName() {
        return name;
    }     
    public void setName(String name) {
        this.name = name;
    }
}

从代码可以看出,修饰People类采用的是默认访问权限,而由于People类和Main类在同一个包中,因此People类对于Main类是可见的。

程序运行结果:

例子2:

People.java


package com.cxh.test2;
class People {           //默认访问权限(包访问权限)
    private String name = null;
    public People(String name) {
        this.name = name;
    }
     
    public String getName() {
        return name;
    }
     
    public void setName(String name) {
        this.name = name;
    }
}

此时People类和Main类不在同一个包中,会发生什么情况呢?

下面是Main类中的提示的错误:

提示Peolple类在Main类中不可视。从这里就可以看出,如果用默认访问权限去修饰一个类,该类只对同一个包中的其他类可见,对于不同包中的类是不可见的。

正如上图的快速修正提示所示,将People类的默认访问权限更改为public的话,People类对于Main类便可见了。

2.修饰类的方法和变量

默认访问权限(包访问权限):如果一个类的方法或变量被包访问权限修饰,也就意味着只能在同一个包中的其他类中显示地调用该类的方法或者变量,在不同包中的类中不能显示地调用该类的方法或变量。

下面再通过几个例子来看一下它们作用域类的方法和变量时的区别:

例3:

Main.java没有变化

People.java


package com.cxh.test1;
public class People {      
    private String name = null;
    public People(String name) {
        this.name = name;
    }
    String getName() {    //默认访问权限(包访问权限)
        return name;
    }
    void setName(String name) {   //默认访问权限(包访问权限)
        this.name = name;
    }
}

此时在Main类是可以显示调用方法getName和setName的。

但是如果People类和Main类不在同一个包中:


package com.cxh.test2;    //与Main类处于不同包中
public class People {      
    private String name = null;
    public People(String name) {
        this.name = name;
    }
    String getName() {    //默认访问权限(包访问权限)
        return name;
    }
    void setName(String name) {   //默认访问权限(包访问权限)
        this.name = name;
    }
}

此时在Main类中会提示错误:

由此可以看出,如果用默认访问权限来修饰类的方法或者变量,则只能在同一个包的其他类中进行访问。

例4:

People.java


package com.cxh.test1;   
public class People {      
    private String name = null;
    public People(String name) {
        this.name = name;
    }
    protected String getName() {   
        return name;
    }
    protected void setName(String name) {  
        this.name = name;
    }
}

此时是可以在Main中显示调用方法getName和setName的。

如果People类和Main类处于不同包中:


package com.cxh.test2;   
public class People {      
    private String name = null;
    public People(String name) {
        this.name = name;
    }
    protected String getName() {   
        return name;
    }
    protected void setName(String name) {  
        this.name = name;
    }
}

则会在Main中报错:

如果在com.cxh.test1中定一个类Man继承People,则可以在类Man中显示调用方法getName和setName:


package com.cxh.test1;
import com.cxh.test2.People;
public class Man extends People{
    public Man(String name){
        super(name);
    }
    public String toString() {
        return getName();
    }
}

下面补充一些关于Java包和类文件的知识:

1)Java中的包主要是为了防止类文件命名冲突以及方便进行代码组织和管理;

2)对于一个Java源代码文件,如果存在public类的话,只能有一个public类,且此时源代码文件的名称必须和public类的名称完全相同,另外,如果还存在其他类,这些类在包外是不可见的。如果源代码文件没有public类,则源代码文件的名称可以随意命名。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯