object
- 在Java类继承结构中,java.lang.Object位于类顶端
- 如果顶一个java类时没有使用extends关键字声明其父类,则其父类默认为java.lang.Object类
- Object 类型的引用变量可以指向任意leix类型对象
- 是所有类的超类,所有类都直接或是简接继承了Object
- 直接继承:创建class后没有继承继承任何类,在Java编译器编译的时候,自动添加关键字extends 继承Object类
- 间接继承:当前创建的类继承了另外一个类(Java是单继承,传递性),ling另外的类直接或间接Object类
方法:
- toString();String-》Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Person person = new Person();
System.out.println(person.toString());//day04.Person@4361bd48
重写:
toString()
public String toString() {
return getClass().getName()+"[name=" + name + ", sex=" + sex + ", age=" + age + ", Id=" + Id + "]";
}
2.equals();boolean; Object
类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x
和 y
,当且仅当 x
和 y
引用同一个对象时,此方法才返回 true
(x == y
具有值 true
)。
重写equals()方法
public boolean equals(Object obj) {
if(obj==null) {//判断当前引用值是否为null
return false;
}
if(obj == this) {//判断是否是自己
return true;
}
if(obj instanceof Person) {//判断基因
Person p= (Person)obj;
return p.name.equals(this.name)&&p.Id.equals(this.Id)&&p.age==this.age;
}else {
return false;
}
equals()和==的区别
==用于比较变量的值,可以应用于任何类型,如果用于引用类型,比较的是两个引用变量中存储的值(地址信息),判断两个变量是否指向相同的对象,
equals()是Object的方法,重写以后可以用于比较两个对象的内容是否相等,需要注意的是:Object默认equals()方法比较规则同==
包装类
- 为什么要使用包装类?
Java并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。但是我们在实际使用中经常需要将基本数据类型转化成对象,便于操作。
- 包装类的使用
对象型(Object的直接子类):Boolean,Character(char);
数值型(Number的直接子类):Byte,Double,Short,Long,Integer(int),Float
Number的子类必须提供将表示的数值自动转换为相对应的基本数据类型的方法
- doubleValue(); 以double形式返回指定的数值
- intValue() 以int形式返回指定的数值
- floatValue() 以float形式返回指定的数值
Integer常用功能
- Integer.MAX_VALUE; 返回Integer的最大值
- Integer.MIN_VALUE; 返回Integer的最小值
可变类,在构造包装类对象之后,不允许更改其中的值
包装类是final 的,不能定义她们的子类
* byte Byte Number
* short Short Number
* int Integer Number
* long Long Number
* float Float Number
* double Double Number
* char Character Object
* boolean Boolean Object
自动装箱和自动拆箱
自动装箱
Integer i = 110;//基本数据类型就自动封装到与他相同类型的包装中
//本质上编译器编译时自动为我们添加了代码
Integer Int = new Integer(i);
自动拆箱
//包装类对象自动转换成基本类型数据,如:
int a = new Integer(100);
//本质上,编译器在编译时为我们添加了:
int a = new Integer(100).intValue();
缓存问题
public class Test {
public static void main(String[] args) {
Integer num1 = 10;
Integer num2 = 10;
Integer num3 = 128;
Integer num4 = 128;
System.out.println(num1 == num2);//true
System.out.println(num3 == num4);//false
System.out.println(num1.equals(num2));//true
System.out.println(num3.equals(num4));//true
}
}
结论:【-128,127】之间的数,仍然当做基本数据类型来处理,为了提高效率。
说明:对于Integer var = ?在-128至127范围内的赋值,Integer对象是在IntegerCache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,所以所有的包装对象之间值的比较,全部使用equals方法比较。(给直接量范围在-128~127 ,会有对象重用的, 缓冲的值一旦超过范围就会强制new对象)
包装类的作用之字符串与基本数据类型转换
- String变为int类型(Integer类)
String str = "123";
int num = Integer.parseInt(str);
System.out.println(num);
- String变为double类型(Double类)
String str = "123";
double num = Double.parseDouble(str);
System.out.println(num);
- String变为Boolean类型(Boolean类)
String str = "123";
boolean num = Boolean.parseBoolean(str);
System.out.println(num);
- 基本数据类型变为字符串
a.任何数据类型使用了“+”连接空白字符串就变为了字符串类型。
String str = 123+" ";
System.out.println(str);
b.使用String类提供的valueOf()方法,此方法不产生垃圾。
String str = String.valueOf(123);
System.out.println(str);
Date
所在包;java.uitl.Date
Date用来表示一个日期(时间)
当我们new 后,就能获取当前确切的
时间点,内部(对象)维护是一个long值。是从1970年元旦
Date类里面的toString已经被重写了
因为设计缺陷导致现在好多内部的方法都已经过时(不建议使用)
var now = new Date() // 当前时间
+new Date() // 当前时间的毫秒数
now.valueOf()
now.getTime()
now.setTime(1447916896757) // 设置时间
now.getFullYear() // 返回4位年份
now.getMonth() // 返回月份,0-11
now.getDate() // 返回天数,1-31
now.getDay() // 返回星期,0-6,0表示周日
now.getHours() // 返回小时数,0-23
now.getMinutes() // 返回分钟数,0-59
now.getSeconds() // 返回秒数,0-59
now.getMilliseconds() // 返回毫秒数
now.getTimezoneOffset() // 返回时差,分钟数
now.setFullYear(2007) // 设置年份,必须4位数字
now.setMonth(9) // 设置月份,超过11增加相应年份
now.setDate(25) // 设置天数,超过该月最大天数,则增加月份
now.setHours(12) // 设置小时数,超过23,则增加天数
now.setMinutes(45) // 设置分钟数,超过59,则增加小时数
now.setSeconds(45) // 设置秒数,超过59,则增加分钟数
now.setMilliseconds(900) // 设置毫秒数