这里的静态,指以static关键字修饰的,包括类,方法,块,字段。静态变量和静态方法都属于静态对象 非静态,指没有用static 修饰的。
(1)主要区别:
静态方法属于类所有,类实例化前(创建对象前)即可通过 类名.方法名 调用
实例方法必须通过new出来的对象调用
(2)访问上:
静态方法只能访问类中的静态成员(即静态成员变量和静态方法)
实例方法可以访问类中的任何成员
(3)外部调用:
静态方法:可以使用 “类名.方法名”
或者 “对象名.方法名” 的方式调用(即可以无需创建对象)
实例方法:只能使用 “对象名.方法名” 的方式调用
1.静态方法: 方法用static关键字修饰,静态方法与静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在于内存中,直到JVM关闭。使用时也是不需要实例化类,能够直接使用。静态方法无法被重写
需要注意的是:在静态方法中只能访问类中的静态成员跟静态方法,不能直接访问类中的实例变量跟实例方法,原因是静态方法在JVM中的加载顺序也在对象之前,直接使用实例变量跟实例方法的话,可能实例变量跟实例方法所依附的对象并没有被创建,会导致无法找到所使用的实例变量跟实例方法。 要想使用实例变量跟实例方法可以采用如下方法:在静态方法中创建实例变量和实例方法所在的对象,通过这个对象来使用实例变量跟实例方法。
2.实例化方法: 属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。
3、线程安全上: 静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发的问题。 非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。
4、如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。