java常用类
Object类
- 又称超类、基类,是所有类的直接或间接父类,位于继承树的最顶层
- 任何类,如果没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承
- Object类中所定义的方法,是所有对象都具备的方法
- Object类型可以存储任何对象
- 作为参数,可接受任何对象
- 作为返回值,可返回任何对象
getClass()方法
获取对象运行时对象的类
例如,定义一个类gtClass,其对象类型是Class
public class gtClass {
private int age;
private String name;
public gtClass() {
}
//定义有参构造方便初始化
public gtClass(int age,String name){
this.age = age;
this.name = name;
}
//get获取私有属性
public int getAge() {
return age;
}
public String getName() {
return name;
}
//set赋值私有属性
public void setAge(int a){
this.age = a;
}
public void setName(String n) {
this.name = n;
}
}
利用**getClass()**返回该类对象的实际对象类型
public class test {
public static void main(String[] args) {
gtClass gt1 = new gtClass(10,"绝世");
System.out.println(gt1.getClass());//返回实际对象类型
}
}
hashCode()方法
注:相同对象返回的哈希值相同
public class test {
public static void main(String[] args) {
gtClass gt1 = new gtClass(10,"绝世");
//打印gt1的哈希值
System.out.println(gt1.hashCode());
}
}
toString()方法
**toString()**默认原代码是
public String toString() {
//返回:类的名称@十六进制哈希值
return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}
例如:
public class test {
public static void main(String[] args) {
gtClass gt1 = new gtClass(10,"绝世");
System.out.println(gt1.toString());
}
}
当我们想通过**toString()**方法来进行其他信息的返回时,就可以在student中重写toString方法。
例如想通过该方法返回姓名:年龄
equals()方法
equals()方法源代码:
public boolean equals(Object var1) {
//返回值是true或false
return this == var1; //如果当前对象与目标对象相同,则返回true
}
例如,比较以下三个对象是否相同
public class test {
public static void main(String[] args) {
gtClass gt1 = new gtClass(10,"绝世");
gtClass gt2 = new gtClass(28, "秦羽");
gtClass gt3 = new gtClass(10,"绝世");
System.out.println(gt1.equals(gt2));
System.out.println(gt1.equals(gt3));
}
}
由于gt1、gt2、gt3均是实例化的对象,所以他们的对象地址均不相同。
但是这里会有一个问题,gt1与gt3从参数上来说,其实可以判定为相同。所以若我们希望从对象内容的角度看,这两个判定为true的话,那么就需要对**equals()**方法进行重写,步骤如下:
//重写equals
@Override
public boolean equals(Object obj) {
//1.比较两个引用是否指向同一对象
if (this == obj){
return true;
}
//2.判断obj是否为null
if (obj == null){
return false;
}
//3.判断两个引用指向的实际对象类型是否一致
if (obj instanceof gtClass){
//4.强制类型转换
gtClass g = (gtClass) obj;
//5.通过equals方法判断字符串是否相同
if (this.name.equals(g.getName())&&this.age == g.age){
return true;
}
}
return false;
}
注意:在Object类和String类中均包含有equals()方法,在Object类中是用来比较对象地址是否相同;而在对字符串使用该方法时,调用的则是String类的equals()方法,比较的是两个对象的字符串内容是否相同。
finalize()方法
public class test2 {
public static void main(String[] args) {
//创建没有有效引用指向的对象作为垃圾对象
new gtClass(12,"aaa");
new gtClass(12,"bbb");
new gtClass(12,"ccc");
//手动提示回收垃圾
System.gc();
System.out.println("回收开始");
}
}
重写finalize()
//重写finalize
@Override
protected void finalize() throws Throwable {
System.out.println(this.name + "已被回收");
}
在程序运行结束前,才会执行回收机制。
包装类
前面提到,java为我们提供了八大基本类型,而这八大基本类型是没有自己的方法和属性的,所以为了让八大基本类型变得更加强大,定义包装类,即基本数据类型所对应的引用数据类型。这样,作为引用类型的包装类就可以使用一些特定的方法和属性了。
注意:Object可统一所有数据,包装类默认值为null
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
类型转换与装箱、拆箱
装箱:将基本数据类型转化为引用类型(包装类)
拆箱:将引用类型转化为基本数据类型
装箱与拆箱的意义
基础类型既不是对象也不是Object的子类,而是数据。将一个值类型(基本数据类型)包装为类,首先可以使这个类型可以有很多基于Object类的调用方法;其次,java作为面向对象编程,真正的面向对象,基本数据类型本身就不应该存在,而只有对象这一种数据类型;不仅如此,在接口、集合等涉及泛型时,基本数据类型不能作为参数,这时候就需要装箱操作。同时由于值类型操作上更加简便,而对象可能会影响性能,所以也会有拆箱的应用场景。
JDK1.5版本前,装箱与拆箱的方法为
public class Demo01 {
public static void main(String[] args) {
//类型转换,装箱(值类型转为引用类型)
int num1 = 20;
//方法一:使用Integer类创建对象的方式将要转的基本类型变量作为构造参数
Integer int1 = new Integer