Java中各类修饰符的使⽤总结(看完这篇就够了)
引⾔:Java的修饰符根据修饰的对象不同,分为类修饰符、⽅法修饰符、变量修饰符,其中每种修饰符⼜分为访问控制修饰符和⾮访问控制修饰符。访问控制存在的原因:a、让客户端程序员⽆法触及他们不应该触及的部分  b、允许库设计者可以改变类内部的⼯作⽅式⽽不⽤担⼼影响到客户端程序员。
⽬录
⼀、类修饰符
1.访问修饰符:公共类修饰符public
公共类修饰符 public : Java 语⾔中类的访问控制符只有 public 即公共的。每个 Java 程序的有且只有⼀个类是 public,它被称为主类,其他外部类⽆访问控制修饰符,具有包访问性。注意:⼀个类的内部类可以被其他访问控制修饰符protected、缺省默认(default、friendly)、private修饰,相当于类的成员。
注意:Java类或属性如果缺省访问控制修饰符,就属于default/friendly类型修饰符,但是实际上Java中并没有名为default或者friendly 的访问修饰符(即不能使⽤default或者friendly定义类或变量),只是为了⽅便标识缺省访问控制符的情况。
2.⾮访问控制符:抽象类修饰符 abstract 、最终类修饰符 final
(1)抽象类修饰符 abstract :⽤ abstract 修饰符修饰的类,被称为抽象类。
(2)最终类修饰符 final :当⼀个类不能被继承时可⽤修饰符 final修饰为最终类。被定义为 final 的类通常是⼀些有固定作⽤、⽤来完成某种标准功能的类。
(3)类缺省访问控制符:如果⼀个类没有访问控制符,说明它具有缺省的访问控制符特性。此时,这个类只能被同⼀个包中的类访问或引⽤。这⼀访问特性⼜称为包访问性。
⼆、⽅法修饰符
1.访问控制修饰符
公共访问控制符public、保护访问控制符protected、缺省默认访问控制符、私有访问控制符private
2.⾮访问控制修饰符
抽象⽅法控制符abstract 、静态⽅法控制符static 、最终⽅法控制符final 、本地⽅法控制符native 、同步⽅法控制符synchronized
(1)抽象⽅法控制符 abstract : abstract 修饰的⽅法称为抽象⽅法。抽象⽅法仅有⽅法头,没有⽅法体和具体实现。
(2)静态⽅法控制符 static :⽤修饰符 static 修饰的⽅法称为静态⽅法。静态⽅法是属于整个类的类⽅法;⽽不使⽤static 修饰、限定的⽅法是属于某个具体类对象的⽅法。 由于 static⽅法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,⽽只能处理属于整个类的成员变量,即 static ⽅法只能处理 static的域。
(3)最终⽅法控制符 final :⽤修饰符 final修饰的⽅法称为最终⽅法。最终⽅法是功能和内部语句不能更改的⽅法,即最终⽅法不能重写覆盖。final固定了⽅法所具有的功能和操作,防⽌当前类的⼦类对⽗类关键⽅法的错误定义,保证了程序的安全性和正确性。所有被private 修饰符限定为私有的⽅法,以及所有包含在 final 类 ( 最终类) 中的⽅法,都被认为是最终⽅法。
(4)本地⽅法控制符 native :⽤修饰符 native 修饰的⽅法称为本地⽅法。为了提⾼程序的运⾏速度,需要⽤其它的⾼级语⾔书写程序的⽅法体,那么该⽅法可定义为本地⽅法⽤修饰符 native 来修饰。
(5)同步⽅法控制符 synchronized :该修饰符主要⽤于多线程程序中的协调和同步。
关于关键字synchronized更多细节请参考本⼈另两篇⽂章:
Java同步锁synchronized的最全总结:
Java中synchronized关键字的实现原理:
三、变量修饰符
1.访问控制符
公共访问控制符public 、保护访问控制符protected 、缺省默认访问控制符、私有访问控制符private。
(1)公共访问控制符 public:⽤ public 修饰的域称为公共域。由于 public 修饰符会降低运⾏的安全性和数据的封装性,所以⼀般应减少public 域的使⽤。
(2)私有访问控制符 private:private 修饰的成员变量只能被该类⾃⾝所访问,不能被其它任何类 ( 包括⼦类 ) 访问。
static修饰的变量(3)保护访问控制符 protected:⽤ protected 修饰的成员变量可以被三种类所引⽤:①该类⾃⾝;②同⼀个包中的其它类;③其它包中的⼦类。使⽤修饰符 protected 的主要作⽤是允许其它包中的⼦类来访问⽗类的特定属性。
(4)缺省默认修饰符 :没有访问控制符或者是⽤default修饰的成员变量可以被该类本⾝或同⼀包中的其他类访问。
2.⾮访问控制符
静态域修饰符static 、最终域修饰符 final 、易失 ( 共享 ) 域修饰符volatile 、暂时性域修饰符transient。
(1)静态域修饰符 static :⽤ static修饰的成员变量仅属于类的变量,⽽不属于任何⼀个具体的对象,静态成员变量的值是保存在类的内存区域的公共存储单元,⽽不是保存在某⼀个对象的内存区间。该类的任⼀对象访问它时取到的都是相同的数据;该类的任⼀对象修改它时, 也都是对同⼀个内存单元进⾏操作。
(2)最终域修饰符 final :最终域修饰符 final 是⽤来定义常量的。⼀个类的域 ( 成员变量 ) 如果被修饰符 final 说明,则它的取值在程序的整个执⾏过程中都是不变的。
(3)易失 ( 共享 ) 域修饰符 volatile :易失 ( 共享 ) 域修饰符 volatile是⽤来说明这个成员变量可能被⼏个线程所控制和修改。也就是说在程序运⾏过程中,这个成员变量有可能被其它的程序影响或改变它的取值。通常 volatile ⽤来修饰接受外部输⼊的域。
(4)暂时性域修饰符 transient :暂时性域修饰符 transient ⽤来定义⼀个暂时性变量。其特点是:⽤修饰符transient 限定的暂时性变量,将指定 Java虚拟机认定该暂时性变量不属于永久状态,以实现不
同对象的存档功能。否则,类中所有变量都是对象的永久状态的⼀部分,存储对象时必须同时保存这些变量。
四、访问控制修饰符总结
访问级别访问控制修饰符同类同包⼦类(不同包)不同包(其他类)
公共public允许允许允许允许
受保护protected允许允许允许不允许
默认缺省修饰符允许允许不允许不允许
私有private允许不允许不允许不允许
注意:protected修饰的属性或⽅法,允许不同包的⼦类中访问。注意这⾥的访问⽅式是通过继承访问⽗类中的protected属性或⽅法,⽽不是直接通过⽗类实例访问protected属性或⽅法
public class Animal{
protected String name;
public int age;
}
//不同包的⼦类
public class Cat extends Animal{
public void print(){
/*********通过⽗类直接访问*********/
Animal a = new Animal();
System.out.println(a.name);      //不允许        System.out.println(a.age);        //允许
/*********通过继承访问*********/
System.out.println(this.name);    //允许        System.out.println(this.age);  //允许
}
}