虚拟机在首次加载Java类时,会对静态成员变量、静态初始化块、静态方法进行一次初始化。只执行一次,不随创建再执行。我们不要去纠结这里的顺序,一般来说我们只需要知道,静态方法一般在最后。
父类静态变量>父类B静态代码块->子类静态变量-》子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数
类方法不用this,可以直接调用本类类方法。在静态方法中不能访问类(对象的)的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用,而此时静态初始化对象还不存在。
但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的
1、Java抽象类中不能有静态的抽象方法。
抽象类是不能实例化的,即不能被分配内存;而static修饰的方法在类实例化之前就已经别分配了内存,这样一来矛盾就出现了:抽象类不能被分配内存,而static方法必须被分配内存。所以抽象类中不能有静态的抽象方法。
定义抽象方法的目的是重写此方法,但如果定义成静态方法就不能被重写。
2、接口中不能有静态的抽象方法
接口中的方法也只能是 public abstract修饰的,不能加上static。接口是不能实例化的,即不能被分配内存,而static修饰的方法在类实例化之前就已经别分配了内存,这样一来矛盾就出现了:接口不能被分配内存,而static方法必须被分配内存。所以接口中不能有静态的抽象方法。
3、抽象类不一定有抽象方法
静态static是属于字节码的。
一个抽象类可以没有抽象方法,使用abstract只是为了不被实例化。
以上两点可以说明,静态方法只要有字节码存在就可以运行,所以抽象类中可以有静态方法。
4、静态和抽象不能共存在方法上
因为静态属于字节码,不需要对象就可以运行;而抽象方法没有方法体,运行没有意义,所以不能共存。
分类: Java
抽象类接口都可以有静态变量,接口中publicstaticfinal,抽象类都可以。两者都不能有静态抽象方法,抽象类可以有静态方法。接口不能有静态方法。
抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。
如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。
1.static关键字会改变类中成员的访问权限吗?
有些初学的朋友会将java中的static与C/C++中的static关键字的功能混淆了。在这里只需要记住一点:与C/C++中的static不同,Java中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字。看下面的例子就明白了:
静态变量定义于类主体中,不能第定义与方法中,不改变访问权限
虽然对于静态方法来说没有this,那么在非静态方法中能够通过this访问静态成员变量吗?先看下面的一个例子,这段代码输出的结果是什么?
1 2 3 4 5 6 7 8 9 10 11 12 | public class Main { static int value = 33; public static void main(String[] args) throws Exception{ new Main().printValue(); } private void printValue(){ int value = 3; System.out.println(this.value); } } |
View Code
这里面主要考察队this和static的理解。this代表什么?this代表当前对象,那么通过new Main()来调用printValue的话,当前对象就是通过new Main()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是33。在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出结果是33。在这里永远要记住一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。
2.C/C++中static是可以作用域局部变量的,但是在Java中切记:
static是不允许用来修饰局部变量
。不要问为什么,这是Java语法的规定。