java提供了很多修饰符,主要分为两类:
- 访问修饰符
- 非访问修饰符
修饰符用来定义类、方法或者变量,通常放在语句的最前端。
访问控制修饰符
Java中,可以使用访问控制修饰符来控制类、变量方法和构造方法的访问,java中有四种访问控制修饰符:
- default 默认,在同一包内可见,不适用任何修饰符。使用对象:类、接口、变量、方法。
- private 在同一类中可见。使用对象:变量、方法。注意:不能修饰类。
- public 对所有类可见。使用对象:类、接口、变量、方法。
- protected 对同一包内的所有类和子类可见。使用对象:变量、方法。注意:不能修饰类。
默认访问修饰符(不使用任何关键字)
使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口
里的变量都默认声明为public static final
,而接口里面的方法默认访问权限为public
。
如下所示,变量的方法和名称可以不使用修饰符修饰(默认default)
public class Modifier {
int num = 10;
private int age = 18;
public Modifier() {
}
public static void main(String[] args) {
Modifier test = new Modifier();
System.out.println(test.num); // 10
System.out.println(test.age); // 18
}
}
私有访问修饰符private
私有访问修饰符是最严格的访问级别,所有被声明为private的方法、变量和构造方法只能被所属类访问,并且类和接口不能被声明为private。声明为private只能通过类中公共的getter方法被外部访问。
private访问修饰符主要用来隐藏类的实现细节和保护类的数据。
public class PrivateModifier {
private String name;
public String getName() {
return name;
}
public void setName(String newName) {
name = newName;
}
public PrivateModifier(String newName) {
name = newName;
}
public static void main(String[] args) {
PrivateModifier test = new PrivateModifier("PRIVATE_MODIFIER....");
System.out.print(test.name); // PRIVATE_MODIFIER....
System.out.print(test.getName()); // PRIVATE_MODIFIER....
test.setName("newName");
System.out.print(test.getName()); // newName
}
}
共有访问修饰符public
被声明为public的类、方法、构造方法和接口能够被其他任何类访问。
如果几个相互访问的public类分布在不同的包中,则需要导入相应public类所在的包。由于类的继承性,类的所有公有方法和变量都能被子类继承。
注:Java中main()方法必须被设置成公有的,否则,java解释器将不能运行该类。
受保护的访问修饰符protected
修饰符protected需要从以下两个点来分析说明:
- 子类和基类在同一包中:被声明为protected的变量、方法和构造方法能被同一个包中的其他类访问。
- 子类和基类不在同一个包中:那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。
访问控制和继承
规则:
- 父类中声明为public的方法在子类中也必须为public。
- 父类中声明为protected的方法在子类中只能声明为protected或者public,不能声明为private。
- 父类中声明为private的方法,不能够被继承。
非访问修饰符
为了实现其他一些功能,java也提供了许多非访问修饰符。
- static修饰符
- 静态变量:static关键字用来声明独立于对象的静态变量,无论一个类实例化多少个对象,他的静态变量只有一份拷贝。(在变量类型中的类变量也提到这点:无论通过一个类实例化了多少个对象,类只拥有类变量的一份拷贝。),静态变量也被称为类变量。局部变量不能被声明为static变量。
- 静态方法:static关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。
类似JavaScript静态变量和方法可以直接作为类的属性访问或者调用。
public class StaticModifier {
public static String name = "STATIC MODIFIER";
public static int getAge() {
return 18;
}
public static void main(String[] args) {
System.out.println(StaticModifier.name); // STATIC MODIFIER
System.out.println(StaticModifier.getAge()); // 18
}
}
- final修饰符
- final变量:
final修饰的变量一旦被赋值后,不能重新被赋值。被final修饰的实例变量必须显式指定初始值。(注:final修饰符通常和static修饰符一起使用来创建常量)
public class FinalModifier { public static int num; static final int count = 10; // static final int count1; // 报错:The blank final field count1 may not have been initialized public static void main(String[] args) { num = 1; System.out.println(num); // 1 System.out.println(count); // 10 } }
- final变量:
- final方法:
父类中的final方法可以被子类继承,但是不能被子类重写。
声明final方法的主要目的是防止该方法的内容被修改。 - final类:
final类不能被继承,没有类能够继承final类的任何特性。
其他修饰符
现在对类的了解还不够,继续学习修饰符不适合,后面再补充。