我们定义一个学生类,设定一个静态变量(属性)age,设定一个非静态变量(属性)score,下面我们来看看他们之间有何区别:
public class Student {
private static int age=15;//静态变量
private double score=98;//非静态变量
public static void main(String[] args) {
Student s1=new Student();
System.out.println(s1.score);
System.out.println(s1.age);
}
}
我们发现,对于实例化后的s1这个Student对象,对于age和score属性都能调用,我们再加入代码如下:
System.out.println(Student.age);
System.out.println(Student.score);
我们会发现,score这里会出现错误,错误信息是:score是非静态字段,不能以类名直接访问。
说明通过类名无法直接访问非静态变量。如果想要让多个类去操作一个变量,那么就把它设为static。
有静态属性,就会有静态方法,我们定义两个方法如下:
public void run(){
}
//静态方法
public static void go(){
}
试着直接再主函数里调用run方法,不行。所以只能通过对象.方法的形式去调run方法:
new Student().run();
而对于go这个静态方法,调用很明显方便了很多:
Student.go();
非静态方法可以去调用静态方法里面的所有东西;静态方法里面可以调用静态方法的,但是不能调用非静态方法。
main方法也是静态方法
下面介绍一下匿名代码块、静态代码块。
public class Person {
{
System.out.println("匿名代码块");
}
static {
System.out.println("静态代码块");
}
public Person(){
System.out.println("构造方法");
}
public static void main(String[] args) {
Person p1=new Person();
}
}
以上的匿名代码块、构造方法、静态代码块的执行先后顺序如何?运行输出结果如下:
静态代码块
匿名代码块
构造方法
由此可见:
1. 静态代码块最先执行,而且只执行一次
2. 匿名代码块在静态代码块后面执行,在每次构造器初始化前都会执行,可以用来赋初始值
被final修饰的类无法被继承