一个类  在定义时就被初始化了的String域,以及别一个通过构造器初始化的String域,这两种方式有什么差异?

解决方案 »

  1.   

    一种是在定义时就被初始化了的String域,另一种是通过构造器初始化的String域
      

  2.   

    class S1{
         // 在定义时就被初始化了的String域,不要这样写
         String s="a";}
    class S2{
        String s;
       //通过构造器初始化的String域
        public S2(String s){
            this.s=s;
        }
        
    }
    public class Test{
     public static void main(String[] args){
      S1 s1=new S1();
      S2 s2=new S2("bbb");
      System.out.println(s1.s);
      System.out.println(s2.s);
     }
    }
    后者可以通过main改变s的值,而前者s的值是写死了的 
      

  3.   

    前者性能高,后者性能低。因为一个常量字符串本身就是一个String,前者只是引用存在的String对象,而后者会创建一个新的String对象。
      

  4.   

    别乱说啊,只要不是private的,都可以直接修改的s1.s = "ffff";
    其实最大的不同就是类的生命周期中初始化的顺序不同。初始化的时间不同。
      

  5.   

    四楼说的:只要不是private的,都可以直接修改的s1.s = "ffff";实际项目中最好不要出现这种类和这种用法。
      

  6.   

    初始化的顺序不同:
    public class Test {
    static {

    }

    {

    }

    private static String s1 = "a";

    private static String s2 = "b";

    public Test() {

    }

    public static void print() {

    }

    public void display() {

    }
    }
      

  7.   

    public class Student {
    String name="tom";
    }public class Test {
      
    String a;
    Student s;public static void main(String[] args) {   test t=new test();
    String a=new String("a");
    t.aa(a);
    System.out.println(t.a);
    a=new String("b");
    System.out.println(t.a)


    a="a";
    t.aa(a);
    System.out.println(t.a);
    a="b";
    System.out.println(t.a");

    Student s=new Student();
    t.ss(s);
    System.out.println(t.s.name);
    s.name="t";
    System.out.println(t.s.name);
    }
    }结果 前4 个 都是  输出  字符串 a后面 2个 tom
    和t
    通常情况先  通过方法传参数 穿的是引用  你所定义的变量 随着 引用 的改变 而改变 这点可以从  最后 2个输出结果看出来 
    前4个 结果说明像 String 这类的数据类型 他转化为了  值类型 
    还是有差别的    要看这么用了  这里面涉及到一个数据的 同步问题     
    我也是个初学者希望能帮到你