【java】创建对象的过程

创建对象

构造方法

用于对象的初始化,通过new调用,方法名和类名相同。编译器会自动添加无参构造器,如果自定义了构造方法,默认无参构造方法会失效。

拷贝

对象拷贝

直接使用=,只拷贝了指向对象的指针,里面的数据全都没有拷贝,修改新的对象里的数据会直接修改原对象。

浅拷贝

两种方式

  • 拷贝构造方法

    /* 拷贝构造方法实现浅拷贝 */
    public class CopyConstructor {
        public static void main(String[] args) {
            Age a=new Age(20);
            Person p1=new Person(a,"摇头耶稣");
            Person p2=new Person(p1);
            System.out.println("p1是"+p1);
            System.out.println("p2是"+p2);
            //修改p1的各属性值,观察p2的各属性值是否跟随变化
            p1.setName("小傻瓜");
            a.setAge(99);
            System.out.println("修改后的p1是"+p1);
            System.out.println("修改后的p2是"+p2);
        }
    }
    
    class Person{
        //两个属性值:分别代表值传递和引用传递
        private Age age;
        private String name;
        public Person(Age age,String name) {
            this.age=age;
            this.name=name;
        }
        //拷贝构造方法
        public Person(Person p) {
            this.name=p.name;
            this.age=p.age;
        }
        
        public void setName(String name) {
            this.name=name;
        }
        
        public String toString() {
            return this.name+" "+this.age;
        }
    }
    
    class Age{
        private int age;
        public Age(int age) {
            this.age=age;
        }
        
        public void setAge(int age) {
            this.age=age;
        }
        
        public int getAge() {
            return this.age;
        }
        
        public String toString() {
            return getAge()+"";
        }
    }
    
  • 重写clone方法

    /* clone方法实现浅拷贝 */
    public class ShallowCopy {
        public static void main(String[] args) {
            Age a=new Age(20);
            Student stu1=new Student("摇头耶稣",a,175);
            
            //通过调用重写后的clone方法进行浅拷贝
            Student stu2=(Student)stu1.clone();
            System.out.println(stu1.toString());
            System.out.println(stu2.toString());
            
            //尝试修改stu1中的各属性,观察stu2的属性有没有变化
            stu1.setName("大傻子");
            //改变age这个引用类型的成员变量的值
            a.setAge(99);
            //stu1.setaAge(new Age(99));    使用这种方式修改age属性值的话,stu2是不会跟着改变的。因为创建了一个新的Age类对象而不是改变原对象的实例值
            stu1.setLength(216);
            System.out.println(stu1.toString());
            System.out.println(stu2.toString());
        }
    }
    
    /*
     * 创建年龄类
     */
    class Age{
        //年龄类的成员变量(属性)
        private int age;
        //构造方法
        public Age(int age) {
            this.age=age;
        }
        
        public int getAge() {
            return age;
        }
        
        public void setAge(int age) {
            this.age = age;
        }
        
        public String toString() {
            return this.age+"";
        }
    }
    /*
     * 创建学生类
     */
    class Student implements Cloneable{
        //学生类的成员变量(属性),其中一个属性为类的对象
        private String name;
        private Age aage;
        private int length;
        //构造方法,其中一个参数为另一个类的对象
        public Student(String name,Age a,int length) {
            this.name=name;
            this.aage=a;
            this.length=length;
        }
        //eclipe中alt+shift+s自动添加所有的set和get方法
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
        public Age getaAge() {
            return this.aage;
        }
        
        public void setaAge(Age age) {
            this.aage=age;
        }
        
        public int getLength() {
            return this.length;
        }
        
        public void setLength(int length) {
            this.length=length;
        }
        //设置输出的字符串形式
        public String toString() {
            return "姓名是: "+this.getName()+", 年龄为: "+this.getaAge().toString()+", 长度是: "+this.getLength();
        }
        //重写Object类的clone方法
        public Object clone() {
            Object obj=null;
            try {
                obj= super.clone(); //调用Object类的clone方法,返回一个Object实例
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return obj;
        }
    }
    
深拷贝

对整个对象图进行拷贝,如果该对象的成员变量有引用类型,同时也要拷贝该引用指向的对象。

  • 对每层对象进行浅拷贝==深拷贝,缺点是代码量繁杂
  • 使用对象序列化

创建对象的过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值