Java:修饰符小记

对 Java 中的 修饰符,做一个微不足道的小小小小记

Java 语言提供了很多修饰符,大概分为两类:

  1. 访问权限修饰符

  2. 非访问权限修饰符

访问权限修饰符

修饰符 说明
public 共有访问。对所有的类都可见
protected 保护型访问。对同一个包可见,对不同的包的子类可见
default 默认访问权限。只对同一个包可见,注意:对不同的包的子类不可见
private 私有访问。只对同一个类可见,其余都不见

非访问权限修饰符

修饰符 说明
static 用来创建类方法和类变量
final 用来修饰类、方法和变量,
final 修饰的类不能够被继承,
final 修饰的方法不能被继承类重新定义,
final 修饰的变量为常量,是不可修改的
abstract 用来创建抽象类和抽象方法
synchronized 用于多线程的同步
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。
而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。
这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值
transient 序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量

外部类修饰符

外部类修饰符 说明
public(访问控制符) 将一个类声明为公共类,它可以被任何对象访问,一个程序的主类必须是公共类
default(访问控制符) 类只对包内可见,包外不可见
abstract(非访问控制符) 将一个类声明为抽象类,抽象类不能用来实例化对象,
声明抽象类的唯一目的是为了将来对该类进行扩充,
抽象类可以包含抽象方法和非抽象方法
final(非访问控制符) 将一个类生命为最终(即非继承类),表示它不能被其他类继承

注意

  1. protected 和 private 不能修饰外部类,是因为外部类放在包中,只有两种可能,包可见和包不可见。
  2. final 和 abstract 不能同时修饰外部类,因为该类要么能被继承要么不能被继承,二者只能选其一。
  3. 不能用 static 修饰类,因为类加载后才会加载静态成员变量。所以不能用 static 修饰类和接口,因为类还没加载,无法使用 static 关键字。

内部类修饰符

内部类与成员变量地位一致,所以可以 public、protected、default 和 private;

同时还可以用 static 修饰,表示嵌套静态内部类,不用实例化外部类,即可调用。

方法修饰符

方法修饰符 说明
public(公共控制符) 包外包内都可以调用该方法
protected(保护访问控制符) 指定该方法可以被它的类和子类进行访问
具体细节可参考
default(默认权限) 指定该方法只对同包可见,对不同包(含不同包的子类)不可见
private(私有控制符) 指定此方法只能有自己类等方法访问,其他的类不能访问(包括子类),非常严格的控制
final 指定方法已完备,不能再进行继承扩充
static 指定不需要实例化就可以激活的一个方法,即在内存中只有一份,通过类名即可调用
synchronize 同步修饰符,在多个线程中,该修饰符用于在运行前,对它所属的方法加锁,以防止其他线程的访问,运行结束后解锁
native 本地修饰符。指定此方法的方法体是用其他语言在程序外部编写的
abstract 抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。
抽象方法不能被声明成 final 和 static。
任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。
抽象类可以不包含抽象方法。
抽象方法的声明以分号结尾,例如:public abstract sample();

成员变量修饰符

成员变量修饰符 说明
public(公共访问控制符) 指定该变量为公共的,它可以被任何对象的方法访问
protected(保护访问控制符) 指定该变量可以别被自己的类和子类访问。在子类中可以覆盖此变量
default(默认权限) 指定该变量只对同包可见,对不同包(含不同包的子类)不可见
private(私有访问控制符) 指定该变量只允许自己的类的方法访问,其他任何类(包括子类)中的方法均不能访问
final 最终修饰符,指定此变量的值不能变
static(静态修饰符) 指定变量被所有对象共享,即所有实例都可以使用该变量。变量属于这个类
transient(过度修饰符) 指定该变量是系统保留,暂无特别作用的临时性变量。不持久化
volatile(易失修饰符) 指定该变量可以同时被几个线程控制和修改,保证两个不同的线程总是看到某个成员变量的同一个值
final+static 一起使用来创建常量

局部变量修饰符

only final is permitted:只有final是被允许的。

  1. 为什么不能赋予权限修饰符?

    因为局部变量的生命周期为一个方法的调用期间,所以没必要为其设置权限访问字段,既然你都能访问到这个方法,所以就没必要再为其方法内变量赋予访问权限,因为该变量在方法调用期间已经被加载进了虚拟机栈,换句话说就是肯定能被当前线程访问到,所以设置没意义。

  2. 为什么不能用 static 修饰

    我们都知道静态变量在方法之前先加载的,所以如果在方法内设置静态变量,可想而知,方法都没加载,你能加载成功方法内的静态变量?

接口

接口修饰符

  1. 接口修饰符只能用 public、default 和 abstract。
  2. 不能用 final、static 修饰。
  3. 接口默认修饰为 abstract。

接口中方法修饰符

  1. only public & abstract are permitted:意思只能用 public abstract 修饰,当然如果你什么都不写,默认就是public abstract。
  2. 注意:在Java1.8之后,接口允许定义static 静态方法了!所以也可以用static来修饰!

进一步说明:Java:抽象类和接口小记

参考:

https://www.nowcoder.com/test/question/done?tid=38386652&qid=56132#summary

Java:修饰符小记的更多相关文章

  1. JAVA修饰符类型(public,protected,private,friendly)

    转自:http://www.cnblogs.com/webapplee/p/3771708.html JAVA修饰符类型(public,protected,private,friendly) publ ...

  2. Java修饰符关键词大全

    所以我以此主题写了这篇文章.这也是一个可用于测试你的计算机科学知识的面试问题. Java修饰符是你添加到变量.类和方法以改变其含义的关键词.它们可分为两组: 访问控制修饰符 非访问修饰符 让我们先来看 ...

  3. JAVA修饰符类型(转帖)

    JAVA修饰符类型(public,protected,private,friendly) public的类.类属变量及方法,包内及包外的任何类均可以访问:protected的类.类属变量及方法,包内的 ...

  4. java修饰符public final static abstract transient

    JAVA 修饰符public final static abstract transient  关键字: public final static abstract ...  1.public prot ...

  5. Java基础之Java 修饰符

    前言:Java内功心法之Java 修饰符,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) Java语言提供了很多修饰符,主要分为以下两类: 访 ...

  6. 浅析java修饰符之public default protected private static final abstract

    浅析java修饰符之public default protected private static final abstract 一   修饰符的作用:用来定义类.方法或者变量,通常放在语句的最前端 ...

  7. 【java初探外篇01】——关于Java修饰符

    本文记录在学习Java语言过程中,对碰到的修饰符的一些疑问,在这里具体的拿出来详细学习和记录一下,以作后续参考和学习. Java修饰符 Java语言提供了很多修饰符,但主要分两类: 访问修饰符 非访问 ...

  8. Java知识回顾 (2) Java 修饰符

    一.Java 修饰符 1.1 访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default (即缺省,什么也不写): 在 ...

  9. Java-Runoob:Java 修饰符

    ylbtech-Java-Runoob:Java 修饰符 1.返回顶部 1. Java 修饰符 Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变 ...

随机推荐

  1. client-go实战之五:DiscoveryClient

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. 「山东省队集训2021 Round 1」 半夜

    考虑将 \(X\) 复制一次放到后面再对其长度为 \(n\) 的连续子串和 \(Y\) 求一波 \(\rm{Longest\ Common\ Subsequence}\) 就能得到 \(\Theta( ...

  3. NOIP模拟13「工业题·卡常题·玄学题」

    T1:工业题 基本思路   这题有一个重要的小转化: 我们将原来的函数看作一个矩阵,\(f(i,j-1)*a\)相当于从\(j-1\)向右走一步并贡献a,\(f(i-1,j)*b\)相当于从\(i-1 ...

  4. Weblogic Coherence组件漏洞初探CVE-2020-2555

    Weblogic Coherence组件漏洞初探CVE-2020-2555 2020年1月,互联网上爆出了weblogic反序列化远程命令执行漏洞(CVE-2020-2555),Oracle Fusi ...

  5. [Linux系列]DNS系列理论笔记与DNS服务器配置

    0x01 基础术语 DNS(Domain Name System,域名系统),域名和IP地址相互映射的一个分布式数据库,简而言之就是通过更易记忆的域名代替IP去访问一个网站. FQDN(Fully Q ...

  6. 【Nginx】Linux常用命令------启动、停止、重启

    启动 启动代码格式:nginx安装目录地址 -c nginx配置文件地址 例如: [root@LinuxServer sbin]# /usr/local/nginx/sbin/nginx -c /us ...

  7. nodejs安装 Later version of Node.js is already installed. Setup will now exit 及 node与npm版本不符

    暴力删除nodejs导致无法重新安装  Later version of Node.js is already installed. Setup will now exit 1.电脑全局搜索nodej ...

  8. String底层使用是char数组还是byte数组

    结论:jdk1.8及以前String底层使用是char[],1.9开始使用byte[] jdk1.8 jdk13

  9. jquery .play()报错is not a function

    报错原因:play()方法属于DOM对象方法,$('#audio')为jquery对象解决办法:将jquery对象转换为DOM对象首先打印jquery对象$('#audio') 两种转换方式将一个jQ ...

  10. Docker系列(22)- DockerFile指令说明并构建自己的centos

    DockerFile常用指令 实战测试 DockerHub中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建 #创建一个自己的centos # 1.编写D ...