静态方法和实例方法之间的区别
我正在阅读教材中给我的文字,我不太确定我明白这是什么意思。 这基本上告诉我,静态方法或类方法包括“修饰符”关键字静态。 但我真的不知道这是什么意思?
有人能请真正简单的解释静态或类方法是什么?
另外,我可以得到一个简单的解释什么样的实例方法?
这是他们在教科书中给我的:
存在或不存在静态修饰符有重要的实际意义。 一旦Java处理了它所属类的定义,就可以调用和执行公共类方法。 实例方法不是这种情况。 在公共实例方法可能被调用和执行之前,必须为其所属的类创build一个实例。 要使用公共类方法,您只需要该类。 另一方面,在你使用公共实例方法之前,你必须有一个类的实例。
在另一个方法的定义中调用静态方法的方式根据两个方法是否属于同一个类而不同。 在上面的例子中,factorial和main都是MainClass类的两个方法。 因此,在main定义中调用阶乘仅仅引用方法名“factorial”。
Java中的基本范例是编写类,并且实例化这些类。 实例化对象(类的一个实例)具有与它们相关的属性(成员variables),这些属性影响它们的行为; 当实例执行它的方法时,它会引用这些variables。
但是,特定types的所有对象都可能具有不依赖于成员variables的行为; 这些方法最好是静态的。 通过静态方法,不需要类的实例来运行该方法。
你可以这样做来执行一个静态方法:
MyObject.staticMethod();//Simply refers to the class's static code
但要执行一个非静态的方法,你必须这样做:
MyObject obj = new MyObject();//Create an instance obj.nonstaticMethod();//Refer to the instance's class's code
在更深层次上,当编译器将类放在一起时,它包含几个指向方法的指针。 当这些方法被执行时,它遵循指针并在远端执行代码。 如果一个类被实例化,创build的对象包含一个指向“虚拟方法表”的指针,该指针指向在inheritance层次结构中为特定类调用的方法。 但是,如果该方法是静态的,则不需要“虚拟方法表”:对该方法的所有调用都转到内存中的相同位置以执行完全相同的代码。 因此,在高性能系统中,如果不依赖实例variables,最好使用静态方法。
未声明为静态的方法和variables称为实例方法和实例variables。 要引用实例方法和variables,必须首先实例化类,这意味着您应该首先创build该类的对象。对于静态,您不需要实例化类,就可以使用句点符号访问类名称的方法和variables这是(。)
例如:
Person.staticMethod(); //accessing static method.
对于非静态方法,你必须实例化这个类。
Person person1 = new Person(); //instantiating person1.nonStaticMethod(); //accessing non-static method.
静态方法,variables属于整个类,而不仅仅是一个对象实例。 一个静态方法,variables与整个类相关联,而不是与一个类的特定实例相关联。 每个对象将共享一个静态方法,variables的公共副本。 每个类只有一个副本,无论从中创build多less个对象。
静态方法和实例方法之间的区别
-
实例方法是需要创build类的对象才能被调用的方法。 静态方法是Java中的方法,可以在不创build类的对象的情况下调用。
-
静态方法用static关键字声明。 实例方法不带static关键字。
-
静态方法意味着它将作为一个类的单个副本存在。 但实例方法根据为该类创build的实例的数量存在多个副本。
-
静态方法可以通过使用类引用来调用。 通过使用对象引用来调用实例或非静态方法。
-
静态方法不能直接访问实例方法和实例variables。 实例方法可以直接访问静态variables和静态方法。
参考: geeksforgeeks
实例方法 =>在特定类的特定实例上调用。 方法想知道在哪个类被调用。 它发生的方式是一个不可见的参数,称为“这个”。 在“这个”里面,我们有实例类的成员已经设置了值。 “这个”不是一个variables。 这是一个价值,你不能改变它,价值是参考呼叫的接收者。 例如:你打电话给修理工(实例方法)来修理你的电视机(实际的节目)。 他带有工具('this'参数)。 他带有固定电视所需的特定工具,他也可以修理其他东西。
在静态方法中 =>不存在“this”这样的事情。 例如:相同的修理工(静态方法)。 当你给他打电话时,你必须指定哪个修理工打电话(如电工)。 他只会来修理你的电视。 但是,他没有工具来解决其他问题(没有这个参数)。
静态方法通常对于不需要来自类的实例(来自“this”)的任何数据的操作是有用的,并且可以仅使用它们的参数来执行其预期的目的。
如果一个方法的状态不应该被改变,或者它不会使用任何实例variables。
你想调用没有实例的方法。
如果它只适用于提供给它的参数。
效用函数是静态方法的好实例。 即math.pow(),这个函数不会改变不同值的状态。 所以它是静态的。
对象的行为取决于该类的variables和方法。 当我们创build一个类时,我们为它创build一个对象。 对于静态方法,我们不要求它们作为静态方法意味着所有的对象都会有相同的副本,所以不需要对象。 例如:
Myclass.get();
在实例方法中,每个对象都有不同的行为,所以他们必须使用对象实例调用方法。 例如:
Myclass x = new Myclass(); x.get();
放置在函数前面的静态修饰符意味着只有该函数的一个副本存在。 如果静态修饰符没有放在函数的前面,那么每个对象或该类的实例都会创build该函数的新副本。 :)variables的情况也是如此。
简而言之,静态方法和静态variables是类级别,其中实例方法和实例variables是实例或对象级别。
这意味着无论何时创build实例或对象(使用新的ClassName()),该对象都将保留自己的副本instacevariables。 如果你有五个不同的同一类对象,你将有五个不同的实例variables副本。 但是所有这五个对象的静态variables和方法将是相同的。 如果你需要一些共同的东西被每个创build的对象所使用,那么它就是静态的 如果您需要一种不需要特定对象数据的方法,请将其设置为静态。 静态方法只能用于静态variables,或者将根据传递的参数返回数据。
class A { int a; int b; public void setParameters(int a, int b){ this.a = a; this.b = b; } public int add(){ return this.a + this.b; } public static returnSum(int s1, int s2){ return (s1 + s2); } }
在上面的例子中,当你调用add()为:
A objA = new A(); objA.setParameters(1,2); //since it is instance method, call it using object objA.add(); // returns 3 B objB = new B(); objB.setParameters(3,2); objB.add(); // returns 5 //calling static method // since it is a class level method, you can call it using class itself A.returnSum(4,6); //returns 10 class B{ int s=8; int t = 8; public addition(int s,int t){ A.returnSum(s,t);//returns 16 } }
在第一个类中,add()将返回由特定对象传递的数据的总和。 但是如果有任何特定的实例或对象,静态方法可以用来从任何类中获得不独立的总和。 因此,对于只需要参数工作的generics方法,可以使其静态以保持干燥。