静态的属性和方法在内存中的存放地址与非静态的是不同的,静态的是存放在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); } }
打印结果: