java是面向对象的语言,核心思想:找适合的对象做适合的事情
方式一:自定义类,然后通过自定义的类创建对象
方式二:sun提供了很多的类给我们使用,我们只需要认识这些类,我们就可以通过这些类创建对象了
Object类是所有类的终极父类,任何一个类都继承了Object类
Object类:
Object类常用的方法:
-----toString(); 返回该对象的字符串表示,返回一个字符串用于描述该对象
-----equals(Object obj);用于比较两个对象的内存地址,判断两个对象是否为同一个对象
-----hashCode();返回该对象的哈希码(可以把哈希码就理解成是对象的内存地址)
java中的规范:一般我们重写了一个类的equals方法,我们都会重写他的HashCode方法
public class Demo1 {
public static void main(String[] args) {
Object o = new Object();
System.out.println("toString:" + o.toString());// java.lang.Object@7b2164ea
// 返回的字符串表示:完整类名+@+对象的哈希码
System.out.println(o);
//疑问:为什么直接输出一个对象的时候和输出toString方法返回的字符串结果是一样的
}
}
疑问:为什么直接输出一个对象的时候和输出toString方法返回的字符串结果是一样的
个人理解,print也是一个方法,print(Object o)然后方法内部是o.toString()也就是print这个方法输出的就是toString方法的返回值,也就是说zaiprint方法里调用了toString方法
java提供的类都是开源的,查看源码的方式:
方式一:按住ctrl键,单机你需要看的源代码
方式二:把光标移动到你需要查看代码处,按下F3
为什么我们要查看源代码:
1.查看源代码可以了解别人是如何写出这个奇数的,让我们了解的更加深入
2.吸收大牛的思想
注意喽,看源代码最忌讳的一点就是,不要每行代码都弄懂是什么意思,能看个大概猜出他的意思就足矣了
toString作用:
重写toString之后,我们直接输出一个对象的时候,就会输出符合我们所需求的格式数据
class Person{
int id;
String name;
public Person(){
}
public Person(int id,String name){
this.id = id;
this.name = name;
}
//目前我需要直接输出一个对象的时候,输出的格式是:编号:110 姓名:狗娃 这种格式。
//目前toString方法无法满足子类的需求,那么这时候我们就应该对Object类的toString进行重写
//快捷键toString+alt+/就会调出toString的方法,然后改写
@Override
public String toString() {
// TODO Auto-generated method stub
return "编号:"+this.id+"\t姓名:"+this.name;
}
}
public class Demo4 {
public static void main(String[] args) {
Person p = new Person(110,"狗娃");
System.out.println(p);
}
}
equals的重写:
class Person{
int id;
String name;
public Person(){
}
public Person(int id,String name){
this.id = id;
this.name = name;
}
//目前我需要直接输出一个对象的时候,输出的格式是:编号:110 姓名:狗娃 这种格式。
//目前toString方法无法满足子类的需求,那么这时候我们就应该对Object类的toString进行重写
//快捷键toString+alt+/就会调出toString的方法,然后改写
@Override
public String toString() {
// TODO Auto-generated method stub
return "编号:"+this.id+"\t姓名:"+this.name;
}
//重写equals,必须强制转换一下,不然obj和Person无法比较
//object的equals方法默认比较的是两个对象的内存地址,我目前需要比较的是两个对象的身份证
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
Person p = (Person)obj;
return this.id == p.id;
}
}
public class Demo4 {
public static void main(String[] args) {
/*
Person p = new Person(110,"狗娃");
System.out.println(p);
*/
Person p1 = new Person(110,"狗娃");
Person p2 = new Person(110,"狗剩");
//身份证一样,则两人相同
System.out.println("p1与p2是同一个人吗?"+p1.equals(p2));
}
}
虽然目前输出为true,但是两个对象的哈希码其实是不一样的,所以需要重写一下HashCode
HashCode的重写
class Person{
int id;
String name;
public Person(){
}
public Person(int id,String name){
this.id = id;
this.name = name;
}
//目前我需要直接输出一个对象的时候,输出的格式是:编号:110 姓名:狗娃 这种格式。
//目前toString方法无法满足子类的需求,那么这时候我们就应该对Object类的toString进行重写
//快捷键toString+alt+/就会调出toString的方法,然后改写
@Override
public String toString() {
// TODO Auto-generated method stub
return "编号:"+this.id+"\t姓名:"+this.name;
}
//重写equals,必须强制转换一下,不然obj和Person无法比较
//object的equals方法默认比较的是两个对象的内存地址,我目前需要比较的是两个对象的身份证
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
Person p = (Person)obj;
return this.id == p.id;
}
//重写哈希码,让他返回我们判断两个对象是否相同的证据就好
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.id;
}
}
public class Demo4 {
public static void main(String[] args) {
/*
Person p = new Person(110,"狗娃");
System.out.println(p);
*/
Person p1 = new Person(110,"狗娃");
Person p2 = new Person(110,"狗剩");
//身份证一样,则两人相同
System.out.println("p1与p2是同一个人吗?"+p1.equals(p2));
System.out.println("p1哈希码"+p1.hashCode());
System.out.println("p2哈希码"+p2.hashCode());
}
}