静态方法和实例方法的区别
Posted
技术标签:
【中文标题】静态方法和实例方法的区别【英文标题】:Difference between Static methods and Instance methods 【发布时间】:2012-08-13 03:38:21 【问题描述】:我只是在阅读教科书中给我的文字,我不确定我是否理解它在说什么。它基本上告诉我静态方法或类方法包括“修饰符”关键字静态。但我真的不知道这是什么意思?
谁能用非常简单的术语向我解释一下什么是静态或类方法?
另外,我能简单解释一下什么是实例方法吗?
这是他们在教科书中给我的:
静态修饰符的存在与否具有重要的实际意义。一旦 Java 处理了它所属的类的定义,就可以调用和执行公共类方法。实例方法并非如此。在调用和执行公共实例方法之前,必须为其所属的类创建一个实例。要使用公共类方法,您只需要该类。另一方面,在使用公共实例方法之前,您必须拥有该类的实例。
在另一个方法的定义中调用静态方法的方式根据两个方法是否属于同一个类而有所不同。在上面的例子中,factorial 和 main 都是 MainClass 类的方法。因此,在 main 的定义中调用 factorial 只是引用了方法名称“factorial”。
【问题讨论】:
【参考方案1】:Java 的基本范式是编写类,然后实例化这些类。实例化的对象(类的实例)具有与它们相关联的属性(成员变量),这些属性会影响它们的行为;当实例执行其方法时,它将引用这些变量。
但是,特定类型的所有对象可能具有完全不依赖于成员变量的行为;这些方法最好是静态的。由于是静态的,因此不需要类的实例来运行该方法。
你可以这样做来执行一个静态方法:
MyClass.staticMethod(); // Simply refers to the class's static code
但是要执行一个非静态方法,你必须这样做:
MyClass obj = new MyClass(); //Create an instance
obj.nonstaticMethod(); // Refer to the instance's class's code
在更深层次上,编译器在将一个类放在一起时,会收集指向方法的指针并将它们附加到该类。当这些方法被执行时,它会跟随指针并在远端执行代码。如果实例化了一个类,则创建的对象包含一个指向“虚拟方法表”的指针,该指针指向继承层次结构中该特定类要调用的方法。但是,如果方法是静态的,则不需要“虚拟方法表”:对该方法的所有调用都会转到内存中完全相同的位置以执行完全相同的代码。因此,在高性能系统中,如果您不依赖实例变量,最好使用静态方法。
【讨论】:
非常感谢他们看起来很熟悉的代码示例,所以我现在明白了 @Rohan 另一种看待它的好方法是static
(类、方法或字段)并不真正属于任何东西,它只是出于组织目的而挂在类中.
此外,静态字段被用作数据对象(一个保存数据的对象,因此不能更改,但您可以在其中操作数据。)。静态方法只能在静态字段上调用,此后携带保持不变或不改变或不实例化的相同概念!
@user2416728 你的评论很混乱。静态字段可以更改,但它们的范围对其执行环境是全局的。因此,可以访问所述字段的任何代码都可以访问相同的数据。这不等于数据保持不变(除非使用“最终”修饰符)。
aye,"not change" >> 我的意思是不能实例化!!【参考方案2】:
未声明为静态的方法和变量称为实例方法和实例变量。要引用实例方法和变量,您必须先实例化该类,这意味着您应该首先创建该类的对象。对于静态您不需要实例化类,您可以使用句号访问具有类名的方法和变量这是在 (.)
例如:
Person.staticMethod(); //accessing static method.
对于非静态方法,您必须实例化该类。
Person person1 = new Person(); //instantiating
person1.nonStaticMethod(); //accessing non-static method.
【讨论】:
【参考方案3】:静态方法和实例方法的区别
实例方法是需要在调用它之前创建其类的对象的方法。静态方法是Java中无需创建类对象即可调用的方法。
静态方法是用 static 关键字声明的。实例方法没有静态关键字。
静态方法意味着它将作为一个类的单个副本存在。但是实例方法存在多个副本,具体取决于为该类创建的实例数量。
可以使用类引用来调用静态方法。通过使用对象引用来调用实例或非静态方法。
静态方法不能直接访问实例方法和实例变量。实例方法可以直接访问静态变量和静态方法。
参考:geeksforgeeks
【讨论】:
【参考方案4】:静态方法,变量属于整个类,而不仅仅是一个对象实例。静态方法,变量与整个类相关联,而不是与类的特定实例相关联。每个对象将共享静态方法、变量的公共副本。无论从中创建多少对象,每个类都只有一个副本。
【讨论】:
【参考方案5】:实例方法 => 在特定类的特定实例上调用。方法想知道它是在哪个类上调用的。它发生的方式有一个名为“this”的不可见参数。在“this”内部,我们已经为实例类的成员设置了值。 “这”不是一个变量。这是一个值,您无法更改它,并且该值是对呼叫接收者的引用。 例如:你打电话给修理工(实例方法)来修理你的电视(实际节目)。他带有工具('this'参数)。他配备了修理电视所需的特定工具,他还可以修理其他东西。
在静态方法 =>中没有'this'这样的东西。 例如: 同一个修理工(静态方法)。当你打电话给他时,你必须指定要打电话给哪个修理工(比如电工)。他只会来修你的电视。但是,他没有修复其他东西的工具(没有“this”参数)。
静态方法通常适用于不需要来自类实例(来自“this”)的任何数据并且可以仅使用其参数执行其预期目的的操作。
【讨论】:
【参考方案6】:简而言之,静态方法和静态变量是类级别,而实例方法和实例变量是实例或对象级别。
这意味着无论何时创建实例或对象(使用 new ClassName()),该对象都将保留其自己的实例变量副本。如果您有五个相同类的不同对象,您将有五个不同的实例变量副本。但是所有这五个对象的静态变量和方法都是相同的。如果您需要创建的每个对象都使用一些通用的东西,请将其设为静态。如果您需要一种不需要特定于对象的数据来工作的方法,请将其设为静态。静态方法仅适用于静态变量或将根据传递的参数返回数据。
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() 将返回特定对象传递的数据总和。但是静态方法可用于从任何不独立的类(如果有任何特定实例或对象)中获取总和。因此,对于只需要参数才能工作的泛型方法,可以将其设为静态以使其保持 DRY。
【讨论】:
【参考方案7】:如果一个方法的状态不应该改变或者它不会使用任何实例变量。
你想在没有实例的情况下调用方法。
如果它只适用于提供给它的参数。
实用程序函数是静态方法的良好实例。即 math.pow(),这个函数不会改变不同值的状态。所以它是静态的。
【讨论】:
【参考方案8】:对象的行为取决于该类的变量和方法。当我们创建一个类时,我们为它创建一个对象。对于静态方法,我们不需要它们,因为静态方法意味着所有对象都将具有相同的副本,因此不需要对象。 例如:
Myclass.get();
在实例方法中,每个对象都会有不同的行为,因此它们必须使用对象实例调用方法。 例如:
Myclass x = new Myclass();
x.get();
【讨论】:
【参考方案9】:实例方法与静态方法
实例方法可以访问实例方法和实例 直接变量。
实例方法可以访问静态变量和静态方法 直接。
静态方法可以访问静态变量和静态方法 直接。
静态方法不能访问实例方法和实例变量 直接地。他们必须使用对对象的引用。而静态方法不能 使用 this 关键字,因为没有“this”可以引用的实例。
【讨论】:
【参考方案10】:静态方法与实例方法
构造函数:
const Person = function (birthYear)
this.birthYear = birthYear;
实例方法 -> 可用
Person.prototype.calcAge = function ()
2037 - this.birthYear);
静态方法 -> 不可用
Person.hey = function()
console.log('Hey')
类:
class PersonCl
constructor(birthYear)
this.birthYear = birthYear;
/**
* Instance Method -> Available to instances
*/
calcAge()
console.log(2037 - this.birthYear);
/**
* Static method -> Not available to instances
*/
static hey()
console.log('Static HEY ! ');
【讨论】:
【参考方案11】:放置在函数前面的 static 修饰符意味着该函数只存在一个副本。如果静态修饰符没有放在函数前面,那么对于该类的每个对象或实例,都会生成该函数的新副本。 :) 变量也是如此。
【讨论】:
以上是关于静态方法和实例方法的区别的主要内容,如果未能解决你的问题,请参考以下文章