Java修饰符分为:1.访问修饰符 2.非访问修饰符
用来修饰类、方法或变量。
1.访问修饰符:
有public、default、protected、private四种
- public:任何其他类可见。
- default:包内可见,包外不可见。接口里的变量都隐式声明为 public static final,而方法默认为public。
- protected:包内可见,包外继承子类可见。 不能修饰类(内部类除外)。接口以及接口的成员变量和方法都不能声明为protrcted。
- private:包内同类可见。
访问控制和继承
- 父类中声明为public的方法,在子类也必须声明为public
- 父类中声明为protected的方法,在子类中只能声明为public或protected, 不能声明为private。
- 父类中声明为private的方法,不能被继承。
2.非访问修饰符
有static、final、abstract、synchronize和volatile 五种。
- static:修饰的变量为静态变量,修饰的方法为静态方法。
静态变量:无论类被实例化多少次,类的静态变量只有一份。局部变量不能声明为静态变量。
静态方法:静态方法不能调用非静态变量。
[注:]明白一点,就是静态的属于整个类所有,非静态的属于具体对象所自有,静态方法不能调用非静态变量,因为jvm加 载类的时候会初始化静态变量和静态方法,而此时没有百对象的存在,所度以此时会有类似于空指针异常的错误 - final:修饰的类不能被继承;修饰的方法不能被继承重写;修饰的变量为常量,不能改变。
- abstract:修饰的类为抽象类,修饰的方法为抽象方法。
抽象类:抽象类不能用来实例化对象,声明抽象类的唯一目的是将来对该类进行扩充;类不能同时被abstract和final修饰; 包含抽象方法的类必须声明为抽象类;抽象类可以包含抽象方法和非抽象方法。
抽象方法:抽象方法没有具体实现功能,具体实现方法由子类完成。 - synchronize:被修饰的方法,同一时间只能被一个线程访问。
- volatile:告诉编译器,被修饰的变量是随时可以变化的,该变量的值的每一次改变,其他使用到的线程都可以立刻知道。
抽象类和接口的区别:
- 抽象类中可以有抽象方法和普通方法,接口中只能有抽象方法
- 抽象类中可以有构造方法,接口中没有构造方法
- 抽象类中可以有普通变量,接口中只能有public 常量
- 抽象类只能单继承类,接口可以继承多个接口(interface xxx extends A,B,C{})
- 实现类只能继承一个抽象类,但是可以实现多个接口