• 整理了一些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的源码