首页 > 试题广场 >

以下表达式中值为true的是?()

[单选题]
定义如下程序:
public class Student{
   public String name;
   public Student(String name){
       this.name = name;
   }
}
public class Test implements Cloneable{
   	public Student st;
        public static void main(String[] args){
     		Student  s1 = new Student(“Tom”);
                Test t1 = new Test();
                t1.st = s1;
                Test t2 = (Test) t1.clone();
        }
}
以下表达式中值为true的是?()
  • t1 == t2
  • t1.equals(t2)
  • t1.st != t2.st
  • t1.st.equals(t2.st)
t1 == t2 比较的是地址 因为克隆之后,复制出了一个新的对象 所以不对
t1.equals(t2)  并没有重写equals所以与==相同,比较的是地址
因为是浅复制,只是复制了t1本身,对于t1的引用s1并没有进行复制,所以t1.s1与t2.s1指向的是同一个s1

编辑于 2017-12-26 08:17:12 回复(0)

浅拷贝:只拷贝基本类型和String,不拷贝引用的对象

public class person implements Cloneable{//浅拷贝的类型
    String name;
    Address address;//引用的Address对象不拷贝
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();//没有重写,只是用了原来的实现,仍然是浅拷贝
    }
}

深拷贝:基本类型+引用的对象都拷贝一份

本题是浅拷贝,深拷贝需要在implement cloneable的基础上并重写 protected Object clone()
T1的成员变量st指向student对象,T2的st也指向了 同一 student对象
没重写的equals()和==都是比较内存地址, T2对象是开辟空间创建的新对象,当然和T1的内存地址不同,A、B错。T1、T2的 st 都是指向同一student对象,内存地址一样,D对

发表于 2020-02-27 21:01:01 回复(0)
因为是浅复制,所以引用并未被复制。
发表于 2018-09-06 16:12:50 回复(0)
Test t2 = (Test) t1.clone()//会克隆出一个新的对象赋给t2
但是他们的st都是指向TOM
编辑于 2018-04-07 10:29:25 回复(0)
原型模式克隆,把需要克隆的对象的引用给新对象,即浅克隆,简单数据类型是值克隆,对象是引用克隆
发表于 2017-12-12 20:52:30 回复(1)