常用修饰符
Java中修饰符有abstract(抽象的)、static(静态的)、public(公开的)、protected(受保护的)、private(私有的)、final(不可变的),每个修饰符修饰的内容是不同的
访问控制修饰符public、protected、private
该类修饰是控制访问权限的,他们主要修饰成员方法、构造方法和成员变量,其中public可以修饰类
方法控制一共分为四个级别
- 公开级别:public:对外公开,几乎项目里的任何类中都可以访问
- 受保护级别:protected:对子类和同一个包里的类公开。
- 默认级别:没有任何访问控制修饰符:对同一个包里的类公开,对不是一个包的子类不公开。
- 私有级别:用private修饰,对外不公开,只要类本身可以访问。
这个很容易理解,可以自己试试。我这里举个例子演示一下
package mypack1;
public class test1{
public int var1;
protected int var2;
private int var3;
int var4;
test1 t1=new test1();
t1.var1=1;
t1.var2=2;
t1.var3=3;
t1.var4=4;
//以上行为均是合法的,因为是在同一个包里,也在本类中。
}
public class class2{
t1.var1=1;//合法
t1.var2=2;//合法
t1.var3=3;//不合法
t1.var4=4;//合法
//因为var3的访问权限只有本类才有。
}
package mypack2;
public class class3 extends class1{
t1.var1=1;//合法
t1.var2=2;//合法,虽不是同一个包,但确实子类
t1.var3=3;//不合法,只有本类才有资格访问。
t1.var4=4;//不合法,不是一个包,不能访问
}
abstact 修饰符
abstact 修饰符可用来修饰类和成员方法
- abstract修饰的类表示抽象类,位于继承树的抽象层,抽象类不能实例化。
- absract修饰的成员方法表示抽象方法,抽象方法没有方法体,抽象方法只用来描述系统具有什么功能,不提供具体的体现。
- 抽象方法只能在抽象类中。
public abstract class base{
abstract void method1;
}
public class subclass entends basd{
void method1(){
System.out.println("method1");
}
}
- 抽象类中可以没有抽象方法,但是具有抽象方法的类必须声明为抽象类,如果抽象类的子类没有实现父类的抽象方法,那么子类也必须定义为抽象类。
- abstract修饰词和static修饰词是冤家,不能凑到一起。一个代表抽象,一个代表具体,意思相反。
- 抽象类可以有非抽象的构造方法,因为子类可能会调用构造方法,也就是说抽象类的构造方法是给子类用的。
- 抽象类以及抽象方法不能被final修饰符修饰,因为抽象类必须有子类,final类不能有子类,二者冲突。
- 抽象方法不能被private修饰,因为抽象方法必须被某个子类取实现他,若是用private修饰,则不可能被子类实现了。
final修饰符
final类
Java中的继承的特效最大的缺点就是打破了封装,降低了安全性,为了让某些类失去继承的子类,所以引入了final类,该类不允许被继承。
- 不是继承的类专门设计的类
- 这个类不会再扩展
final方法
同样的,final方法是不允许覆盖的方法
final变量
同样的,final修饰的变量是不允许再次修改的变量,也就是常量,该变量声明之后,只能修改一次变量值。
- final可以修饰静态变量、实例变量、局部变量,就变成了静态常量、实例常量和局部常量。
- final修饰的量,必须初始化。
- final变量只能被赋一次值。
- 被final修饰的对象,内容无法改变。
- final变量名最好全是大写字母。
public class classA{
final static int x;//不合法没有显示初始化
final static int y=1;//合法
y=2;//不合法,只能赋一次值
int z;
public classA(int z){
this.z=z;
}
final classA a1=new classA(1);
a1=new classA(2);//不合法,对象内容不能改变
}
static修饰符
可以修饰成员变量、成员方法、代码块。
public class simple{
public static int number;
public void method(){
int x=number;//合法的,可直接访问静态变量
}
public static void print(){
System.out.println("print");
}
public static void main(String[] args){
print();//可直接访问
}
}
- 修饰成员变量,可以通过类名来引用。
- 修饰成员方法,可以直接调用
- 修饰代码块,优先执行静态代码模块
另外静态量的运行方式和Java虚拟机有很大的关系,这里就不多讲了。