创建对象的三种方式

本文介绍了Java中创建对象的三种方式,包括使用new关键字、实现Cloneable接口进行浅拷贝和深拷贝,以及通过构造方法创建对象。详细解释了Cloneable接口作为标志接口的作用,以及如何实现对象的浅拷贝和深拷贝。同时,探讨了Java内存中的对象复制和字符串存储机制。
摘要由CSDN通过智能技术生成

目录

创建对象的方式:

1.new

2.cloneable接口(是一个空接口):为啥是一个空接口,有啥作用?

3.调用构造方法构造对象

包:是一组类的集合,import语句能导入包下的类

先执行静态代码块,再执行实例代码块,最后执行构造方法 


创建对象的方式:

1.new

2.cloneable接口(是一个空接口):为啥是一个空接口,有啥作用?

空接口也叫标志接口,代表当前的类是可以被克隆的

克隆方法需要 ①处理异常,②重写克隆方法  

public class textdemo2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1=new Person(10);
        person1.age=9;
        Person person2= (Person) person1.clone();
        person2.age=199;
    }
}

class Person implements Cloneable{
    public int age;
    public void eat(){
        System.out.println("吃");
    }

    public Person(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                '}';
    }

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

 这种情况是浅拷贝:

public class textdemo2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1=new Person();
        System.out.println(person1.money.m);
        Person person2= (Person) person1.clone();
        System.out.println(person2.money.m);
    }
}

class Money{
    public int m=10;
}

class Person implements Cloneable{
    public int age;
    public String name;
    public Money money=new Money();
    public void eat(){
        System.out.println("吃");
    }


    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", m=" + money +
                '}';
    }

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


这样做是深拷贝:

public class textdemo2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1=new Person();
        System.out.println(person1.money.m);
        Person person2= (Person) person1.clone();
        System.out.println(person2.money.m);
    }
}

class Money implements Cloneable{
    public int m=10;

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

class Person implements Cloneable{
    public int age;
    public String name;
    public Money money=new Money();
    public void eat(){
        System.out.println("吃");
    }


    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", m=" + money +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person tmp=(Person) super.clone();
        tmp.money=(Money) this.money.clone();
        return tmp;
        //return super.clone();
    }
}

 在person里重写克隆方法的时候,相当于暂时创建了一个 tmp,将money也拷贝一份,tmp指向拷贝的money,再将person2指向tmp。


3.调用构造方法构造对象

string把双引号引起来的数据放到常量池,常量池就是哈希表

  • class文件常量池:int a=10;(10就放在class文件常量池),是字节码文件,在磁盘上
  • 运行时常量池:当程序把编译好的字节码文件,加载到JVM当中后会生成一个运行时常量池(方法区),实际上是class文件常量池
  • 字符串常量池:主要存放字符串常量,本质上是哈希表

局部变量一定有栈,

字符串以数组的形式存储,

1.先看常量池里面有没有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值