加上static修饰的属性,JVM分配在静态存储区,不加static属性的,JVM分配在堆区。static修饰的成员在类加载的时候就装载和分配了。而非static关键字的方法,在类定义时没有占用内存,只有在类被实例化对象时,对象调用该方法才被分配内存。
静态变量
如果希望所有的成员共享一个成员变量,那么就需要用到static修饰该成员变量。Java中被static修饰的成员称为***静态变量***或***类变量***。意思是:被static修饰的成员变量属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态变量可以使用类名直接访问也可以使用对象名进行访问。下面来看一个例子:
-
静态函数
- 调用同类中的静态变量
静态函数可以直接调用同类中的静态变量,但是不能直接访问同类中的非静态变量
: 调用同类中的非静态变量
静态方法中不能访问类的非静态变量。因为他们必须依赖与对象才能被调用。如果要调用同类中的非静态变量,则需要创建对象来访问
: 调用同类中的非静态函数
静态方法中不能访问类的非静态方法。因为他们必须依赖与对象才能被调用。如果调用同类中的非静态函数同样也要创建对象,通过对象访问
普通成员函数调用同类的静态变量和非静态变量可以直接访问
静态代码块与非静态代码块
Java中的静态代码块是在虚拟机加载类的时候就执行的,只执行一次。
有多个静态代码块则会按照先后顺序执行它们,每个代码块执行一次
非静态代码块是在类new一个实例的时候执行的,而且是每次new对象
实例都会执行
如果有代码在项目启动的时候就执行,则需要使用静态代码块,这种代码是主动执行的,需要在项目启动的时候就初始化
静态导包
静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用方法类
final
1.修饰类
用final 修饰一个类表明这个类不能被继承
2.修饰变量
如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改。
3.修饰方法
防止继承类修改它的涵义,该方法将无法被重写
关于权限
private
访问权限仅限于类的内部,是一种封装的体现
public
具有最大的访问权限,可以访问任何一个在classpath下的类,接口,异常类等,
它往往用于对外的情况,也就是对象或类对外的一种接口的形式
protected
用来保护子类的。子类可以使用protected修饰的成员,其他的不可以
default
任何处于本包下的类,接口,异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以
代码的执行顺序
1.主调类的静态代码块
2.对象父类的静态代码块
3.对象的静态代码块
4.对象父类的非静态代码块
5.对象父类的构造函数
6.对象的非静态代码块
7.对象的构造函数