修饰符是用于限定类型以及类型成员申明的一种符号,可用于修饰类、变量和方法,分为访问修饰符和非访问修饰符。访问修饰符控制访问权限,不同的访问修饰符有不同的权限范围,而非访问修饰符则是提供一些特有功能。  

访问权限修饰符

访问修饰符有四个,权限从大到小:public、protected、default、private ,访问范围如下:

  • public            本类、同包、子类和全局(只要导入包就能访问)
  • protected      本类、同包和子类
  • default          本类、同包(当类、方法和变量不添加权限修饰符时,默认使用)
  • private          本类(类的内部)
package com.A;
public class Demo01 {
public String a = "公共的";
protected String b = "受保护的";
String c = "默认的";
private String d = "私有的"; //在类的内部可以随意访问数据域
public void test() {
System.out.println(a + b + c + d);
}
}

继承Demo01类, 父类中private修饰的d属性无法被继承。

package com.A;
public class Son extends Demo01 {
//访问继承自父类的数据域
public static void main(String[] args) {
System.out.println(new Son().a);
System.out.println(new Son().b);
System.out.println(new Son().c);
}
}

不同包的子类,默认权限c属性和私有属性d无法继承。

package com.B;
import com.A.Demo01;
public class Son_b extends Demo01{
//子类方法中打印从父类Dmeo01中继承来的数据域
public void test() {
System.out.println(new Son_b().a);
System.out.println(new Son_b().b);
}
}

通过以上的代码实例即可看出不同的访问修饰符所能控制的范围是不同的。

非访问修饰符

非访问修饰符有很多,最经常用到的当属static和final了,除此之外还有许多非访问修饰符会在下面一一介绍。

static

当编写一个类时,本质上就是在描述该事物的属性和行为,但这些只有创建对象时这些数据才会被分配。有的时候我们希望无需创建对象就能获取数据,且数据独一份,被所有对象共享。
static修饰的变量和方法叫做静态变量和静态方法,也叫类变量/方法,属于类本身。所有实例都能调用静态变量和静态方法。反之,实例变量和实例方法绑定于类的某个实例,只能由实例来调用,不对外共享,因为对象是唯一的。
 
static注意点:
  • 调用静态变量和静态方法时,只需要类名.静态变量/静态方法。使用对象也可以调用,但这样做不规范。
  • static能修饰的类只有内部类,也叫作静态内部类,地位等同于外部类的静态变量。
  • static不能修饰局部变量,因为作用域仅限于所处的块,而static本身的功能相违背且不允许。
  • 在静态方法中,例如main()方法,不能使用this和super关键字来访问实例变量和调用方法,若要调用实例变量,则需要实例化一个对象。

final

final可修饰变量、方法和类,一旦被final修饰,该变量就不能改变值或是改变其引用。编译器会检查代码,试图更改时编译器会报错。

final注意点:

  • final修饰的方法不能被重写,final修饰的类也不允许被继承,final修饰的类为不可变类。
  • 修饰变量时,都是当成常量来用,通常和static关键字配合使用,而且常量最好使用全大写。

为什么要和static一起使用呢?通过两种常量来说明一下两者区别

public final int A = 10;         //A为实例常量
public final static int B = 100; //B为静态常量
//实例常量伴随对象的创建而生成,运行完成后即被销毁,频繁创建和销毁非常浪费内存空间。
//而静态常量(全局常量)随着类的初始化就存储在JVM开辟的常量池中,使用之后也不会被回收,直到程序结束。
//所以如果有数字或者字符串被多次反复使用时,可以用final static来修饰。

final修饰的优点

  • final关键字可以提高性能,JVM和Java应用都会缓存final变量。
  • final修饰后,编译时就进行静态绑定,不需要在运行时在动态绑定。
  • final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。 使用final关键字,JVM会对方法、变量及类进行优化。
  • final修饰类则是不可变类。不可变类的实例创建后,该实例的内容无法被改变。String是不可变类的代表。
  • 不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。

abstract

  1. abstract只能修饰类和方法,称为抽象类和抽象方法,定义抽象类的唯一目的就是子类对该类进行扩展重写,抽象方法必须实现。
  2. 一个类不能同时被 abstract 和 final 修饰,因为理念冲突。
  3. 抽象类不能实例化对象,因为抽象方法没有方法体,所以抽象类实例无法调用方法,实例化无意义。
  4. 若类中包含抽象方法,则该类必须声明为抽象类,否则将出现编译错误。
  5. 抽象类中能同时声明抽象方法和普通方法,相当于普通类和接口的中间层,类似半成品。

synchronized

修饰方法作为同步方法,则在同一时间该方法只能被一个线程所访问,别的线程将阻塞。修饰方法可以隐式传入同步监视器对象。作为同步代码块,示例如下:

//需要显式传入同步监视器对象
synchronized(Object obj) {
//需要同步的代码...
}

volatile

        volatile的作用和synchronized一样,都是为了保证线程安全,但如果只是为了保证一两个成员变量的使用安全,使用synchronized开销太大。volatile修饰的成员变量每次被线程访问时,都会强制从共享内存中重新读取该成员变量的值。而且,当成员变量值改变时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量变化的值。
 

transient

运用在对象序列化中,当对某个对象进行序列化(转换成二进制存储在硬盘中),有些私有信息不想被序列化时,就用transient去修饰,transient表示透明化的,作用就如其名,序列化时就会忽略掉该信息。注意:类要实现序列化需要实现Serializable接口,该接口没有任何方法,仅仅作为序列化的标识。

Java常用修饰符总结的更多相关文章

  1. java访问修饰符

    了解面向对象思想的同学们,都知道"封装"这一基本特征,如何正确运用访问修饰符,恰恰能体现出封装的好坏. java访问修饰符有四个: 1)public:访问权限最高,其修饰的类.类变 ...

  2. Java的修饰符

    转自:http://blog.csdn.net/manyizilin/article/details/51926230#L42 修饰符: 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性.主 ...

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

    JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...

  4. Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...

  5. Java类修饰符的使用与作用以及常见问题

    首先明确,类是放在文件里的,在文件里面的不同位置就有不同的作用,就是不同类型的类. 1, 顶级类or外部类:包括两种,一个文件中与文件名同名称的类我们称作顶级类(也是外部类),如果在一个文件中的一个类 ...

  6. C#和JAVA 访问修饰符

    JAVA ----------------------------------------------- 访问修饰符        描述 ------------------------------- ...

  7. 《Java基础知识》Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...

  8. Java static修饰符

    Java static修饰符 static修饰符是静态修饰符,大家写Java第一次接触static就是主函数中的pubic static void main的声明了. 那么static有什么用?本文来 ...

  9. 详解java访问修饰符

    详解java访问修饰符 为了防止初学者看到因为专业的术语而感觉晦涩难懂,我接下来尽量用生动比喻的说法来解释!首先第一点,我们来讲讲什么叫修饰符!看看这个名称,想想他的意思.修饰符!修饰符!,就是用来修 ...

随机推荐

  1. 基于Apache Curator框架的ZooKeeper使用详解

    一 简介 Apache Curator是一个比较完善的ZooKeeper客户端框架,通过封装的一套高级API 简化了ZooKeeper的操作.通过查看官方文档,可以发现Curator主要解决了三类问题 ...

  2. EF Migrations

    Enable-Migrations -EnableAutomaticMigrations dbcontent Add-Migration XXXXX Update-Database -Verbose ...

  3. Python爬虫教程-00-写在前面

    鉴于好多人想学Python爬虫,缺没有简单易学的教程,我将在CSDN和大家分享Python爬虫的学习笔记,不定期更新 基础要求 Python 基础知识 Python 的基础知识,大家可以去菜鸟教程进行 ...

  4. 八、angularjs 中 filter在controller中的使用--避免多次遍历

    filter在html页面的使用司空见惯,比如: filter在controller中使用可以避免多次使用angular.foreach,来进行遍历.例如: 如果使用filter,则会让代码简洁而且明 ...

  5. Non-resolvable parent POM for com.*******

    场景: 同事新打了一个jar包到私服里面,自己删除了本地对应的中央仓库的依赖包,再次重新下载.  于是我又打开了一个idea的窗口重新引入这个项目,然后重新下载依赖的服务. 结果就一直报这个问题... ...

  6. python面向对象编程(1)——基本概念,术语,self,构造器

    1  python面向对象命名规范 类名通常由大写字母打头.这是惯例标准. 数据值应该使用名词作为名字,方法使用动词加对象的方式,若使用混合记法,则方法名的第一个字母首字母小写,后面的单词的首字母大写 ...

  7. Linux 下Shell的学习

    1.Shell学习 1.什么是Shell    shell是一个命令解析器,在操作系统的最外层,负责和用户对话,将用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果.2.什么是shell脚本 ...

  8. 企业办公领域: Windows + Office的组合在未来能抵挡住 Google Apps的冲击么

    从个人角度讲,我基本上不怎么喜欢微软的产品,即便是其无处不见的Windows. Windows 8用了几个月的后,实在无法忍受其某些SB的设计,还是换回Win7.另外自从用上了MacBook 以后, ...

  9. 如何把GitHub中的开源项目导入到Eclipse

    准备: 1.需要注册GitHub的账号,并找到自己想导入的项目 2.在Eclipse的help-->Marketplace中搜索egit插件,然后安装 操作步骤: 1.有三种导入方式HTTP.S ...

  10. Object-C中对“引用(reference)”的理解

    http://blog.csdn.net/csz0102/article/details/25984275 注:以下讨论都是在ARC模式下 我们在iOS开发中最经常碰到的“引用(reference)” ...