- 整理了一些Java面向对象的笔记,记录在这里 @Zeii
Object
- Java中所有的东西都是对象
- Object是类的根,所有类都默认继承Object
Object类提供了一系列方法
equals
声明
public boolean equals(Object){ return; }
双等号与equals()的区别
- 双等号是运算符,比较两边变量的值是否相等。如果是基本数据类型,则直接比较二者的值;如果是引用数据类型,比如对象,比较的则是变量中存放的对象的地址。
- equals()是类或对象的方法,继承自Object。equals的实现用的也是双等号,每个类的equals都可以重写,自定义其逻辑。
- 要注意String类,String创建字符串时,内容相同的字符串指向同一块内存地址(字符串常量池中重复内容只保留一份),所以用双等号进行比较时,内存地址相同时结果也为true。
- 字符串的比较一定要用equals,不要用双等号==。
String s1 = "你好";
String s2 = "你好";
s1 == s2 ----> true ;// 两个字符串内容相同,在内存中只保留一份
s1.equals(s2) ----> true ;// String中的equals,只要字符串内容相同则返回true
String s3 = new String("阿发");
String s4 = new String("阿发");
s3 == s4 ----> false ; // 两个不同的对象,内存地址不同
s3.equals(s4) ----> true ; // 内容相同则为true
第二个例子中,“阿发"在内存中也只保留一份,两个不同的String对象指向同一个地址里的"阿发”,而后两个不同的对象又赋值给了s3和s4,也就是s3和s4分别指向不同的对象,所以双等号’=='比较的是两个对象的地址,结果为false
此处应该配个图
s3 ---> String_ins001 ---> "阿发"
s4 ---> String_ins002 ---> "阿发"
"阿发"相同,String_ins不同
toString
- toString()是对对象的字符串描述
直接打印对象时,会调用类的toString()方法
Cat c = new Cat();
println© <==> println(c.toString());
Object默认的toString()方法,返回值是:包名+类名@内存地址
一般要重写toString()
重写toString()的一般格式是:
类名{变量: 值;变量: 值}
Cat{name:“小花”; color:“白色”}
instanceof
- 判断A对象是否是B类型
- 语法
A instanceof B
if ( cat instanceof Animal )
getClass
- 返回对象的实际类型
Animal ani = new Cat();
ani.getClass();
==> class Cat
// 虽然引用类型是Animal,但实际类型是Cat
hashCode
每个Object对象都会有一个hashCode值,JVM在new一个对象后,会根据它的hashCode将它放在一个hash表中,以后用到这个对象的时候,便依据hashCode把它取出来。
- 如果两个Object的hashCode相同,则在哈希表中相同的位置做一个链表,相同hashCode的Object依次存放在链表中。(哈希冲突的常用解决方式)
- hashCode值并不是Object的内存地址
- 重写equals,也要重写hashCode。当两个Object相同时,它们生成的hashCode也应当是相同的,并且存放在hash表中同样的位置。
看hashCode的源码