如何以及在何处使用Java中的Static修饰符?
我们应该如何以及在何处使用Static修饰符:
场和
2.方法?
例如,在java.lang.Math
类中,字段方法如abs(),atan(),cos()等是静态的,即它们可以被访问为: Math.abs()
但为什么这是一个好习惯呢?
说,我不保持静态并创建类的对象并访问它,无论如何我都可以,我会得到一个警告,你试图以非静态方式访问静态方法(如指出通过@duffymo,而不是Math类)。
更新1:
因此,效用方法应该是静态的,即其工作仅取决于方法参数。 那么,例如,方法updateString(String inputQuery, String highlightDoc)
应该是这个问题中的静态方法吗?
您可以将“静态”方法或字段视为在类定义之外声明它。 换一种说法
- 静态字段/方法只有一个“副本”。
- 静态字段/方法无法访问非静态字段/方法。
有几个例子你想要做一些静态的东西。
字段的规范示例是创建一个静态整数字段,该字段在类的所有实例(对象)中保持计数。 另外,单例对象例如通常也使用静态修改器。
类似地,静态方法可用于执行“实用程序”作业,其中所有必需的依赖项作为参数传递给方法 – 您不能在静态方法中引用“this”关键字。
在C#中,您还可以拥有静态类,正如您可能猜到的那样,它们只包含静态成员:
public static class MyContainer { private static int _myStatic; public static void PrintMe(string someString) { Console.Out.WriteLine(someString); _myStatic++; } public static int PrintedInstances() { return _myStatic; } }
Static使用较少的内存,因为每个Classloader只存在一次。
要使方法静态可以节省一些时间,因为您不必先创建一个对象,这样就可以调用一个函数。 你可以/应该使用静态方法,因为它们几乎独立(即Math.abs(X) – 函数确实没有对象。)基本上它是一个方便的东西(至少就我看来 – 其他人可能会也会不同意:P)
静态字段应该谨慎使用。 有很多模式需要静态字段……但首先是基础知识:
静态字段只存在一次。 所以如果你有一个简单的类(有点伪代码):
class Simple { static int a; int b; }
现在你用以下物体制作物品:
Simple myA = new Simple(); Simple myB = new Simple(); myA.a = 1; myA.b = 2; myB.a = 3; myB.b = 4; System.out.println(myA.a + myA.b + myB.a + myB.b);
你会得到3234 – 因为通过设置myB.a你实际上也会覆盖myA.a因为a是静态的。 它存在于记忆中的一个地方。
你通常想避免这种情况,因为可能会发生奇怪的事情。 但是,如果您以工厂模式为例进行谷歌搜索,您会发现这种行为实际上非常有用。
希望能把它搞清楚一点。
试着看一下这篇文章,它还给出了一些关于何时何时不使用静态和最终修饰符的例子。
上面的大多数post都很相似,但这篇文章可能会提供其他一些见解。
何时使用静态修改器
通常当方法仅依赖于函数参数而不依赖于对象的内部状态时,它是一个静态方法(单线程是唯一的例外)。 我无法想象真正使用静态字段的位置(它们与应该避免的全局变量相同)。
与您的示例中一样,数学函数仅取决于参数。
对于字段,如果希望给定类的所有实例都可以访问其值,则应将其保持为静态。 例如,如果我有
public static int age = 25;
然后,类的任何实例都可以获取或设置age的值,并且所有实例都指向相同的值。 如果你确实做了一些静态的事情,你就冒着让两个实例覆盖其他值并可能导致问题的风险。
创建静态方法的原因主要是实用函数,其中传递了方法的所有必需数据,并且您不希望每次要调用方法时都要创建类的实例。
您无法实例化java.lang.Math的实例; 没有公共构造函数。
尝试一下:
public class MathTest { public static void main(String [] args) { Math math = new Math(); System.out.println("math.sqrt(2) = " + math.sqrt(2)); } }
这是你会得到的:
C:\Documents and Settings\Michael\My Documents\MathTest.java:5: Math() has private access in java.lang.Math Math math = new Math(); ^ 1 error Tool completed with exit code 1
class StaticModifier { { System.out.println("Within init block");//third } public StaticModifier() { System.out.println("Within Constructor");//fourth } public static void main(String arr[]) { System.out.println("Within Main:");//second //StaticModifier obj=new StaticModifier(); } static { System.out.print("Within static block");//first } }
- 如何在远程服务器上运行mongo db脚本?
- 使用Selenium Webdrivers方法“browser.helperApps.neverAsk.saveToDisk”如何在点击链接时自动下载文件
- ClassNotFoundException oracle.jdbc.driver.OracleDriver仅在servlet中使用Eclipse
- 在Netty连接关闭后重新连接的最佳方法是什么
- 在重入锁定的条件下等待
- Java – Full GC(垃圾收集器)在短时间间隔内发生很多事情,导致性能下降
- 如何使用jackson遍历生成的json模式并将自定义属性放在json模式中
- 如何在applet中禁用http缓存
- SpringBoot 1.5.x + Security + OAuth2