java中的static
- 关于java中被static修饰的方法和没被static修饰的方法(静态方法和非静态方法),前者是和类一起加载的,而非静态方法需要先new相应的对象之后才可以调用相应的方法,具体例子可以看下面一段代码:
A类:
public class A {
String name;
int id;
public void talk(){
System.out.println("myTalk");
}
public static void NewTalk(){
System.out.println("newTalk");
}
}
主函数:
public class Main {
public static void main(String[] args) {
A.NewTalk();
A.score = 98;
A a = new A();
a.talk();
}
}
- 可以看到,我们可以先直接通过类名去访问静态方法NewTalk,但是我们不能仅仅认为static就是可以方便直接通过类名去访问被修饰的方法,而应该注意的是被修饰的方法之所以能直接调用是因为它已经被加载过了,即像我们定义一个变量一样,是因为有了先定义才有了后面的再使用,此处道理相同。
- 同样的被static修饰的变量-即静态变量,也是和类一起被加载的,即一进去就被定义好了,可以直接修改和访问,而不需要再去new对象这样的操作。
进阶:
A类:
public class A {
private static int age;
private double score;
public void run(){
go();
}
public static void go(){
run(); //这个run的调用会报错!
new A().run(); //必须先new之后才能去调用这个类里面的非静态方法
}
}
- 同样的,如果在定义一个类的时候,你会发现在非静态方法中可以直接静态方法,而在静态方法中就不可以去调用非静态方法,要想去调用,必须先new才可以调用,所以我们可以看出他们的出生顺序:类 = static所修饰的方法>非静态方法,即先有static和new,非静态方法要在new之后才存在,所以上面例子才会出现在go中调用run方法报错的情况,是因为go方法是在一进去就开始加载的,但是在go的函数体中碰到了run函数,发现在内存中找不到run函数,即未被加载,所以报错,解决的办法就是先new(实例化)之后才有对应的方法体被加载到内存留着被调用。
关于匿名代码块和静态代码块和构造方法的加载顺序:
A类:
public class A {
{
System.out.println("此处是匿名代码块");
}
static {
System.out.println("此处是静态代码块");
}
public A()
{
System.out.println("构造方法");
}
}
主函数:
public class Main {
public static void main(String[] args) {
A a = new A();
}
}
运行结果:
此处是静态代码块
此处是匿名代码块
构造方法
- 从运行结果可以看出,调用先后顺序是:静态代码块>匿名代码块>构造方法;可见我们平时以为类在实例化时候都是先调用构造函数并不足够准确。