Java异常抛出与对象深浅复制

package com.sanmao6;

import com.sanmao5.Student;

import java.util.Scanner;

/**

 *
 * 异常知识点
 *      异常捕获机制
 *      try{
 *          可能发生错误的语句
 *      }catch(错误类型 e){
 *          出错了
 *      }finally{
 *          后续处理
 *      }
 *      */
public class Error {
    public static void main(String[] args)
    /** throws Exception
     * 在main方法后面一般不加错误抛出,因为抛给main就相当于抛给JVM,所以在自定义的方法中加上错误抛出
     * 在方法后面加了throws  就不用在内部用 try 了*/{
// *************************************************************************
//       int i;
//        i=11-11;
//        try{
//            /**
//             * thow 抛出异常 主动的去抛出一个异常*/
//            throw new NumberFormatException();
//            //int j=11/i;
//        }catch (Exception e)
//        /**Exception 是所有出错类的父类
//         * (在Java中有许多错误类)*/
//        {
//            System.out.println("error");
//            System.out.println(e.toString());
//            /**
//             * java.lang.ArithmeticException: / by zero*/
//            e.printStackTrace();
//            /**
//             * java.lang.ArithmeticException: / by zero
//             * +详细错误信息*/
//            //e.printStackTrace();
//        }finally
//        /**
//         * 无论出不出错,都会执行 finally语句块*/
//        {
//            System.out.println("end!");
//        }
//        /**if(i!=0)
//            System.out.println(11/i); //被0除是错误的 在计算机中
//        else
//            System.out.println("除数不可以为零");
//        */
// *********************************************************************************

*********************************************************************************
//        Scanner cin = new Scanner(System.in);
//        String str = cin.nextLine();
//        int n;
//            try{
//                /**
//                 * try捕获异常,发生错误后,让catch块去执行,该执行的动作*/
//                n=Integer.parseInt(str);
//            }catch (Exception e){
//                /**
//                 * 解决错误*/
//                n=0;
//            }
//        System.out.println(n);
*******************************************************************************
        Student s=new Student("sanmao",123);
        Student ss=null; //ss要进行初始化
        try {
            ss= (Student) s.clone();
            /**
             * 克隆是怎样拿到其他类的私有变量呢?
             * 是通过反射机制,拿到克隆类的私有成员变量和方法
             *
             * 通过克隆产生的对象是一个新的对象,二者不是同一个对象
             * 地址值也不一样 s==ss 返回false
             *
             * 克隆属于浅拷贝  对应的概念是深拷贝
             * */
        }catch (CloneNotSupportedException e){
            //e.printStackTrace();
        }
        //System.out.println(s.toString());
        System.out.println(ss.toString());
        System.out.println(s==ss); //flase
        System.out.println(s.getName()==ss.getName());
        /**
         * s.name==ss.name 这是浅拷贝的体现,两个对象的成员变量 居然是同一个字符串*/
//***********************************************************************************


    }
}
package com.sanmao5;

/**
 */
public class Student implements Cloneable{

    /**
     * 实现Clobeable接口
     * 可以进行克隆功能,对克隆接口中的克隆方法进行初始化*/
    @Override
    public Object clone() throws CloneNotSupportedException {
        //return super.clone();
        //下边代码块是对 super.clone()的解释
        Student copy=null;
        copy=(Student)super.clone();
        /**
         * copy=(Student)super.clone();
         * 这句话是可能产生异常的但是,在方法后面
         * 有异常抛出,所以这里不报异常,留给调用这个方法的代码块去处理
         **/
        copy.setName(this.name); //浅拷贝
        copy.setAge(this.age);
        /**
         * copy.setName(new String(name))
         * copy.setAge(this.age) 简单类型跟深浅拷贝没有关系,简单类型直接赋值,深浅拷贝在于
         * 是否给新引用指定新开辟的内容,引用原来的就是浅拷贝,新开辟空间, 给新的引用,这就是深拷贝
         * */
        return copy;

    }

    private String name;
    private int age;
    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }
    /**
     * public String toString()
     * a:返回该对象的字符串表示。
     *
     public Stirng toString() {
     return name + "," + age;
     }
     * b:它的值等于:
     * getClass().getName() + "@" + Integer.toHexString(hashCode())
     * c:由于默认情况下的数据对我们来说没有意义,一般建议重写该方法。
     * B:最终版
     * 自动生成
     */
    @Override
    public String toString(){//toString(),是Object存在的非抽象方法原来是返回地址
        return "name="+name+"  age="+age;
    }

    /**
     * a:指示其他某个对象是否与此对象“相等”。
     * b:默认情况下比较的是对象的引用是否相同。
     * c:由于比较对象的引用没有意义,一般建议重写该方法。
     */
    @Override
    public boolean equals(Object obj) {
    //     return super.equals(obj);
        if(this==obj)
            return true;
        if(this==null)
            return false;
        if(!(this instanceof Student)) //对象1 instanceof 对象2, 对象2(实例)
                                       //instanceof 只比较同一类型对象
             return false;             //是不是对象1的实例
        if(!name.equals(((Student)obj).getName()))
            return false;
        if(age!=((Student)obj).getAge())
            return false;
        if(hashCode()!=obj.hashCode())
            return false;
        return true;
    }

    /**
     * * public int hashCode()
     * a:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
     * b:不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同。
     */
    @Override
    public int hashCode() { //数据存储方式
//        return super.hashCode();
        int hashcode=name.hashCode();
        return 37+hashcode+age;
    }

    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
    public void setName(String name){
        this.name=name;
    }
    public void setAge(int age){
        this.age=age;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值