静态函数和非静态函数的区别(静态方法和非静态方法)

来源:互联网 发布:mysql insert select 编辑:程序博客网 时间:2024/05/17 05:06

首先,静态函数只有当程序结束的时候才从内存消失,生命周期长。而非静态则是动态加载到内存,不需要的时候就从内存消失。

而调用类中的静态函数,无需创建对象就可以调用了,因为当类初始化的时候,就已经加载了静态函数,所以静态函数要比对象加载的早,对象只有被创建的时候才会在堆内存中创建空间。

  另外,静态函数中不能使用非静态变量,静态方法不可以定义this,super关键字(因为静态比对象先加载,而this必须首先加载,所以导致冲突,不能使用);非静态函数可以访问静态变量。


  最后呢,说明一下创建对象的加载。

  A a = new B();

1:B.class 加载进方法区

      2:堆内存开辟空间,实例变量进行默认初始化,显示初始化。

      3:内存地址传给变量a,栈和堆建立连接


静态函数和非静态函数的使用Demo

public class PersonDemo {    public static void main(String[] args) {       // 访问静态成员       // 直接通过类名来调用       String country = Person.country;       System.out.println(country);       // 通过对象.成员的形式访问       Person p1 = new Person("jack", 20, "男");       p1.country = "US";       p1.speak();    }}class Person {    String name;    int age;    String gender;    // static 修饰成员变量    static String country = "CN";    static {       System.out.println("这是静态代码块");    }    {       System.out.println("这是构造代码块");    }    Person() {       System.out.println("无参数构造");    }    Person(String name, int age, String gender) {       this.name = name;       this.age = age;       this.gender = gender;       System.out.println(" 有参数构造");    }    // 非静态方法    void speak() {       // 非静态方法可以访问静态成员       System.out.println("国籍:" + country);       System.out.println("国籍:" + country + " 姓名:" + name + " 性别:" + gender + " 年龄:" + age + " 哈哈!!!");       // 非静态方法可以调用静态方法。       run();    }    // 静态方法    static void run() {       // 静态方法只能访问静态成员变量。       System.out.println("国籍:" + country);    }}