在JAVA里面常常可以看见这样写的类,把成员变量设成private static,再把方法设成public static,如下:public class Classname{private static Objct A = null; //这个时候给A分配了堆空间了吗 ?且A可以看成该空间首地址?
private static int B;
    ……
public static FunctionName()
(
     A = ……;
     return A;  //返回的是A地址?
   }}对于以上代码,A被返回,这个时候请问返回的是A的地址吗?
我是这样想的:
如果是,并在定义A的时候给A分配了空间,A可以看成该空间首地址.
设存在另外一个类 otherclass, 里面也定义有一个private static Objct B=null,也给B分配了空间,B可以看成是该空间首地址;当我们让B=Classname.FunctionName()时.B就指向了A的一片堆空间,而自己原来的空间就被系统回收.
请问以上推论正确吗?本人刚学JAVA不知道有什么文章介绍这些,找不着就上来麻烦大家了.如果大家知道有这方面的资料,请大家告诉一下,谢谢!

解决方案 »

  1.   

    你的方法定义有问题,没有设置返回类型,return A是编译不过的
    private static Objct A = null;
    定义一个Object类型的对象引用AA = new Objcet(); 
    开辟内存空间,存储Object对象,并把引用A指向该地址我是这么理解的,有不对的请指教
      

  2.   

    回2楼:
    哦,没有加上返回类型了,给补上,还是原来的问题.
    我现在明白了,应该是这样:
    private static Objct A = null; 
    这句话是不开辟内存的.A只是被编译器记录为一个Objct型变量(编译器应该有这么一张记录表),如果要为它开辟空间,就开辟Objct型所需要的大小.
    B也同理.
    当 运行A = ……;时,编译器给A开辟空间.上面函数返回的是这个空间的地址.
      

  3.   

    但是这样也有问题,那就是如果对otherclass类的B进行操作不就是对classname的A进行操作了吗?
    这样如何做到面向对象好的封装???
      

  4.   

    引用的是同一个对象,大家都可以修改。破坏不破坏是你写的代码的问题,不是java需要保证的。你为什么要让他们共享这个对象呢?
      

  5.   

    请教楼上,“破坏不破坏是你写的代码的问题,不是java需要保证的。你为什么要让他们共享这个对象呢?”
    我举个例子,在做一个简单的数据库连接时,我们经常用下面一段简单的代码://先创建一个与数据库连接的CONNECTION,把它作为一个返回值。
    public class ConnectionDB {
       private static Connection con = null;                                 //Connection con 是static 的
       private static String DriverClass = "oracle.jdbc.driver.OracleDriver";
       private static String url ="jdbc:oracle:thin:@localhost:1521:Oracle";
       private static String user = "scott";
       private static String pwd = "tiger";
       public static Connection getConnection()
       {
       try {
    Class.forName(DriverClass);
    con =DriverManager.getConnection(url,user,pwd);
      
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
        return con;                                               //把这个con返回            
       }
    }那么接下来用一个简单的方法获得这个con并简单使用数据库。public class GetConnection {      private static PreparedStatement pst = null;
          private static ResultSet rs = null;
          private static Connection conn = null;
          private static String sql = "select * from login";
       
          public static String[] gettable()
          {
           conn = ConnectionDB.getConnection();            //此处conn不就是和原来的con指向同一块内存了吗,莫非楼上有好的想法不让它们共
                                                                         享对象?
           try {
    pst = conn.prepareStatement(sql);
    rs = pst.executeQuery();
    while(rs.next())
    {
                                 在这里做你爱做的事情;
    }
    rs.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return col;
           
          }
          
    }
      

  6.   

    关键是看下栈堆原理,基本类型,引用类型,String类,StringBuffer类
    都有自己的特点,最好自己研究下,那么这个问题就是小case了
      

  7.   


    不是static的不就不共享了么... connection怎么能共享呢
      

  8.   

    static 的方法只能调用static变量,所以Connection con 是static 的。如果把Connection con 放到方法内声明,那返回的时候就是该变量的生存周期结束了,可能返回是一个未知值。所以我把connection con声明成static的了。
      

  9.   

    回楼上“不是static的不就不共享了么... connection怎么能共享呢”
    static方法只能使用static变量。不把Connection con 声明为是static的,也行,把它的声明放方法体里。那样的话它的生存周期就在返回时就结束了,返回的值就可能是个未知值。
    呵呵,本来该结束了,还看看有人怎么说。 
      

  10.   

    我觉得你应该保证对连接对象的互斥访问,不然会出问题的。
    要不你可以不把连接对象设为static,每个对象都有一个连接对象,就不会有问题了,但是这似乎又
    浪费了资源。