📜  Java中的静态方法与实例方法

📅  最后修改于: 2020-03-20 00:58:10             🧑  作者: Mango

实例方法

实例方法是需要先创建其类的对象才能调用的方法。要调用实例方法,我们必须创建在其内定义该类的Object。

public void mango(String name)
{
 // 要执行的代码....
}
// 返回类型可以使int, float String或其他数据类型.

内存分配: 这些方法本身存储在堆的永久生成空间中,但是参数(传递给它们的参数)及其局部变量和要返回的值在堆栈中分配。可以在它们所驻留的同一类中调用,也可以在同一包或其他包中定义的不同类中调用它们,具体取决于提供给所需实例方法的访问类型

重要事项:

  • 实例方法属于类的对象,而不属于类,即可以在创建类的对象后调用它们。
  • 从类创建的每个单独的Object均具有该类的实例方法的自己的副本。
  • 即使使用虚拟方法,实例方法也不是按实例存储的。它们存储在单个内存位置,并且它们仅“知道”它们属于哪个对象,因为在调用它们时会传递此指针。
  • 由于可以在运行时使用动态绑定来解决它们,因此可以重写它们。
    // Java展示实例方法的例子.
    import java.io.*;
    class Foo{
        String name = "";
        // Instance method to be called within the same class or
        // from a another class defined in the same package
        // or in different package.
        public void mango(String name){
            this.name = name;
        }
    }
    class GFG {
        public static void main (String[] args) {
            // create an instance of the class.
            Foo ob = new Foo();
            // 调用实例方法.
            ob.mango("芒果文档");
            System.out.println(ob.name);
        }
    }

    输出:

    芒果文档

静态方法

静态方法是Java中可以在不创建类对象的情况下调用的方法。它们由类名称本身或对该类的对象的引用来引用。

public static void mango(String name)
{
 // 方法的代码....
}
// 必须有static关键字.
// 返回类型可以使int, float String或其他数据类型.

内存分配:它们存储在堆的永久生成空间中,因为它们与它们所在的类相关联,而不与该类的对象相关联。但是它们的局部变量和传递给它们的参数存储在堆栈中。由于它们属于该类,因此可以在不创建该类的对象的情况下调用它们。

重要事项:

  • 静态方法与它们所驻留的类相关联,即,即使不创建类的实例(即ClassName.methodName(args)),也可以调用它们。
  • 设计它们的目的是要在同一类创建的所有对象之间共享。
  • 静态方法不能被重写。但是可以重载,因为它们是在编译时由编译器使用静态绑定来解决的。
    // 实例展示静态方法.
    import java.io.*;
    class mango{
        public static String mangoName = "";
        public static void mango(String name){
            mangoName = name;
        }
    }
    class GFG {
        public static void main (String[] args) {
            // 访问静态方法
            mango.mango("芒果文档");
            System.out.println(mango.mangoName);
           
            mango obj = new mango();
            obj.mango("棒极了");
            System.out.println(obj.mangoName);
        }
    }

    输出:

    芒果文档
    棒极了

    注意:类中定义的静态变量及其值存储在PermGen内存空间中。
    如果静态变量引用一个对象怎么办?

    static int i = 1;
    static Object obj = new Object();

    在第一行中,值1将存储在PermGen中。在第二行中,引用obj将存储在PermGen中,其引用的对象将存储在堆节中。


    什么时候使用静态方法

    • 当您具有可以在同一类的所有实例之间共享的代码时,请将那部分代码放入静态方法中。
    • 它们基本上用于访问类的静态字段。

     实例方法与静态方法

    • 实例方法可以直接访问实例方法和实例变量。
    • 实例方法可以直接访问静态变量和静态方法。
    • 静态方法可以直接访问静态变量和静态方法。
    • 静态方法不能直接访问实例方法和实例变量。他们必须使用对对象的引用。静态方法不能使用this关键字,因为没有实例可以引用“ this“。