本来我对static没有疑问,但是看了Thinking in java中5.4.2节中有这样一个话“在static方法的内部不能调用非静态方法”,这也没什么疑问,但是这句话有个注释:“这不是完全不可能。如果你传递一个对象的引用到静态方法里(静态方法可以创建其自身对象),然后通过这个引用(和this效果相同),你就可以调用非静态方法和访问非静态数据成员了。”请各位大牛为小弟解惑啊,如果能编个实际的例子说明注释的问题就更好了,小弟先拜谢了!!

解决方案 »

  1.   

    static methodA(ClassD d) {
    d.methodDa();
    }
      

  2.   

    也就是换一种方式呗 既然不能够调用静态方法 那就用对象调用属于他的方法 
    shi_crow是正解!
      

  3.   

    当然可以的
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append("A");
        staticMethod(sb);
    }public static String staticMethod(StringBuilder sb){
        sb.append(" append in static Method");
        return sb.toString();
    }
      

  4.   

    public class TestStatic {
    static int intStaticValue = 1;
    int intNonStaticValue = 2;

    public static void displayInt(int number){
    System.out.println(number);
    }

    public static void main(String args[]){
    displayInt(intStaticValue);//静态方法引用静态属性
    //displayInt(intNonStaticValue);//静态方法不能直接引用非静态属性
    displayInt(new TestStatic().intNonStaticValue);//通过实例化对象引用非静态属性
    }
    }
      

  5.   

    Class A{
      public static void test(A a){
        
         System.out.println("str");
         a.test(5); // 这个可以通过编译
             test(5);//这个是静态方法调用非静态方法,所以这个同不过编译
        
        }
        
       public  void test(Integer in){
        
         System.out.println("in");
        
        }}
     
      

  6.   

    这句话的意思是我们不能在static方法内直接调用其他非静态方法,但是可以通过已经存在的对象的实例引用去调用这个非静态方法!
      

  7.   

    恩,static方法不能直接调用非静态方法,因为static方法是属于类的,而非静态方法是属于对象的,对象个数是不固定的,所以他无法确定调用哪个对象的方法,如果把该对象的实列也传进去,确定了哪个对象就可以调用这个对象的方法了。
      

  8.   

    static methodA(ClassD d) { 
    d.methodDa(); 
    }
    ____________
    支持,简单明了
      

  9.   

    谢谢大家,尤其谢谢shi_crow ,justinavril这两位热心朋友,谢谢了,
      

  10.   

    Java code
     
    public class TestStatic {
        static int intStaticValue = 1;
        int intNonStaticValue = 2;
        
        public static void displayInt(TestStatic a){
            System.out.println(intStaticValue);//静态方法内部引用静态属性
            //System.out.println(intNonStaticValue);静态方法内部不能引用非静态属性,因此不能通过编译
            
            a.testA();//通过对象引用调用非静态方法
        }
        public static void displayInt(int number){
         System.out.println(number);    }
        public void testA(){
         System.out.println("非静态方法testA被调用了");
        }
        public void testB(){
         System.out.println("testB开始了:");
         displayInt(intStaticValue);//非静态方法内部调用静态方法
        }    
        
        public static void main(String args[]){
            displayInt(intStaticValue);//静态方法引用静态属性
            //displayInt(intNonStaticValue);//静态方法不能直接引用非静态属性
            displayInt(new TestStatic().intNonStaticValue);//通过实例化对象引用非静态属性
            TestStatic b=new TestStatic();
            displayInt(b);
            displayInt(new TestStatic());//通过实例化对象引用非静态属性
            b.testB();
        }
    }