静态方法和实例方法之间的区别

时间:2012-08-16 18:15:22

标签: java static static-methods non-static

我只是在阅读教科书中给我的文字,我不确定我是否理解它的含义。它基本上告诉我静态方法或类方法包含“modifier”关键字static。但我真的不知道这意味着什么?

有人可以用非常简单的术语向我解释静态或类别方法是什么吗?

另外,我可以获得一个关于实例方法的简单解释吗?

这是他们在教科书中给我的:

  

静态修饰符的存在与否存在重要的实际意义。只要Java处理它所属的类的定义,就可以调用并执行公共类方法。实例方法不是这种情况。在可以调用和执行公共实例方法之前,必须创建它所属的类的实例。要使用公共类方法,您只需要该类。另一方面,在使用公共实例方法之前,您必须拥有该类的实例。

     

在另一个方法的定义中调用静态方法的方式根据两个方法是否属于同一个类而不同。在上面的示例中,factorial和main都是MainClass类的方法。因此,在main的定义中调用factorial只是引用方法名称“factorial”。

10 个答案:

答案 0 :(得分:130)

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

在更深层次上,当编译器将类放在一起时,它包含几个指向方法的指针。当执行这些方法时,它遵循指针并执行远端的代码。如果实例化了类,则创建的对象包含指向“虚方法表”的指针,该指针指向要在继承层次结构中为该特定类调用的方法。但是,如果方法是静态的,则不需要“虚方法表”:对该方法的所有调用都会到达内存中完全相同的位置以执行完全相同的代码。因此,在高性能系统中,如果不依赖实例变量,最好使用静态方法。

答案 1 :(得分:15)

未声明为static的方法和变量称为实例方法和实例变量。要引用实例方法和变量,必须首先实例化该类,首先意味着您应该首先创建该类的对象。对于静态,您不需要实例化该类,您可以使用类名访问方法和变量期间标志在(。)

例如:

Person.staticMethod();           //accessing static method.

对于非静态方法,您必须实例化该类。

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.

答案 2 :(得分:7)

静态方法,变量属于整个类,而不仅仅是一个对象实例。静态方法,变量与类作为一个整体相关联,而不是与类的特定实例相关联。每个对象将共享静态方法,变量的公共副本。每个类只有一个副本,无论从中创建多少个对象。

答案 3 :(得分:4)

实例方法 =>在特定类的特定实例上调用。方法想要知道它被调用的类。它发生的方式是一个名为'this'的不可见参数。在'this'中,我们已经为实例类的成员设置了值。 '这'不是变量。它是一个值,您无法更改它,值是对调用接收方的引用。 例如:您致电修理工(实例方法)来修复您的电视(实际节目)。他带有工具('this'参数)。他带有修理电视所需的特定工具,他也可以修复其他东西。

静态方法 =>没有'这个'这样的东西。 Ex:同一个修理工(静态方法)。当你打电话给他时,你必须指定要打电话给哪个修理工(比如电工)。他会来修理你的电视。但是,他没有工具来修复其他东西(没有'this'参数)。

静态方法通常对不需要来自类实例(来自'this')的任何数据的操作有用,并且可以仅使用其参数执行其预期目的。

答案 4 :(得分:4)

静态方法和实例方法之间的区别

  1. 实例方法是在可以调用之前需要创建其类对象的方法。静态方法是Java中的方法,可以在不创建类对象的情况下调用它。

  2. 使用static关键字声明静态方法。实例方法不是静态关键字。

  3. 静态方法表示将作为类的单个副本存在。但实例方法作为多个副本存在,具体取决于为该类创建的实例数。

  4. 可以使用类引用调用静态方法。使用对象引用调用实例或非静态方法。

  5. 静态方法无法直接访问实例方法和实例变量。 Instance方法可以直接访问静态变量和静态方法。

  6. 参考:geeksforgeeks

答案 5 :(得分:2)

简而言之,静态方法和静态变量是类级别,其中实例方法和实例变量是实例或对象级别。

这意味着无论何时创建实例或对象(使用新的ClassName()),此对象都将保留自己的instace变量副本。如果您有五个不同的同类对象,则您将拥有五个不同的实例变量副本。但是静态变量和方法对于所有这五个对象都是相同的。如果你需要创建每个对象使用的常见内容,请将其设置为静态。如果您需要一种不需要特定于对象特定数据的方法,请将其设置为静态。静态方法仅适用于静态变量,或者将根据传递的参数返回数据。

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()将返回特定对象传递的数据总和。但是静态方法可用于从任何类中获取总和,如果任何特定实例或对象,则不是独立的。因此,对于只需要工作参数的泛型方法,可以将其设置为静态以使其全部保持干燥状态。

答案 6 :(得分:1)

对象的行为取决于该类的变量和方法。当我们创建一个类时,我们为它创建一个对象。对于静态方法,我们不要求它们作为静态方法意味着所有对象都具有相同的副本,因此不需要对象。 e.g:

Myclass.get();

在实例方法中,每个对象都有不同的行为,因此必须使用对象实例调用该方法。 e.g:

Myclass x = new Myclass();
x.get();

答案 7 :(得分:0)

实例方法与静态方法

  1. 实例方法可以访问实例方法和实例 变量。

  2. 实例方法可以访问静态变量和静态方法     直接。

  3. 静态方法可以访问静态变量和静态方法     直接。

  4. 静态方法无法访问实例方法和实例变量     直。他们必须使用对对象的引用。而且静态方法不能     请使用此关键字,因为没有实例可以引用“ this”。

答案 8 :(得分:0)

静态方法与实例方法

构造函数:

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 ! ');
    }
}

答案 9 :(得分:-2)

放置在函数前面的static修饰符意味着只存在该函数的一个副本。如果静态修饰符未放置在函数前面,那么对于该类的每个对象或实例,都会生成该函数的新副本。 :) 变量也是如此。