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

目录
  • Java默认的访问权限作用域
    • 关于抽象类
    • 关于接口
  • Java的访问权限控制
    • 1.修饰类
    • 2.修饰类的方法和变量

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 {
    /**
     * @param args
     */
    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.修饰类的方法和变量

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

  • private:如果一个类的方法或者变量被private修饰,那么这个类的方法或者变量只能在该类本身中被访问,在类外以及其他类中都不能显示地进行访问。
  • protected:如果一个类的方法或者变量被protected修饰,对于同一个包的类,这个类的方法或变量是可以被访问的。对于不同包的类,只有继承于该类的类才可以访问到该类的方法或者变量。
  • public:被public修饰的方法或者变量,在任何地方都是可见的。

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

例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类,则源代码文件的名称可以随意命名。

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

(0)

相关推荐

  • 浅析Java中的访问控制权限

    Java中为什么要设计访问权限控制机制呢?主要作用有两点: (1)为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分. (2)为了让类库设计者可用更改类的内部工作方式,而不必担心会对用户造成重大影响. Java中的访问权限控制的等级,按照权限从大到小依次为: Public -> protected -> 包访问权限(没有权限修饰词)-> private.  一.包(package) Java中包(package)的概念和

  • Java的访问修饰符与变量的作用域讲解

    Java访问修饰符(访问控制符) Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private boolean myFlag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42; public static void main(String[] arguments)

  • 举例详解Java中的访问权限修饰符

    访问权限符: (1)public: 对于成员来说:任何其他类都可以访问它们,不管在同一个包中还是在另外的包中. 对于类来说:    也是一样. (2)friendly: 对于成员老说:如果一个类的成员没有任何权限修饰,那么它门就是缺省包访问权限,用friendly来表示,注 意friendly不是Java中的关键字,这里是个人喜欢的方式用它表示而已.同一个包内其它类可以访问,但包外 就不可以.对于同一个文件夹下的.没有用package的classes,Java会自动将这些classes初见为隶属

  • Java中四种访问权限资料整理

     Java中四种访问权限总结 一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访问权限限制的最窄的修饰符,一般称之为"私有的".被其修饰的属性以及方法只能被该类的对象 访问,其子类不能访问,更不能允许跨包访问. 2. default:即不加任何访问修饰符,通常称为"默认访问权限"或者"包访问权限".

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

    目录 Java默认的访问权限作用域 关于抽象类 关于接口 Java的访问权限控制 1.修饰类 2.修饰类的方法和变量 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 关于接口 JD

  • Angularjs中的页面访问权限怎么设置

    在以往的项目中,前后端常见的配合方式是前端提供页面和ui加一点DuangDuangDuang的效果,后端搭建框架数据结构和数据交互(数据交互前后端有交集),不管是.net.java or php都能一对多的提供前端服务,然而在新形式下项目中运用了前端框架,开发情况就不一样了,比如我要说的这是在angular框架下完成的开发,模式是后端提供服务和api文档,页面和数据交互及逻辑处理由前端完成,前端俨然是个完全的programer了,这个过程中就会遇到之前意想不到的问题(如果没有做过后端开发),比如

  • java中自定义Spring Security权限控制管理示例(实战篇)

    背景描述 项目中需要做细粒的权限控制,细微至url + httpmethod (满足restful,例如: https://.../xxx/users/1, 某些角色只能查看(HTTP GET), 而无权进行增改删(POST, PUT, DELETE)). 表设计 为避嫌,只列出要用到的关键字段,其余敬请自行脑补. 1.admin_user 管理员用户表, 关键字段( id, role_id ). 2.t_role 角色表, 关键字段( id, privilege_id ). 3.t_privi

  • Python中设置变量访问权限的方法

    在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name.score属性: >>> bart = Student('Bart Simpson', 98) >>> bart.score 98 >>> bart.score = 59 >>> bart.score 59 如果要让内部属性不被外部

  • 浅谈Java中各种修饰符与访问修饰符的说明

    JAVA中的类只能是public 或者package的.这是符合逻辑的:人们定义类的初衷就是为了让别人用的.倘若是private,别人怎么调用?但是有一个内部类可以被定义为private.严格上说,内部类,算不得上是一种光明正大的类,内部类在某种意义上是类这个王国里的特务和地下工作者.特务和地下工作者为王国起了不少作用,但是几乎从来不敢在公众场合抛投露面.就算要露面,也要在主人(class)的同意下,向导(Interface)的引导下,才敢战战兢兢的走出来.下面是常规的一些类的修饰符和访问修饰符

  • 浅析java修饰符访问权限(动力节点Java学院整理)

    Java有四种访问权限,其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符: 1. private: Java语言中对访问权限限制的最窄的修饰符,一般称之为"私有的".被其修饰的类.属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问. 2. default:即不加任何访问修饰符,通常称为"默认访问模式".该模式下,只允许在同一个包中进行访问. 3. protect: 介于public 和 pri

  • Java类的访问权限关键字用法说明

    Java中提供了三个关键字在类的内部设置边界,控制类的访问权限,分别是:public.protected.private.这些访问的指定词决定了紧跟其后的被定义的东西可以被谁使用. public:表示其后的元素对任何人都可以使用. private:表示其后的元素除了类型的创建者和内部的方法之外任何人都不能访问. protected:与private相当,差别在于继承的类可以访问protected修饰的元素,同包中的其他类元素也可以访问. Java还有一种默认的访问权限,在不指定任何关键字的情况下

  • C++中访问权限的示例详解

    众所周知,C++面向对象的三大特性为:封装,继承和多态.下面我们就先对封装做一些简单的了解.封装是通过C++中的类来完成的,类是一种将抽象转换为用户定义类型的工具.类的定义如下: class circle { public: //成员变量 int m_L; int m_H; public: //成员函数(方法) double get_Square() { return m_L*m_H; } } 在上面的代码中,我们定义了一个 "circle" 类,主要包含三个部分:成员变量,成员方法和

随机推荐