java中的访问控制符

首先来一张图:

对于一个类而言访问控制符只有一个public和默认无修饰符。其他的几个访问修饰符对于变量和方法都可以使用。

下面介绍具体的使用。

1. 公有访问控制符(public)

Java的类是通过包的概念来组织的,包是类的一个松散的集合。处于同一个包中的类可以不需要任何说明二方便地相互访问和引用,而对于不同包中的类,则不行。

但如果一个类被声明为public时,它就具有了被其他包中的类访问的可能性,只要这些其他包中的类在程序中使用了import语句引入了public类,就可以访问和引用这个类。

每个Java程序的主类必须是public类,也是基于相同的原因。

用public修饰的类变量称为公共变量。如果公共变量属于公共类,则它能被所有的其他类所引用。public修饰符会造成安全性的数据封装性下降,所以一般减少public域的使用。

2. 私有访问控制符(private)

用private修饰的变量或方法只能被该类自身所访问和修改,而且不能被其他任何类(包括该类的子类)来获取和引用。private修饰符用来声明那些类的私有成员,它提供了最高的保护级别。

3. 保护访问控制符(protected)

用protected修饰的成员变量可以被3种类所引用:该类自身、与它在同一个包中的其他类、在其他包中该类的子类。使用protected修饰符的主要作用是允许其他包中该类的子类来访问父类的特定属性。

4. 默认访问控制符

默认访问控制权规定,该类只能被同一个包中的类访问和引用,而不可以被其他包中的类使用,这种访问特性又称为包访问性。

同样道理,类内的变量或方法如果没有访问控制符来规定,也就是具有包访问性。简单地说,定义在同一个程序中的所有类属于一个包。

5. 总结

简单总结一下,按它们访问范围由大到小排列如下:

public:任何地方均可访问

protected:同一包和子类可见

默认:同一包中可见

private:仅该类部可见

6. 问题

6.1 com.tuhooo和com.tuhooo.test这两个包有什么关系么?

目测没啥关系,因为包起到的是命名空间的作用,似乎并没有父包和子包的概念。

6.2 实际用protect这个访问控制符我用得比较少,倒是看见很多框架源码中用的是这个protected。

6.3 java中的访问控制符还是挺好理解的,那么在字节码层面是如何实现访问控制符的呢?

7. 访问控制符的底层探索

这里用一个比较简单的类Student.java作为示例,在这个类中四种访问控制符都用到了。

package com.tuhooo.demo.test;

public class Student {
    private int age;
    protected double salary;
    public String name;
    char sex;
}

通过如下两种命令,先编译然后得到底层的字节码。

javac Student.java
javap -verbose Student.class > info.log
Classfile /C:/Users/tuhooo/IdeaProjects/demo/src/com/tuhooo/demo/test/Student.class
  Last modified 2018-5-16; size 302 bytes
  MD5 checksum 92caa220b2c7efcdda2a68e7e53c63e7
  Compiled from "Student.java"
public class com.tuhooo.demo.test.Student
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#18         // java/lang/Object."<init>":()V
   #2 = Class              #19            // com/tuhooo/demo/test/Student
   #3 = Class              #20            // java/lang/Object
   #4 = Utf8               age
   #5 = Utf8               I
   #6 = Utf8               salary
   #7 = Utf8               D
   #8 = Utf8               name
   #9 = Utf8               Ljava/lang/String;
  #10 = Utf8               sex
  #11 = Utf8               C
  #12 = Utf8               <init>
  #13 = Utf8               ()V
  #14 = Utf8               Code
  #15 = Utf8               LineNumberTable
  #16 = Utf8               SourceFile
  #17 = Utf8               Student.java
  #18 = NameAndType        #12:#13        // "<init>":()V
  #19 = Utf8               com/tuhooo/demo/test/Student
  #20 = Utf8               java/lang/Object
{
  protected double salary;
    descriptor: D
    flags: ACC_PROTECTED

  public java.lang.String name;
    descriptor: Ljava/lang/String;
    flags: ACC_PUBLIC

  char sex;
    descriptor: C
    flags:

  public com.tuhooo.demo.test.Student();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
}
SourceFile: "Student.java"

主版本号(major)下面有两个字节代表访问标志(access_flags),这个标志用于识别一些类或接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话是否声明为final等。具体的标志位以及标志位的含义如下表:

access_flags中一共有16个标志位可以使用,当前只定义了其中的8个,没有使用到的标志位要求一律为0。以当前的Student类为例,这是一个普通的类,不是接口、枚举或者注解,被public关键字修饰但并没被声明为fiana和abstract,并且用了JDK1.2之后的编译器进行编译,因此它的ACC_PUBLIC、ACC_SUPER标志应当为真,而上图中的其他8个标志为假,所以它的access_flags的值应该为:0x0001|0x0020=0x0021。

在大括号中分别描述了除了private之外的3中访问控制符对应的字段,就是flags对应的。话说为啥要用flags呢,不是一个字段只有一种访问控制符么?

这里只是趁着熟悉访问控制符偷看了一下字节码,不过感觉不深入。

原文地址:https://www.cnblogs.com/tuhooo/p/9048761.html

时间: 2024-10-09 05:51:27

java中的访问控制符的相关文章

深入理解Java中的访问控制符

核心内容: 1.Java中包的相关概念 2.Java中访问控制符的具体用法(详解) 1.简述Java中包的概念 Java中的包类似于操作系统中的文件夹,将具有类似功能的类或者相同的类放在相同的包里面,便于组织与管理. 如:若一个类专门用于数据传输,将这个类放在IO包里面. 2.简述调用某个包中的类的三种方式 1>使用一个类的全名:即包名+类名 注意:在包中,所有类的真正的名字将是包名+类名的组合,所以在运行的时候要将包层给写上,不能直接写类名. 2>使用import语句导入一个包中的所有的类

java基础之访问控制符

访问控制符包括两类:类访问控制符和类成员访问控制符 1.类访问控制符 java中类的访问控制符只有一个:public,如果没有public说明,它就只具有包访问性. 2.类成员访问控制符,总结为一句话:属性的访问权限不能大于包的前提下,protected修饰的属性其所有子类都能访问.   公共类 默认类 类成员访问控制符 public protected 默认 private public protected 默认 private 可见性 A B+C B D B B B D

(转) java中的访问修饰符

对Java中的修饰符一直记不住,现在结合网上的一些资料进行总结,并重点说明一下protected修饰符. 一. Java中的访问修饰符 Java面向对象的基本思想之一是封装细节并且公开接口.Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节.访问控制分为四种级别: (1)public: 用public修饰的类.类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问: (2)protected: 用protected修饰的类.类属变量及

浅析Java中的访问权限控制

浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理? 场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1.fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理? 此时,访问权限控制便可以

Java中的访问修饰符详细解析

1.类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1 )公共类修饰符 public : Java 语言中类的可访问控制符只有一个: public 即公共的.每个 Java 程序的主类都必须是 public 类作为公共工具供其它类和程序使用的应定义为 public 类. 2 )抽象类修饰符 abstract :凡是用 abstract 修饰符修饰的类,被称为抽象类.所谓抽象类

Java中的访问权限解析

在Java中不同的对象和类拥有不同的访问权限,所以在java中对不同的类和对象进行权限的设置显得尤为重要. java中的权限主要分为四种,public,protect,private,和default在声明类和对象的时候如果没有注明权限则为默认的即(default).下面将对这四种权限仅向简单的解析,部分为网上博主的总结再加上个人总结 1.权限解析Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符.private:

Java学习资料-访问控制符

访问控制符 Java权限修饰符public.protected.private是用来限制其它对象对该类对象访问权限,其对应的限制总结如下: 修饰符     类内部     同一个包     子类     任何地方 private     √ default     √          √ protected √          √                 √ public       √          √                 √         √ 对于class的权

Java中创建访问HTTPS的自签名证书的方法

一.问题: 常常在用java访问https的请求时,总是出现SSL禁止的异常.这里给大家教下怎么创建与添加证书. 二.工具 : 1.创建一个目录 2.去Github上搜索InstallCert,然后随便下载一下来.比如:https://github.com/escline/InstallCert 把java文件下载到刚创建的这个目录中. 三.代码: 比如我要添加访问azure的几个管理的域名的https.. 就这样: 1.新建一个cert.bat文件. 2.bat中的内容如下: javac -d

JAVA中的访问修饰符和包

一.JAVA访问修饰符 访问修饰符,用来控制类中成员的可见性 有四个访问修饰符,分别是:default,private,public,protected 1.default(默认):默认时不需要写修饰符的.只能在同一包内访问. 2.private(私有):只能在同一类中访问. 3.public(公有):在任何地方都可以访问 4.protected(受保护的):类的继承中使用 二.包package 在大型项目中,往往会有几十甚至几百个类,如果不对类进行分类管理,后期进行维护时会有很大的不便. 所以