5_JavaSE_修饰符
Posted Jack·Kwok
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5_JavaSE_修饰符相关的知识,希望对你有一定的参考价值。
1. 修饰符的分类
在 Java 的关键字中,有一大部分关键字是用来“修饰”的,这类关键字叫做修饰符。修饰符分为访问修饰符和非访问修饰符
2. 访问修饰符
访问修饰符主要是用来修饰类、变量和方法,从而控制它们能被访问的范围的关键字。主要分为四个:default
、private
、public
、protected
。
private
:私有。修饰变量、方法表示其只在这个类中可见。不能修饰类、接口。
protected
:受保护。修饰变量、方法表示对同一个包内的子类可见。不能修饰类、接口。
default
:(等于不写)默认。修饰类、接口、变量、方法表示在同一个包内可见
public
:公开。修饰类、接口、变量、方法表示对所有类可见。
值得注意的是:
接口里的变量都隐式声明为 public static final
,而接口里的方法默认情况下访问权限为 public
。其实很好理解,接口就是需要被继承然后实现接口的方法,那如果接口的方法还是为 protected 、private,那其它类访问都会受限,显然是不符合逻辑的,因此 protected 、private 是不能声明接口和接口的成员变量和成员方法的。
被private修饰的变量只能在这个类中被访问,其它类只能通过get/set
方法访问,这样的好处是可以隐藏类的实现细节。
3. 非访问修饰符
static
修饰符
前面我们已经有开始涉及到这个修饰符了。可以用来修饰变量和方法,表示该变量\\方法属于类本身,只有一份,不属于任何某个对象实例。
修饰变量时(不能修饰局部变量):表示类变量,不管创建多少实例,都只有一份拷贝。
修饰方法时:表示类方法,不管创建多少实例,都只有一份拷贝,且静态方法不能使用类的非静态变量。,这里也很好理解。比如说我没有创建任何实例,然后通过类名去访问静态方法,这时候静态方法内部如果能调用非静态成员变量,那么这个变量到底属于哪个实例呢?是不是就矛盾了!因此,这是不可行的。
通过 类名.变量名
和类名.方法名()
来访问
final
修饰符
同样用于修饰变量、方法和类
修饰变量时:表示“最后的”。因此,被修饰的变量必须制定初始值,并且赋值后不能修改。(表示最后那当然不能被修改呀,不能被修改那定义时就得加上初始值,不然它都没有初始值)
修饰方法时:可以被子类继承,但不能被子类重写。
修饰类时:不能被继承
abstract
修饰符
用来修饰类和方法,表示抽象的意思。
修饰类时:不能用来实例化对象,只能被其它类实现后进行扩展。
修饰方法时:该方法不用写内容,只能被子类实现。
注意:
1、一个类或方法不能同时被final
和abstract
修饰。(很好理解,如果一个类既表示不能被继承又表示需要被继承,那不就自相矛盾了吗?方法同理。)
2、如果一个类包含抽象方法,那么这个类必须声明为抽象类;抽象类可以包含抽象方法和非抽象方法。
3、继承抽象类的子类必须实现父类的所有抽象方法,除非子类也是抽象类
4、抽象方法声明格式:如:public abstract apple();
以分号结尾。
synchronized
修饰符
修饰方法时:该方法同一时间只能被一个线程访问。
volatile
修饰符
修饰成员变量时:每次被一个线程访问时,都会从共享内存中重新读取该变量的值;并且成员变量发生变化时,会将变化值写入共享内存。从而保证不同线程看到的成员变量的值是一致的。(读取时强制读取共享变量的值,写入时强制写入到共享变量的值)
transient
修饰符
当我们将类定义为序列化类时,在变量前加上 transient 关键字后,序列化对象时,该变量不会被序列化。
4. 总结
修饰符的应用还需要不断的实践才能熟练,这就需要大量写代码才能熟能生巧了。下节我们讲运算符。
以上是关于5_JavaSE_修饰符的主要内容,如果未能解决你的问题,请参考以下文章