5_JavaSE_修饰符

Posted Jack·Kwok

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5_JavaSE_修饰符相关的知识,希望对你有一定的参考价值。

1. 修饰符的分类

在 Java 的关键字中,有一大部分关键字是用来“修饰”的,这类关键字叫做修饰符。修饰符分为访问修饰符非访问修饰符

2. 访问修饰符

访问修饰符主要是用来修饰类、变量和方法,从而控制它们能被访问的范围的关键字。主要分为四个:defaultprivatepublicprotected

private :私有。修饰变量、方法表示其只在这个类中可见。不能修饰类、接口。
protected:受保护。修饰变量、方法表示对同一个包内的子类可见。不能修饰类、接口。
default:(等于不写)默认。修饰类、接口、变量、方法表示在同一个包内可见
public:公开。修饰类、接口、变量、方法表示对所有类可见。

值得注意的是:

接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public 。其实很好理解,接口就是需要被继承然后实现接口的方法,那如果接口的方法还是为 protected 、private,那其它类访问都会受限,显然是不符合逻辑的,因此 protected 、private 是不能声明接口和接口的成员变量和成员方法的。

被private修饰的变量只能在这个类中被访问,其它类只能通过get/set方法访问,这样的好处是可以隐藏类的实现细节。

3. 非访问修饰符

static 修饰符
前面我们已经有开始涉及到这个修饰符了。可以用来修饰变量方法,表示该变量\\方法属于类本身,只有一份,不属于任何某个对象实例。

修饰变量时(不能修饰局部变量):表示类变量,不管创建多少实例,都只有一份拷贝。
修饰方法时:表示类方法,不管创建多少实例,都只有一份拷贝,且静态方法不能使用类的非静态变量。,这里也很好理解。比如说我没有创建任何实例,然后通过类名去访问静态方法,这时候静态方法内部如果能调用非静态成员变量,那么这个变量到底属于哪个实例呢?是不是就矛盾了!因此,这是不可行的。

通过 类名.变量名类名.方法名()来访问

final 修饰符
同样用于修饰变量、方法和类
修饰变量时:表示“最后的”。因此,被修饰的变量必须制定初始值,并且赋值后不能修改。(表示最后那当然不能被修改呀,不能被修改那定义时就得加上初始值,不然它都没有初始值)
修饰方法时:可以被子类继承,但不能被子类重写。
修饰类时:不能被继承

abstract 修饰符
用来修饰类和方法,表示抽象的意思。
修饰类时:不能用来实例化对象,只能被其它类实现后进行扩展。
修饰方法时:该方法不用写内容,只能被子类实现。

注意:
1、一个类或方法不能同时被finalabstract修饰。(很好理解,如果一个类既表示不能被继承又表示需要被继承,那不就自相矛盾了吗?方法同理。)
2、如果一个类包含抽象方法,那么这个类必须声明为抽象类;抽象类可以包含抽象方法和非抽象方法。
3、继承抽象类的子类必须实现父类的所有抽象方法,除非子类也是抽象类
4、抽象方法声明格式:如:public abstract apple();以分号结尾。

synchronized 修饰符
修饰方法时:该方法同一时间只能被一个线程访问。

volatile 修饰符
修饰成员变量时:每次被一个线程访问时,都会从共享内存中重新读取该变量的值;并且成员变量发生变化时,会将变化值写入共享内存。从而保证不同线程看到的成员变量的值是一致的。(读取时强制读取共享变量的值,写入时强制写入到共享变量的值)

transient 修饰符
当我们将类定义为序列化类时,在变量前加上 transient 关键字后,序列化对象时,该变量不会被序列化。

4. 总结

修饰符的应用还需要不断的实践才能熟练,这就需要大量写代码才能熟能生巧了。下节我们讲运算符。

以上是关于5_JavaSE_修饰符的主要内容,如果未能解决你的问题,请参考以下文章

成员修饰符知识点

Java_修饰符详解

05_Java基础语法_第5天(方法)_讲义

2016 2 - 23 arc中的所有权修饰符(_strong修饰符与_weak修饰符)

__block修饰符(四)

JavaSE入门学习10:Java修饰符