关于Clone 的方法使用

本文详细介绍了Java中对象克隆的实现方式,包括浅拷贝和深拷贝的区别及应用场景。通过具体示例展示了如何为一个包含引用类型的类实现深拷贝。

package cn.hncu.day7.clone.v1;
//克隆的套路:
// 第1步:重写User类的clone()方法,以供外面调用。因为外面的类无法直接调用User类父类中的clone()方法--protected
// 第2步:让User类实现Cloneable接口,否则clone时会抛出异常
// 第3步:在需要进行克隆的其它类中调用:User u2 = (User)user.clone()

//一个类的对象要想能够被clone,那么该类必须要实现Cloneable接口,否则clone时会抛出异常
public class User implements Cloneable{
private String name;
private int age;

public User(String name, int age) {
super();
this.name = name;
this.age = age;
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}

}

--------------------------------------------------

package cn.hncu.day7.clone.v1;

public class CloneDemo {

public static void main(String[] args) {
User user = new User("Jack",23);
System.out.println(user);

try {
User user2 = (User)user.clone();//该clone()方法必须是User类自己的,不能调用它的父类Object中的clone()方法,因为权限是protected--只有user对象自己克(在User类中能够调用它的clone)
user2.setAge(100);
System.out.println(user2);
System.out.println(user);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}

-------------------------------------------------------------

package cn.hncu.day7.clone.v2;

public class User implements Cloneable{
private String name;
private int age;

public User(String name, int age) {
super();
this.name = name;
this.age = age;
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}

}

----------------------------------------------------------------------

package cn.hncu.day7.clone.v2;
//该v2版本是有问题的---浅拷贝问题
//※※注意,简单的clone是浅拷贝,如果对象当中的成员变量是引用类型,那么这样的变量是捆绑的--克隆体和原型对象

public class Account implements Cloneable{
private User user;// 账户对应的用户
private double balance;// 余额

public Account(User user, double balance) {
super();
this.user = user;
this.balance = balance;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public double getBalance() {
return balance;
}

public void setBalance(double balance) {
this.balance = balance;
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

@Override
public String toString() {
return "Account [user=" + user + ", balance=" + balance + "]";
}

}

-------------------------------------------------------------------------------------------

package cn.hncu.day7.clone.v2;

public class CloneDemo {

public static void main(String[] args) {
User user = new User("Jack",23);
Account account = new Account(user, 100);
System.out.println(account);
try {
Account account2 = (Account)account.clone();
account2.setBalance(200);
account2.getUser().setName("Tom");
System.out.println(account2);
System.out.println(account);

} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}

-----------------------------------------------------------------------

package cn.hncu.day7.clone.v3;

public class User implements Cloneable{
private String name;
private int age;

public User(String name, int age) {
super();
this.name = name;
this.age = age;
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}

}

---------------------------------

package cn.hncu.day7.clone.v3;
//相比v2版本,我们解决浅拷贝问题就是修改这一个类.
//※※如果一个类中的变量都是primitive(基本数据类型或final型的引用类型),重写的克隆方法直接调用super.clone()就OK
//※※如果一个类中含有引用变量,那么克隆方法就如这个类所写---把浅copy的引用指向原型对象新的克隆体。

public class Account implements Cloneable{
private User user;// 账户对应的用户
private double balance;// 余额

public Account(User user, double balance) {
super();
this.user = user;
this.balance = balance;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
@Override//深克隆
public Object clone() throws CloneNotSupportedException {
Account a =(Account) super.clone();

if(user!=null){
//※※把浅copy的引用指向原型对象新的克隆体。
a.user =(User)user.clone();
}
return a;
}

@Override
public String toString() {
return "Account [user=" + user + ", balance=" + balance + "]";
}

}

-------------------------------------------

package cn.hncu.day7.clone.v3;

public class CloneDemo {

public static void main(String[] args) {
User user = new User("Jack",23);
Account account = new Account(user, 100);
System.out.println(account);
try {
Account account2 = (Account)account.clone();
account2.setBalance(200);
account2.getUser().setName("Tom");
System.out.println(account2);
System.out.println(account);

} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}

转载于:https://www.cnblogs.com/1314wamm/p/5600192.html

### 如何在 VSCode 中使用 Git Clone 功能 为了通过 Visual Studio Code (VS Code) 使用 `Git Clone` 功能,可以按照以下方法操作。此过程适用于从 GitHub 或其他远程存储库克隆项目到本地环境。 #### 方法一:通过命令面板执行 Git Clone 可以通过内置的命令面板来启动 `Git: Clone` 命令。按下快捷键 `Ctrl+Shift+P`(Windows/Linux)或 `Cmd+Shift+P`(Mac),打开命令面板并输入 `Git: Clone`[^1]。随后会提示输入要克隆的仓库 URL 地址。完成地址填写后,选择目标文件夹用于保存克隆下来的代码。一旦成功克隆,VS Code 将自动打开该文件夹以便进一步编辑和开发工作。 #### 方法二:利用源控制视图中的按钮 另一种方式是在左侧活动栏找到“源代码管理”图标(通常显示为分支标志)。点击进入源控件界面,在顶部应该能看到一个名为 “Clone Repository” 的按钮。点击它之后同样需要提供仓库链接以及指定存放路径,最后确认即可实现复制远端资源至本机硬盘上。 需要注意的是,如果尝试从私有性质或者受保护较高的平台获取数据,则可能被要求验证身份认证信息以继续流程。对于非GitHub类别的服务提供商而言,只需手动录入完整的HTTP(S)/SSH形式URL地址再配合上述任一步骤便能达成目的。 另外值得注意的一点是关于子目录单独clone的情况目前官方并不支持直接这样做的选项因为这涉及到客户端副本完整性的保障问题除非特别关注相关话题比如"Sparse Checkout"等功能讨论或许未来会有改变但现在还是建议整个repository一起下载处理比较好一些[^2]。 以下是简单的Python脚本来模拟基本的git clone行为作为补充说明: ```python import os def git_clone(repo_url, destination_folder): try: result = os.system(f'git clone {repo_url} {destination_folder}') if result != 0: raise Exception('Failed to run git clone') except Exception as e: print(e) # Example usage git_clone('https://github.com/example/repo.git', './local-repo') ``` 以上就是有关于怎样运用Visual Studio Code里的Git Clone特性的解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值