一、常见修饰符
java的修饰符最常见的有public、protected、default、private四个,分别代表不同的访问权限。一张表告诉你他们权限各自是多大。
本类 | 本包 | 子类 | 外部包 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
Java中无非是类、方法、属性需要修饰符来限定访问权限,再来一张图说明
可访问控制符 | 非访问控制符 | ||||||||
---|---|---|---|---|---|---|---|---|---|
类 | public | × | × | × | abstract | final | × | × | × |
属性 | public | private | × | private protected | × | final | static | volatile | transient |
方法 | public | private | protected | private protected | abstract | final | static | native | synchronized |
二、其它修饰符
除了上面的四个外,我们看到第二张表格里还有abstract、final、static等一些其它的修饰符,这里简单说一下。
abstract:抽象修饰符
修饰类 | 为抽象类 抽象类不能被实例化 抽象类中可有属性、方法,都是用来给子类继承的 抽象类中可以有非抽象方法 抽象类可以继承抽象类 |
修饰方法 | 为抽象方法 仅有方法头,没有方法体和操作实现(由子类实现) 必须出现在抽象类中 抽象子类必须抽象父类中的所有抽象方法 |
final:最终修饰符 final关键字表示不可变的
“不可变”的意思是变量的引用(指向的地址)不可变,但是引用的内容是可变的!通俗的说就是,例如你定义一个final变量,指向某一块内存(地址),它将不能再指向其他内存(地址),但是它指向的这片内存(地址)中的内容是可以被改变的,改变之后,该final变量仍旧是指向这篇内存(地址)。这种说法主要针对对象而言,例如final指向一个对象,则会一直指向这个地址的对象,不能换其他地址对象,但是这个对象的属性,例如age=4,改为age=5是完全可以的。只要final变量依旧指向这个对象就可以了。
修饰类 | 为final类 不能被继承,如String、Integer等包装类 final不能修饰接口和抽象类 final不能修饰构造器 |
修饰方法 | 为final方法 比非final方法运行更快 不能被子类方法重写 |
修饰变量 | 为final变量 修饰基本数据类型时,必须赋初值且不能被改变 修饰引用变量时,该引用变量不能再指向其他对象(主要为对 对象和数组) |
static 静态修饰符
static用来修饰成员变量、方法和内部类。static修饰的内容隶属于类,不属于类的实例(对象)。
所以static修饰的成员变量又叫作类变量,static修饰的方法又叫做类方法。他们随着类的加载而加载,优先于对象的存在,在我们new对象之前,他们已经和类一同存在了。
所以:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问
对于static修饰的方法来说:
对静态方法来说,没有this关键字一说,因为静态方法不依附于任何对象,所以也就谈不上this了。故此静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中可以访问静态成员方法/变量。因为非静态成员方法和非静态成员变量都是通过具体对象才能调用的。
对于static修饰的变量来说:
static变量、静态变量、类变量,其实都还是一个东西。静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
所以在java中,static是不能修饰局部变量的。因为他是类变量。
static成员变量的初始化顺序按照定义的顺序进行初始化。
static修饰代码块:
static修饰代码块形成静态代码块可以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。所以可以把每次创建对象都调用的操作放在static块中,避免每次创建对象新开辟内存带来的消耗。
以上!