java的static关键字,分析静态变量和静态方法

静态变量

用static 修饰的变量称为静态变量。

    static String favorite;

favorite 为静态方法

静态方法

用static 修饰的方法称为静态方法。

    public static void fav() {
        System.out.println(favorite);
    }

fav() 为静态方法

静态变量和方法、普通变量和方法之间的区别

静态变量和方法从属于类,普通变量和方法从属于对象。

代码示例1

public class TestStatic {
    String name;
    int age;
    static String favorite;//静态变量favorite

//构造器
    TestStatic(String name ,int age) {
        this.name = name;
        this.age = age;
    }
//  普通方法nam()
    public void nam() {
        System.out.println("我的名字是:"+name);
    }

//  静态方法fav()
    public static void fav() {
        System.out.println("我的爱好是:"+favorite);
    }

    public static void main(String[] args) {
        TestStatic stu = new TestStatic("李四",20);
        stu.nam();
        stu.favorite = "看电影";
        stu.fav();
    }
}

运行结果为:

我的名字是:李四
我的爱好是:看电影

代码示例2

public class TestStatic {
    String name;
    int age;
    String favorite;//普通变量favorite
//构造器
    TestStatic(String name ,int age) {
        this.name = name;
        this.age = age;
    }
//  普通方法nam()
    public void nam() {
        System.out.println("我的名字是:"+name);
    }
//  静态方法ag()
    public static void ag() {
        System.out.println("我的年龄是:"+age);
    }
//  静态方法fav()
    public static void fav() {
        System.out.println("我的爱好是:"+favorite);
    }

    public static void main(String[] args) {
        TestStatic stu = new TestStatic("李四",20);
        stu.nam();
        stu.ag();
        stu.favorite = "看电影";
        stu.fav();
    }
}

运行结果为:

Error:(17, 37) java: 无法从静态上下文中引用非静态 变量 age
Error:(21, 37) java: 无法从静态上下文中引用非静态 变量 favorite

对比结果分析:

代码分析

    static String favorite;//静态变量favorite

变为:

    String favorite;//普通变量favorite

但是静态方法fav()没有 变化

//  静态方法fav()
    public static void fav() {
        System.out.println("我的爱好是:"+favorite);
    }

同时

    int age;//普通变量

//  静态方法ag()
    public static void ag() {
        System.out.println("我的年龄是:"+age);
    }

也是如此

代码里面的 age 和 favorite 是普通变量,属于对象 stu 的。而静态方法 fav() 和 ag() 是属于类的,对象 stu 可以访问类的静态变量、静态方法、字符串常量等。但是通过静态方法、静态变量无法找到对象。可以理解为:类的静态变量、静态方法为对象提供了材料,像盖房子的图纸。通过房子可以找到图纸,但是通过图纸你无法知道是哪一个房子。当然静态方法可以调用静态变量同类型可以相互调用。

内存分配分析

可以先学习我的这一篇文章:java面向对象内存分析–栈和堆,方法区
static内存分析
总结:方法区就像是房子的图纸,对象是根据图纸建造出来的房子,通过图纸不能找到是那一个房子,而通过房子必定能找到图纸。

发布了8 篇原创文章 · 获赞 8 · 访问量 1042

猜你喜欢

转载自blog.csdn.net/dragoned_123/article/details/94965268