前言:
总算缓过来了
前几天一直忙着各种各样的走亲戚
永远认不全谁是我的哪个长辈 TuT
随着后面学习内容的加深,更新的话也会少一些,毕竟写blog也就是自己给自己加约束,让自己能自律一些,目前来看自律是够的~
1.Object类中的方法重写
主要需要重写的方法有两个
1.1equals方法
1.1.1 equals方法和 == 运算符的比较
① 对于 == 运算符
== 既可以比较基本数据类型,也可以比较引用数据类型
== 在比较基本数据类型时,比较基本数据类型的值是否相同
== 在比较引用数据类型时,比较引用数据类型的地址是否相同
②对于equals方法来说
对于自己定义的类中的equals方法,如果自己没有进行对equals方法的重写,那就引用java.lang.euqals()方法,只进行“==”的比较
对于String类,Date类等的equals方法时,由于String类和Date类等对Object类的equals方法进行了重写,所以比较的就是值的大小
也就是说,调用了equals方法并不代表就是进行了值的比较
对于自己定义的类,虽然可以调用父类Object类中的equals方法,但是要实现值比较,需要自己对equals方法进行重写
equals方法的重写:
Java代码实现(作者本人想法的)
测试Bean类:people
public class people {
private String name;
private int age;
public people() {
}
public people(String name , int age) {
super();
this.age = age;
this.name = name;
}
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;
}
public static void main(String[] args) {
people p1 = new people("hello", 21);
people p2 = new people("hello", 21);
System.out.println(p1.equals(p2));
System.out.println(p1.getName().equals(p2.getName()));
}
}
equals方法1:(自己写的)
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj instanceof people) {
people p = (people)obj;
return this.age == p.age&&
this.name.equals(p.name);
}
return false;
}
equals方法2:Java自动生成的
自动生成方法:
alt+shift+s ---> generate Hashcode() and equals() 勾选需要的属性即可
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
people other = (people) obj;
return age == other.age && Objects.equals(name, other.name);
}
1.2toString方法
其实就是用于输出对象的
例如:
public class SYSO {
public static void main(String[] args) {
String s1 = "hello";
people p1 = new people("hello",21);
System.out.println(s1);
System.out.println(p1);
}
}
她就等效于:
public class SYSO {
public static void main(String[] args) {
String s1 = "hello";
people p1 = new people("hello",21);
System.out.println(s1.toString());
System.out.println(p1.toString());
}
}
只不过我们把toString方法给忽略了
很显然,我们需要的结果是:
hello 和 hello21
但是最后的结果为:
hello
WarrpTest.people@5e91f1e
原因也很简单,因为String类中已经实现了对toString方法的重写,它输出的就是String的内容
而我们自定义的people类并没有对toString进行重写,就按例调用Object类中的toString方法,输出她的类名和16进制的Hashcode值
想要输出正确的内容,则需要重写toString方法
举例如下(以people为例)
@Override
public String toString() {
return "people [name=" + name + ", age=" + age + "]";
}
快捷键:
alt+shift+s ---> generate toString() 勾选需要的属性即可
这样我们输出的就是我们需要的结果啦
测试如下:
hello
people [name=hello, age=21]
2.包装类
2.1包装类的定义
2.2自动包装和解包(基本数据类型和包装类的转化)
在JDK5.0以后,基本数据类型和其对应的包装类可以直接看做同解,实现用包装类定义对应基本数据类型,或者用基本数据类型定义对应的包装类
即:
public void testEx() {
int i = 123;
Integer in = i;
Integer in1 = new Integer(123);
int i1 = in1;
}
2.3String和基本数据类型(包装类)的转化
import org.junit.Test;
public class WarrpTest {
@Test
//将String类型转换成基本数据类型
public void test1(){
String s1 = "123";
//转换成基本数据类型
//方法1:
int i = Integer.parseInt(s1);
System.out.println(i+1);
//方法2:
int ii = new Integer(s1);
System.out.println(ii + 1);
//转化成包装类
Integer in1 = Integer.parseInt(s1);
System.out.println(in1);
}
//将基本类型,包装类转成String
@Test
public void test2() {
//基本数据类型
int i = 123;
String s1 = String.valueOf(i);
System.out.println(s1);
//包装类
Integer in1 = new Integer(10);
String s2 = String.valueOf(in1);
System.out.println(s2);
}
}