1、修饰符
public
关键字是访问修饰符,表示用于设置类,属性,方法和构造函数的访问级别。
我们将修饰符分为两种:
- 访问修饰符-控制访问级别
- 非访问修饰符-不控制访问级别,但提供其他功能
2、访问控制修饰符
对于类,可以使用public
或default:
修饰符 | 描述 |
| 该类可由任何其他类访问 |
default | 当使用不指定修饰符时,该类只能由同一包中的类访问。 |
对于属性,方法和构造函数,可以使用以下之一:
修饰符 | 描述符 |
| 可用于所有类 |
| 只能在声明的类中访问 |
default | 当使用不指定修饰符时,该类只能由同一包中的类访问。 |
| 对同一包内的类和所有子类可见。 |
3、非访问修饰符
对于类,可以使用final
或abstract
:
修饰符 | 描述 |
| final 修饰的类不能够被继承 |
| 用来创建抽象类 |
对于属性和方法,可以使用以下之一:
修饰符 | 描述 |
| 修饰的方法不能被继承类重新定义 |
| 修饰的属性和方法属于类,而不是对象 |
| 只能在抽象类中使用,并且只能在方法上使用。 该方法没有实现,例如,
|
| 序列化包含修饰的属性和方法的对象时,将忽略这些属性和方法 |
| 一次只能由一个线程访问方法 |
| 当写一个volatile变量时, JMM会把该线程对应的本地内存中的共享变量值刷新到主内存。 当读一个volatile变量时, JMM会把该线程对应的本地内存置为无效。 线程接下来将从主内存中读取共享变量。 |
4、final修饰符
如果不希望覆盖现有的属性值,请将属性声明为final
:
例如:
public class Main {
final int x = 10;
final double PI = 3.14;
public static void main(String[] args) {
Main myObj = new Main();
myObj.x = 50; // 会产生一个错误: cannot assign a value to a final variable
myObj.PI = 25; // 会产生一个错误: cannot assign a value to a final variable
System.out.println(myObj.x);
}
}
5、static修饰符
static
方法是类方法,不需要创建类的对象就可以访问,这与public
不同:
例如:
下面示例说明static
和public
方法之间的区别:
public class Main {
// 静态方法
static void myStaticMethod() {
System.out.println("可以在不创建对象的情况下调用静态方法");
}
// 公共方法
public void myPublicMethod() {
System.out.println("公共方法必须通过创建对象来调用");
}
// main方法
public static void main(String[ ] args) {
myStaticMethod(); // 调用静态方法
// myPublicMethod(); 会出错
Main myObj = new Main(); // 创建Main类的对象
myObj.myPublicMethod(); // 调用方法
}
}
6、abstract修饰符
abstract
抽象方法属于abstract
类,并且该方法没有实现。方法由子类实现:
例如:
// MyClass.java
public class MyClass {
public static void main(String[] args) {
// 创建Student类的一个对象(从Person继承属性和方法)
Student myObj = new Student();
System.out.println("Name: " + myObj.fname);
System.out.println("Age: " + myObj.age);
System.out.println("year: " + myObj.year);
myObj.study(); // 调用抽象方法
}
}
//Main.java 抽象类
abstract class Person {
public String fname = "cjavapy";
public int age = 3;
public abstract void study(); // abstract method
}
// 子类 (从Main类继承)
class Student extends Person {
public int year = 2017;
public void study() { // 实现抽象方法
System.out.println("好好学习,天天向上!!!");
}
}