有下面4个java类,C继承B,B继承A
用D.java来创建实例C,然后设置setJcPortList  
问题是:这样做的话会不会产生jcPortList会被别的实例而更改?
我用下面的测试不会发生更改,但我真正的项目中,逻辑和这是一模一样的
,但出现了jcPortList被更改的情况??那是为什么呢?有的时候就变成了size=0了import java.util.ArrayList;
import java.util.List;
public class A
{
 List   jcPortList=null;
 final  List getJcPortList()
 {
  return jcPortList;
 }
 final  void setJcPortList(List jcPortList)
 {
  this.jcPortList=jcPortList;
 }
 public void startTest()//用于派生类发动测试
 { }
}
public class B extends A
{
}
import java.util.ArrayList;
import java.util.List;
public class C extends B
{
// private   List jcPortList=null;
 public void startTest()
 {
  try
  {
//   jcPortList=getJcPortList();
   System.out.println("-------");
   if(jcPortList!=null)
   {
    int i=0;
    while(i<=50)
    {
    System.out.println(jcPortList.size());
    i++;
    }
   }
  }
  catch(Exception e){}
 }}
import java.util.ArrayList;
import java.util.List;
public class D
{
public static void main(String []args)
{
 for(int i=1;i<20;i++)
 {
  List list=new ArrayList();
  A   a=null;
  for(int u=0;u<i;u++)
  {
   list.add("123456");
  }
  try
  {
  a    = (A)Class.forName("C").newInstance();
  a.setJcPortList(list);
  a.startTest();
  }
  catch(Exception e){System.out.println(e);}
 }
}

解决方案 »

  1.   

    java运行在Web容器中的时候,类的创建时由容器完成的,而且不同的Web容器创建类的方式不一样。如果你配置了Spring 又是一个样子。你上边的代码太乱了,实在没心思看,如果你很像深入了解,从新组织下代码,让大家看看吧。
      

  2.   

    操作 这个 List是不是在别人代码(类)里?
    如果想控制 List中不能增删的话,可以使用Collections.unModifyList方法生成一个不可增删的List
    如果是想控制List中某个元素不能修改的话,那只能通过在那元素中设置一个标志来处理了
      

  3.   

    感觉应该是Web容器的问题 !!!好比一台电脑的JVM与另一台电脑的JVM都有class.forName("a")他们可不是equal的哦
      

  4.   

    jcPortList是一个堆中对象,随便哪个引用都能改他的值。
    LZ所说的应该是多个对象中存在jcPortList的引用。这样就会出现多实例同时操作jcPortList的值。
      

  5.   

    我用别的方法把这个问题给避开了.. 让下面的各实例自己去得自己的list,这样就避免了这个错误 呵多谢大家