static 关键字详解 static方法调用非static属性和方法

  静态的属性和方法在内存中的存放地址与非静态的是不同的,静态的是存放在static区,它意味着静态方法是没有this的,所以我们不可以从一个static方法内部发出对非static方法的调用。但是反之是可以的。

  静态属性被外部公用,修改之后会被保存。

1、static方法没有this,我们通过类名来调用static属性和方法

 1 package demo;
 2 
 3 public class TestStatic {
 4     private static int i = 18;  //静态属性被外部公用,修改之后会被保存。
 5     private String str = "###";  //静态方法不能调用非静态的属性和方法
 6     static void run(){
 7         //TestStatic.i  不在同一个类中通过类名类调用static属性
 8         i = i * 100;
 9         System.out.println("刘二狗在跑了" + i +"步");
10     }
11     
12     static void print(){
13         run();
14         //TestStatic.run();   不在同一个类中通过类名类调用static方法
15         System.out.println("测试static:i = " + i);
16     }
17     
18     public static void main(String[] args) {
19         TestStatic.print();
20     }
21 }

打印结果:

2、static方法调用非static属性和方法。我们把一个对象的句柄放到static方法内部,通过这个对象的句柄就可以调用非static的属性和方法。代码如下:

package demo;
/**
 * static方法调用非static属性和方法
 * @author dyf
 *
 */
public class TestStatic {
    private static int i = 18;
    private String str = "###";
    static TestStatic ts = new TestStatic();
    
    TestStatic test(){
        this.str = str + "===";
        System.out.println(str);
        return this;
    }
    
    static void run(TestStatic ts){
        ts.str = ts.str + "$$$"; //通过句柄调用非static的属性
        ts.test();   //通过句柄调用非static的方法
        System.out.println("刘二狗在跑步!" + ts.str);
    }
    
    public static void main(String[] args) {
        TestStatic.run(ts);
    }
}

打印结果:

原文地址:https://www.cnblogs.com/dyfbk/p/6874096.html