前置知识:多态:当父类类型的引用指向子类类型的对象时,就叫多态
子类继承父类:不能继承的方法只有构造和私有
一、java常用的包:
java.lang包 - 该包是Java语言的核心包,并且该包中的所有内容由Java虚拟机自动导入。 如:System类、String类、...
java.util包 - 该包是Java语言的工具包,里面提供了大量工具类以及集合类等。 如:Scanner类、Random类、List集合、...
java.io包 - 该包是Java语言中的输入输出包,里面提供了大量读写文件相关的类等。 如:FileInputStream类、FileOutputStream类、...
java.net包 - 该包是Java语言中的网络包,里面提供了大量网络编程相关的类等。 如:ServerSocket类、Socket类、...
java.sql 包 - 该包是Java语言中的数据包,里面提供了大量操作数据库的类和接口等。 如:DriverManager类、Connection接口
二、java.lang包的Object类
定义:是Java语言中类层次结构的根类(所有类的顶层父类),也就是说任何一个类都是该类的直接或者间 接子类
注意:如果定义一个Java类时没有使用extends关键字声明其父类,则其父类默认为 java.lang.Object 类。
Object() | 使用无参方式构造对象,Object的子类可以用super()方法调用这个方法 |
boolean equals(Object obj) | (由于形参为Object,所以实参类型可以随便传) 用于判断调用对象是否与参数对象相等。 该方法默认比较两个对象的地址是否相等,与 == 运算符的结果一致 若希望比较两个对象的内容,则需要重写该方法。 若该方法被重写后,则应该重写hashCode方法来保证结果的一致 性。 |
int hashCode() | 用于获取调用对象的哈希码值(内存地址的编号)。 若两个对象调用equals方法相等,则各自调用该方法的结果必须相同 若两个调用对象equals方法不相等,则各自调用该方法的结果应该 不相同。 为了使得该方法与equals方法保持一致,需要重写该方法。 |
String toString() | 用于获取调用对象的字符串形式 该方法默认返回的字符串为:包名.类名@哈希码值的十六进制 为了返回更有意义的数据,需要重写该方法 使用print或println打印该对象或字符串拼接该对象都会自动调用该对象的toString方法 |
Class getClass() | 用于返回调用对象执行时的Class实例,反射机制使用 |
注意:equals方法为什么和"=="一样?,因为equals的内部实现也是用"=="来判断的
public boolean equals(Object obj) {
return (this == obj);
}
三、重写equals方法
若重写equals方法,则也应该重写hashcode方法。
因为java官方规定,若两个对象的equals方法的结果相等,则两个对象的hashcode也应该相同
注意:Object类虽然是顶层父类,但是也需要进行强转才能使用子类的方法
instanceof用来判断obj的类型是否是Student,如果是,就不要进行强转,不然会报异常
public boolean equals(Object obj) {
if(this == obj)
return true;
}
if(null == obj)
return false;
}
if(obj instanceof Student)
Student ts = Student(obj);
return this.getId()==ts.getId();
}else{
return false;
}
内存结构分析:
Student ts 相当于在栈区申请一块内存,new Student()相当于在堆区申请一块内存
四、重写tostring方法
打印引用变量时,会自动调用该类的toString方法。
toString返回值为包名.类名@哈希码值的十六进制
重写后可以使toString方法更有意义,重写后为以下格式
public String toString(){
return "这个汽车名叫 "+carName+",型号是 "+carNo+",汽车颜色 "+color+",价格 "+price;
}