目录
一、访问修饰符
二、非访问修饰符
二、非访问修饰符
Java的修饰符分为两大类:访问修饰符、非访问修饰符
一、访问修饰符
1、default:默认访问权限;只对同一个包可见(同包、同类);
2、private:私有访问;只对同一个类可见(同类);
3、public:共有访问;对所有的类可见(同包、同类、子类、其他包);
4、protected:保护性访问;对同一个包可见(同包、同类、子类);
二、非访问修饰符
1、static:创建类方法和类变量;
a.static 成员变量
- static成员变量 = static + 成员变量,static成员变量也称为静态变量
- 静态变量可通过“类名.静态成员变量” 或者 “对象名.静态变量名”
// 静态成员变量
static String name;
static float height;
b.static 成员方法
- static成员方法 = static + 成员方法,static成员方法也称为静态方法
- 静态成员方法不能使用this、super关键字
- 静态方法不能调用非静态方法,不能引用非静态变量
// 静态成员方法
public static float getHeight(){
return Student.height;
}
c.static 代码块
- static代码块又称为静态代码块,或静态初始化器。
- static 代码块不需要程序主动调用,在JVM加载类时系统会执行 static 代码块,因此在static 代码块中可以做一些类成员变量的初始化工作。
- 如果一个类中有多个 static 代码块,JVM将会按顺序依次执行。需要注意的是,所有的static 代码块只能在JVM加载类时被执行一次。
// static代码块
static {
Student.name = "Jack";
Student.height = 181;
System.out.println("static1");
}
d.static 内部类
- static内部类 = static + 内部类,称为静态内部类
- 静态成员内部类不依赖外部类实例而被实例化
- 静态内部类不能访问其外部类的实例成员(包括普通的成员变量和方法),只能访问外部类的类成员(包括静态成员变量和静态方法)
// 静态成员方法
static class Day2{
public Day2(){
System.out.println("Day2!");
}
}
代码实例
package Java_learning;
public class Student {
// 静态成员变量
static String name;
static float height;
// 静态成员方法
public static float getHeight(){
return Student.height;
}
// static代码块
static {
Student.name = "Jack";
Student.height = 181;
System.out.println("static1");
}
static {
System.out.println("static2");
}
// 静态成员方法
static class Day2{
public Day2(){
System.out.println("Day2!");
}
}
public static void main(String[] args){
Student s = new Student();
System.out.println(s.getHeight());
Day2 b = new Day2();
System.out.println(Student.name);
}
}
输出结果
注意:首先输出的是"static1"和"static2",说明static 代码块不需要程序主动调用,在JVM加载类时系统会执行 static 代码块,并且JVM将会按顺序依次执行。
2、final:修饰类、方法和变量;final类不可被继承;final修饰的方法不可被继承类重新定义;final修饰的变量为常量,不可修改。
a.final修饰局部变量
- final修饰的局部变量,初始化后不能再修改。
- 若final修饰的是基本数据类型,则该变量的值不可修改;
- 若final修饰的是引用数据类型,则该变量可修改值,但地址不可修改。
代码实例1
// 未经过final修饰的局部变量
int a = 1;
System.out.println("a:" + a);
a = 2;
System.out.println("修改后的a:" + a);
输出结果1
代码实例2
// final修饰局部变量
final int b = 10;
System.out.println("b:" + b);
b = 2;
输出结果2
ps:未经过final修饰的成员变量a是可以进行修改的,而经过final修饰的变量b是不可以进行修改的。
代码实例3
public class Student {
private String name;
public Student(){
}
public Student(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public static void main(String[] args){
Student person1 = new Student("Jack");
System.out.println(person1); // 地址
System.out.println("person1's name:" + person1.getName());
person1 = new Student("Marry");
System.out.println(person1); // 地址
System.out.println("person1's name:" + person1.getName());
}
}
输出结果3
ps:两次的地址不同。
代码实例4
final Student person2 = new Student("Tom");
System.out.println(person2); // 地址
System.out.println("person2's name:" + person2.getName());
// person2 = new Student("Jerry"); // 会报错!
person2.setName("Jerry");
System.out.println(person2); // 地址
System.out.println("person2's name:" + person2.getName());
输出结果4
ps:对于引用数据类型来说,变量中的地址不可修改,但是数据值可以修改。
b.final修饰成员变量
- final修饰的成员变量,值也不可被修改;
- final修饰的成员变量必须手动赋值,无默认值;
--直接赋值
private final String name = "Jack";
--构造方法中赋值
private final String name;
public Student(){
this.name = "Jack";
}
c.final修饰方法
- final修饰的方法,不可被重写。
d.final修饰类
- final修饰类,表示最终类,不能被继承,不能成为父类。
3、abstract:创建抽象类和抽象方法。
a.abstract修饰类
- abstract修饰的类称为抽象类;
- 抽象类不可被实例化,也就是不可创建对象;
- 抽象类必须有构造器;
- 抽象类一般位于体系结构的上层,定义功能。
- 若一个类继承了抽象类,那么该类智能重写抽象类中的所有抽象方法,或该类抽象化;
b.abstract修饰方法
- abstract修饰的方法称为抽象方法;
- 抽象方法的类一定是一个抽象类;
abstract不可修饰属性、方法;
abstract不可修饰:私有方法(final修饰的方法)、静态方法(static修饰的方法)
4、synchronized:用于多线程的同步。
5、volatile:修饰的变量被线程访问时,会强制从共享内存中重新读取;若修饰的成员变量发生变化时,会强制线程将变化值回写到共享内存。



