静态的属性和方法在内存中的存放地址与非静态的是不一样的,静态的是存放在static区,它意味着静态方法是没有this的,因此咱们不能够从一个static方法内部发出对非static方法的调用。可是反之是能够的。测试
静态属性被外部公用,修改以后会被保存。this
一、static方法没有this,咱们经过类名来调用static属性和方法spa
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 }
打印结果:code
二、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); } }
打印结果:blog