Java访问修饰符

简介: 你真的了解Java访问权限吗?类中的默认访问权限和接口中的默认是一回事吗?protected和包访问权限又有什么区别呢?

Java关于访问权限的关键字有三个:private、protected以及public,同时Java还有一个默认的访问权限——包权限,所以Java总共有四种访问权限控制。
public和private没什么好说的,public允许在所有地方访问,而private只能在本类以及内部类中进行访问。
容易混淆的是protected和默认的访问权限,时间长了就不太容易表述两者的差别,下面通过一个例子来说明这两者的差别。

基类位于包main.access下,代码如下:

package main.access;

public class BaseClass {

    protected void protectedMethod() {
        System.out.println("protected method");
    }
    
    void defaultMethod() {
        System.out.println("default method");
    }

}

在包main.access下还有一个子类SamePackage和非子类SamePackage,代码如下:

package main.access;

public class SamePackage extends BaseClass{

    public void foo() {
        protectedMethod();
        defaultMethod();
    }
    
    public static void main(String args[]) {
        BaseClass baseClass =  new BaseClass();
        baseClass.protectedMethod();
        baseClass.defaultMethod();
    }
}
package main.access;

public class SamePackage {

    public static void main(String args[]) {
        BaseClass baseClass =  new BaseClass();
        baseClass.protectedMethod();
        baseClass.defaultMethod();
    }
}

在另一个包test.access中有一个类DiferentPackage

package test.access;

import main.access.BaseClass;

public class DiferentPackage extends BaseClass {

    public void foo() {
        protectedMethod();
        defaultMethod(); // error
    }
    
    public static void main(String[] args) {
        BaseClass baseClass =  new BaseClass();
        baseClass.protectedMethod(); //error
        baseClass.defaultMethod(); //error
    }
}

在main.access的子包main.access.sub下还有一个类SubPackage,其代码如下:

package main.access.sub;

import main.access.BaseClass;

public class SubPackage extends BaseClass {
    public void foo() {
        protectedMethod();
        defaultMethod(); // error
    }
    
    public static void main(String args[]) {
        BaseClass baseClass =  new BaseClass();
        baseClass.protectedMethod(); // error
        baseClass.defaultMethod(); // error
    }
}

结论:在包相同的类中,protected和默认的访问权限均可见,无论子类或者非子类;包不相同时,protected在子类中可见,而默认的访问权限在子类中不可见。

默认的接口访问权限是什么?

public interface InterfaceAccess {

    void foo();
}

是和类一样的默认访问权限吗?来看看字节码吧

Compiled from "InterfaceAccess.java"
public interface main.access.InterfaceAccess {
  public abstract void foo();
}

字节码中已经使用public abstract替代,所以“默认”(不写)在接口中是public,而不是我们通常理解的包访问权限,它不同于类的字节码,

Compiled from "BaseClass.java"
public class main.access.BaseClass {
  public main.access.BaseClass();
  protected void protectedMethod();
  void defaultMethod();
}

所以写接口的时候不要“画蛇添足”地增加访问修饰符,编译器会帮我们做好增加修饰符的工作。

总结

来个图

Screen_Shot_2017_08_01_at_3_57_52_PM

画出图来之后就挺好记的。

关于访问修饰符使用的tips

1、访问修饰符尽可能从严使用,能用private就不要用protected,能用protected就不要用public;
2、接口一般不要使用访问修饰符;
3、待你们来续...

目录
相关文章
|
1月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
55 3
|
1月前
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
72 2
|
2月前
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
49 2
|
2月前
|
小程序 Java
小程序访问java后台失败解决方案
小程序访问java后台失败解决方案
57 2
|
2月前
|
小程序 JavaScript Java
小程序访问java后台
小程序访问java后台
31 1
|
2月前
|
存储 Java
深入理解java对象的访问定位
这篇文章深入探讨了Java对象的访问定位机制,比较了使用句柄和直接指针两种主流的对象访问方式,并指出了它们各自的优势,例如句柄访问在对象移动时的稳定性和直接指针访问的速度优势。
40 0
深入理解java对象的访问定位
|
3月前
|
存储 Java 关系型数据库
java: 无法访问org.springframework.context.ConfigurableApplicationContext
`亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置是干啥的,稀里糊涂的按照博客搭完也跑不起来,因此记录这个。` `项目背景`:公司项目当前采用http协议+shiro+mysql的登录认证方式,而现在想支持ldap协议认证登录然后能够访问自己公司的项目网站。 `举例说明`:假设我们公司有自己的门户网站,现在我们收购了一家公司,他们数据库采用ldap存储用户数据,那么为了他们账户能登陆我们公司项目所以需要集成,而不是再把他们的账户重新在mysql再创建一遍,万一人家有1W个账户呢,不累死了且也不现实啊。
69 11
|
3月前
|
安全 Java 编译器
java访问字段
java访问字段
31 6
|
3月前
|
安全 Java 编译器
java访问类字段
java访问类字段
|
3月前
|
安全 Java 开发者
Java修饰符与封装:理解访问权限、行为控制与数据隐藏的重要性
Java中的修饰符和封装概念是构建健壯、易维护和扩展的Java应用程序的基石。通过合理利用访问权限修饰符和非访问修饰符,开发者能够设计出更加安全、灵活且高效的代码结构。封装不仅是面向对象编程的核心原则之一,也是提高软件项目质量和可维护性的关键策略。
36 1