实例相关的,必须先有对象才能通过 “引用.” 访问,可能会出现空指针异常
静态相关的,不需要对象的参与即可通过 “类名." 访问,没有空指针异常发生
空指针异常只有在什么情况下发生?
只有在”空引用“访问”实例“相关的,都会出现空指针异常
静态变量在类加载时初始化,不需要new对象,静态变量的空间就开出来了,静态变量存储在方法区
什么时候变量声明为静态的?
如果这个类型的所有对象的某个属性值都一样,不建议定义为实例变量,浪费内存空间。建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存空间。
对于方法来说,什么时候定义为实例方法?什么时候定义为静态方法?
此方法一般都是描述了一个行为,如果说这个行为必须由对象去触发,则定义为实例方法。也可以说是在方法体中,直接访问了实例变量,也定义为实例方法。
在开发中,如果是工具类的话,工具类中的方法一般都是静态的,因为静态方法不需要new对象就可以直接通过类名调用,极其方便
静态变量与非静态变量
public class Demo { private static int age; private double score; public static void main(String[] args) { Demo d= new Demo(); d.score=0; //调用非静态 //调用静态 age=0; Demo.age=0; } }
静态方法与非静态方法
public class Demo { public void run(){ } public static void go(){ } public static void main(String[] args) { Demo d= new Demo(); //调用非静态 d.run(); //调用静态 Demo.go(); go(); } }
静态代码块、匿名代码块、构造器
静态代码块:与类一起加载执行,永久==执行一次==,在main方法执行之前执行,一个类中可以编写多个静态代码块,加载时机相同,一般按照自上而下的顺序
static{ //java语句; }
静态代码块有什么作用?
静态代码块不常用,只是给java程序员一个类加载时机,例如需要在类加载时记录日志文档。
匿名(实例)代码块:创建对象时创建,在构造器之前,常用赋初始值,构造方法执行之前执行,每调一次构造方法都会执行一次
语法结构:
{ //java语句; }
也是给java程序员的一个对象创建时机
三者执行顺序:
先执行静态代码块,在调用构造方法后,执行构造方法前先执行实例代码块,最后执行构造方法内容
public class Demo { { System.out.println("匿名"); } static{ System.out.println("静态"); } public Demo(){ System.out.println("构造方法"); } public static void main(String[] args) { Demo demo = new Demo();//1.静态 2.匿名 3.构造方法 } }
静态导入包
//静态导入包 import static java.lang.Math.random; public class Demo { public static void main(String[] args) { System.out.println(random()); //可以直接使用random() } }