首页 > 编程 > Java > 正文

java中static方法的使用问题

2019-11-06 06:57:19
字体:
来源:转载
供稿:网友

遇到一个问题:

这里写图片描述

如图所示,在改行中IDE给出warning:

The static method PRint() from the type demo should be accessed in a static way

有三种解决方案:

把text该为demo;把print()方法中的static去掉;把text去掉,直接调用print()方法;

简单来说:

这个是警告,不是错误,不影响使用print()方法是static静态方法,直接使用”类.方法”调用,因为静态方法在对象创建前就存在了,他的使用不依赖对象是否被创建.非静态的方法用”对象.方法”的方式,因为他在对象创建前不存在,必须依赖对象的创建后,才能使用由于在本类调用,可以直接使用方法。

以下是static方法和实例方法的区别:

生命周期(Lifecycle):

静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭。

非静态方法(Non-Static Method)又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。

在内存中存储位置

静态方法和静态变量创建后始终使用同一块内存,是连续的。

非静态方法会存在于内存的多个地方,是离散的。

效率

静态方法的使用效率比非静态方法的效率高。

线程安全

静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发(Concurrence)的问题。

非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。

使用范围

静态方法: ⒈ 有静态属性的类,一般会定义静态方法。 ⒉ 没有属性的类,一般会定义静态方法。 ⒊ 如果一个方法与他所在类的实例对象无关,那么它就应该是静态的。静态方法可以被继承但是不能被覆盖。

总计

如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。如果从线程安全、性能、兼容性上来看,选用实例化方法为宜。

一般来说, 在程序里面,一些使用频率高的方法就用static 方法、使用频率低的则用实例方法。


注意:

静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。在普通成员方法中,则可以直接访问同类的非静态变量和静态变量。静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表