咱们从关键字static能够修饰哪些东西入手,逐一的剖析static的使用和要注意的地方。java
又称为类变量dom
a)全部类实例共享
b)使用静态变量
类名.变量名
c)静态变量是属于这个类,非静态变量是属于对象
d)代码加载到内存静态变量就已经存在了
e)static变量和实例变量的区别:
i)static变量对于每一个类而言在内存中只有一个,能被类的全部实例所共享;
实例变量对于每一个类的每一个实例都有一份,它们之间互不影响;
ii)Java虚拟机在加载类的过程当中为static变量分配内存,
实例变量在加载完类后建立对象时分配内存;
iii)static变量存在方法区,实例变量存在堆区;
v)static变量能够直接经过类名访问,
实例变量经过引用类型变量访问;ui
称为类方法this
a)调用时使用
类名.方法名();
b)静态方法不能使用非静态的变量
静态方法在类加载的时候就存在了
非静态变量在对象建立的时候才存在的
非静态方法能够访问静态变量
c)静态方法不能被非静态方法重写,静态方法不能被静态方法重写(总之就是不能被 重写)
d)静态方法用来表示某个类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。既然如此,当前类必须为静态方法提供实现。静态方法属于类。
e)不能使用this关键字和super关键字;(考虑它的生命周期来理解)code
this表示的当前对象,而被static修饰的是属于类的,不须要建立对象就可使用;super是表明父类对象,调用父类的静态方法直接使用类名.方法名就能够。对象
对静态变量进行初始化,当Java虚似机加载类时,就会执行该代码块;被static 所修饰的成员变量和成员方法代表归某个类全部,它不依赖于类的特定实例,被 类的全部实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据 区的方法区内定位到它们。并且只会被加载一次。继承
static{ System.out.print("hello static"); }
对非静态变量进行初始化:生命周期
{ System.out.print("hello static"); }
这个用法通常不太出现,不多使用。内存
import java.lang.Math;
使用:Math.random()字符串
import static java.lang.Math.*;
使用:random()
建立一个对象时的类加载步骤或者说顺序: Student student =new Student();猜猜它的执行顺序会是什么?咱们来理一理逻辑,子类继承父类,建立一个子类对象首先要有一个父类被建立,Student()构造器里默认有一个super()方法,全部会先初始化父类,而后是初始化子类的部分。下面来看具体的步骤:
public class Student extends Person{ private static String name; private int age; public Student() { System.out.println("this student constructor"); } static { System.out.println("this is student static block"); } { System.out.println("hello student"); } public static void main(String[] args) { Student stu = new Student(); } } class Person{ private static int count; private String title; public Person() { System.out.println("this person constructor"); } static { System.out.println("this is person static block"); } { System.out.println("hello person"); } }
//运行结果 this is person static block this is student static block hello person this person constructor hello student this student constructor
变量必须初始化,变量的值不容许修改。
final变量都必须显示初始化,
a) 修饰静态变量,只能在定义变量时进行初始化;
b) 修饰实例变量,能够在定义变量时进行初始化,或者在构造方法中进行初始 化;
该方法不可以被重写
该类不可以被继承,即不能与abstract同时使用。
String类就是final修饰的类,全部字符串是不能改变的,只能经过拼接建立新的 String对象,这样很浪费内存,因此又有了StringBuilder和StringBuffer;这两 个类后面再解释,能够去思考和看他们的实现源码。
后面出一篇关于这个的文章,敬请关注。