异常及重写equals、toString方法

来源:互联网 发布:matlab 随机字符串数组 编辑:程序博客网 时间:2024/05/22 05:33

equals方法

在object中的equals方法默认的是直接比较两个变量的值,基本类型就是比较表面值,引用类型则比较的是地址值,不能判断两个引用的内容是否一样,这时候就需要我们进行重写

/* * 重写object的equals方法,不再比较对象的地址值,而是比较其属性值: * 1,判断地址是否相等//是不是指向同一个引用 * 2,判断类型是否一致,否则即使属性值相同也不可能相等 * 3,判断属性值是否相等 * 注意:调用属性方法判断的时候要注意空指针异常, *              列如String类型的变量没有赋值默认为null的时候, *              不能调用String的方法。 *       * 系统有快速生成重写equals的方法。 */public class Person {    private String name;    private int age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public Person(int age) {        super();        this.age = age;    }    public void setAge(int age) {        this.age = age;    }    public Person() {        super();    }    public Person(String name, int age) {        super();        this.name = name;        this.age = age;    }    public boolean equals(Object o) {// 传入参数为Object可以适用于任何类型。        if (this == o) {// "=="直接判断两个变量的值是否相等,            // this为当前变量引用当前对象的地址值,o为引用变量存储对象的地址值。            return true;// 两个变量的地址值相同,指向同一个对象        } else {// 两个对象,看类型是否相同。            if (o instanceof Person) {// 类型相同,转换类型继续判断。                Person p = (Person) o;                if(this.name==null&&p.name==null){                    if(this.age==p.age){                        return true;                    }                }                if(this.name!=null&&p.name!=null){                    if(this.age==p.age&&name.equals(p.name)){                        return true;                    }                }            }            //判断的过于复杂/*              Person p = (Person) o;                if (this.age == p.age) {// 属性年龄相同,继续判断                    if ((this.name == null && p.name != null) || (this.name != null && p.name == null)) {                        // 两个对象中有一个姓名属性没有赋值,返回false                    } else {                        if (name.equals(p.name)) {                            return true;                        } else {                            return false;                        }                    }                } else {// 年龄不同,false                    return false;                }            } else {// 类型不同,false                return false;            }*/        }        return false;//整体判断思路,默认返回false,则只需要进行true的判断。    }}

/*
* 进行重写eqauls方法的测试
*情况:
*1,指向同一个对象true
*2,两个对象,不是同一类型false
*3,两个对象,其中一个无名false
*6,两个对象都无名,同龄true
*6,两个对象都无名,不同龄false
*4,两个对象,年龄不同false
* 5,两个对象,年龄相同,姓名相同true
*/
public class TestPerson {
public static void main(String[] args) {
Person p = new Person(“张三”, 24);
Person p1 = new Person(24);
Person p2 = new Person(“张三”, 25);
Person p3 = new Person(“张三”, 24);
Person p4 = new Person(24);
Person p6 = new Person(25);
Person p5;
Student s = new Student(“张三”, 24);
p5 = p;
System.out.println(p.equals(p1));
System.out.println(p.equals(p2));
System.out.println(p.equals(p3));
System.out.println(p.equals(p5));
System.out.println(p1.equals(p4));
System.out.println(p1.equals(p6));
System.out.println(p.equals(s));
}
}

class Student {
String name;
int age;

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

}

## toString方法 ##和equals方法类似

/*
* Object默认的toString方法,在调用print方法时默认调用toString方法
* 将返回的字符串输出,此字符串的组成,包名+类名+@+地址
* 现在将对象的属性生成一个字符串输出
* 注意仍然需要注意空指针。
*
*
* 也可以有系统快速生成。
*
*/
public class Pet {
private String name;
private int age;

public Pet() {    super();}public Pet(String name, int age) {    super();    this.name = name;    this.age = age;}public String toString() {    return "[" + this.name + "," + this.age + "]" + super.toString();}

}

package yhy.study.day05_toString;

public class TesttoString {
public static void main(String[] args) {
Pet p=new Pet(“小花”,5);
System.out.println(p.toString());
}
}
“`

异常的初步认识

java程序在编译和运行的时候可能会出现许多问题,java将这些问题以面向对象的方式封装起来就是异常。

异常的继承体系
异常的父类Throwable:含义可抛出的异常类。
子类Error:比较严重的错误,一般不可由软件层面解决。
子类Exception:编译及运行时期的异常,一般所说的异常都是其子类。其中RuntimeException是一个比较特殊的子类。

异常的产生过程分析

在java中,一旦程序执行到某处出现了一个异常的问题,那么就会产生并抛出(throw)一个异常的对象,返回给调用则者,如果调用者不进行try{}catch{}处理那么就继续向上抛出,以此类推,直至jvm,jvm会调用printStack方法打印信息并停止程序。

自定义异常

一般自己通过继承已有的异常类,可以定义新的异常,可以更准确的给出提示的等信息,此时,我们需要自定义一个判断并抛出的动作,自定义出异常产生的条件,
 多异常处理
捕获处理:
1多个异常分别处理
2多个异常一次捕获多次处理
3多个异常一次捕获一次处理
声明抛出异常:
声明上使用,一次声明多个异常

 运行时异常被抛出可以不处理。即不捕获也不声明抛出
 如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集
 父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
 当多异常处理时,捕获处理,前边的类不能是后边类的父类
 在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。
一try,多catch,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

异常的转化

在实际的应用过程中,如果异常能被当前的调用者处理,建议使用trycatch处理,若有调用者,则要进行异常的转化,返回针对调用者的异常信息,如果自己并不能解决,那么要求给出出现异常的解决方案,并声明抛出,针对不同的对象,对同一个异常的处理也是不同的,

待续

阅读全文
0 0
原创粉丝点击