Java 何时使用静态方法
我想知道什么时候使用静态方法?假设我有一个包含几个getter和setter的类,一个或两个方法,我希望这些方法只能在类的实例对象上调用。这是否意味着我应该使用静态方法 例如:Java 何时使用静态方法,java,static-methods,Java,Static Methods,我想知道什么时候使用静态方法?假设我有一个包含几个getter和setter的类,一个或两个方法,我希望这些方法只能在类的实例对象上调用。这是否意味着我应该使用静态方法 例如: Obj x = new Obj(); x.someMethod(); public class Demo { public static void main(String... args) { Demo d = new Demo(); System.out.println("Th
Obj x = new Obj();
x.someMethod();
public class Demo
{
public static void main(String... args)
{
Demo d = new Demo();
System.out.println("This static method is executed by JVM");
//Now to call the static method Displ() you can use the below methods:
Displ(); //By method name itself
Demo.Displ(); //By using class name//Recommended
d.Displ(); //By using instance //Not recommended
}
public static void Displ()
{
System.out.println("This static method needs to be called explicitly");
}
}
…或:
Obj.someMethod(); // Is this the static way?
我很困惑 java中的静态方法属于类(而不是它的实例)。它们不使用实例变量,通常从参数中获取输入,对其执行操作,然后返回一些结果。实例方法与对象关联,顾名思义,可以使用实例变量。否,静态方法与实例不关联;他们属于这个班。静态方法是你的第二个例子;实例方法是第一种方法。如果希望在没有类实例的情况下访问该方法,请使用静态方法。静态:
Obj.someMethod
当您希望提供对方法的类级访问时,请使用
static
,即在没有类实例的情况下应该可以调用该方法。静态方法与实例不关联,因此它们无法访问类中的任何非静态字段
如果静态方法不使用类的任何字段(或仅使用静态字段),则将使用该方法
如果使用类的任何非静态字段,则必须使用非静态方法。一条经验法则:问问自己“即使尚未构造对象,调用此方法是否有意义?”如果是这样,它肯定应该是静态的 因此,在类
Car
中,您可能有一个方法:
double convertMpgToKpl(double mpg)
…这将是静态的,因为人们可能想知道35mpg转换成什么,即使没有人制造过汽车
。但是这种方法(设置一辆特定汽车的效率)
:
…不能是静态的,因为在任何Car
构建之前调用该方法是不可想象的
(顺便说一句,反过来并不总是正确的:您有时可能有一个方法涉及两个Car
对象,但仍然希望它是静态的。例如:
Car theMoreEfficientOf(Car c1, Car c2)
虽然可以将其转换为非静态版本,但有些人会认为,由于没有“特权”选择哪个
Car
更重要,你不应该强迫调用者选择一个Car
作为你调用方法的对象。不过,这种情况只占所有静态方法的一小部分。在阅读了Misko的文章后,我认为从测试的角度来看是不好的。你应该让我nstead(可能使用依赖项注入工具,如)
如何确保我只拥有其中一项
只有一件东西
“我如何确保我
“只有一个”是很好的
回避。您只实例化了一个
您的应用程序中的单个应用程序工厂
主要的,因此,你只有
实例化所有对象的单个实例
你的单身汉
静态方法的基本问题是它们是过程代码
静态方法的基本问题是
它们是程序代码,我没有
了解如何对过程代码进行单元测试。
单元测试假设我可以
实例化我的应用程序的一部分
在实例化过程中
我将依赖项与
取代游戏的模拟/友谊赛
真正的依赖关系。与程序
编程无需“连线”
因为没有对象,所以代码
数据是分开的
静态方法不需要在对象上调用,也就是在您使用它时。例如:您的Main()是静态的,您不需要创建对象来调用它。仅在以下场景中定义静态方法:
静态方法和变量是Java中“全局”函数和变量的受控版本。在这些函数和变量中,可以通过
classname.methodName()
或classInstanceName.methodName()
访问方法,也就是说,可以使用类名和类实例访问静态方法和变量
类不能声明为静态(因为它没有意义。如果类声明为公共的,则可以从任何地方访问),内部类可以声明为静态。实际上,我们在类中使用静态属性和方法,当我们想使用程序的某个部分时,它应该一直存在,直到程序运行。我们知道,要操作静态属性,我们需要静态方法,因为它们不是实例变量的一部分。如果没有静态方法,我们可以操作静态属性非常耗时。使用静态方法有一些合理的理由:
- 性能:如果您希望运行某些代码,而不想实例化额外的对象来执行此操作,请将其放入静态方法中。JVM还可以大量优化静态方法(我想我曾经读过James Gosling,他宣称JVM中不需要自定义指令,因为静态方法同样快,但找不到源代码——因此可能是完全错误的)是的,这是微观优化,可能是不必要的。我们程序员从来不会因为他们很酷就做不必要的事情,对吧
- 实用性:使用静态导入调用
,而不是调用Util.method(arg)
,或者new Util().method(arg)
。更简单、更短method(arg)
- 添加方法:您确实希望类字符串
class Languages { public static void main(String[] args) { display(); } static void display() { System.out.println("Java is my favorite programming language."); } }
class Student9{ int rollno; String name; static String college = "ITS"; static void change(){ college = "BBDIT"; } Student9(int r, String n){ rollno = r; name = n; } void display (){System.out.println(rollno+" "+name+" "+college);} public static void main(String args[]){ Student9.change(); Student9 s1 = new Student9 (111,"Indian"); Student9 s2 = new Student9 (222,"American"); Student9 s3 = new Student9 (333,"China"); s1.display(); s2.display(); s3.display(); } }
1. new ABCClass(double farenheit).convertFarenheitToCelcium() 2. ABCClass.convertFarenheitToCelcium(double farenheit)
Math.random() Math.sqrt(double) Math.min(int, int) StringUtils.isEmpty(String) StringUtils.isBlank(String)
new MockUp<ClassName>() { @Mock public int doSomething(Input input1, Input input2){ return returnValue; } };
public static int min(int a, int b) { return (a <= b) ? a : b; }
public class Demo { public static void main(String... args) { Demo d = new Demo(); System.out.println("This static method is executed by JVM"); //Now to call the static method Displ() you can use the below methods: Displ(); //By method name itself Demo.Displ(); //By using class name//Recommended d.Displ(); //By using instance //Not recommended } public static void Displ() { System.out.println("This static method needs to be called explicitly"); } }