目录
Object:
- 在Java类继承结构中, java.lang.Object类位于顶端;
- 如果定义一个Java类时没有使用extends关键字声明其父类,则其父类默认为java.lang.Object类;
- Object类型的引|用变量可以指向任何类型对象。
Object是所有类的超类,它里面定义的方法所有子类都具备
而其中有两个方法经常被子类重写:toString,equals
public class Point {
private int x;
private int y;
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
/**
* 重写从Object中继承的toString方法。返回的字符串没有格式上的具体要求,可以
* 结合将来实际开发需求而定。但是原则上返回的字符串中应当包含当前对象的属性信息
*/
public String toString() {
//希望返回的格式:(x,y)
return "(" + x + "," + y + ")";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
toString( ):
- Object类中的重要方法,用于返回对象值的字符串表示;
- 原则上建议重写,格式大多数遵循类的名字[域值]
如何重写toString方法:
- Java语言中很多地方会默认调用对象的toString方法: 字符串+对象自动调用对象的toString方法
- System.out.print (任意对象), 直接调用toString方法
- 如果不重写toString方法,将使用Object的toString方法,其逻辑为: 类名@散列码
- toString方法是非常有用的调试工具;
- JDK中的标准类库中,许多类都定义了toString方法方便用户获得有关对象状态的必要信息强烈建议为自定义的每-一个类增加toString方法。
public class Demo {
public static void main(String[] args) {
Point p = new Point(1,2);
Point p2 = new Point(3,4);
/*
* System.out.println(Object o)
* 我们经常使用该方法将一个引用类型变量进行输出。
* 而这个方法是先调用给定的对象的toString方法,然后将该方法返回的String
* 输出到控制台。
* 由于toString方法是Object定义的方法,因此所有类都有这个方法,如果子类
* 没有重写的话,那么Object提供的toString方法返回的字符串格式是:
* 类名@地址
* 但是这个格式输出到控制台对我们开发实质上没有多大帮助。因此,当我们将来
* 希望输出一个对象更有价值的内容时,就需要重写这个方法。
*
*/
System.out.println(p);
System.out.println(p2);
/*
* 字符串与其他类型连接的结果还是字符串。
* 那么字符串实际连接其他引用类型时,就是调用该对象的toString方法,将
* 返回的字符串进行连接的。
* 下面的代码等同于:
* String str = "point:" + p.toString();
*/
String str = "point:" + p ;
System.out.println(str);
String line = p.toString();
System.out.println(line);
/*
* java API中提供的类大部分都重写过toString方法。因此将来只有我们自己定
* 义的类如果必要是需要自行重写toString方法
*/
String s = "hello";//String类就重写了toString方法
System.out.println(s);//因此输出时看到的也不是类名@地址。
}
}
equals 方法:
Object中的方法,作用在于检测一个对象是否等于另外个对象;在Object类中,这个方法判断两个对象是否具有相同的
引用,即是否为相同的对象;在实际应用中般需要重写该方法,通过比较对象的成员属性,使该方法更有意义,例如:对于Cell类,如果不重写equals方法,下面代码在cell1和cell2指向同个对象时才为true ,可以将其重写为:当x和y坐标相等时两个对象即相等,这样更有意义一-些。cell1. equals(cell2);
String 重写 equals 方法:
String的equals方法用于比较两个字符串对象的字符串内容是否相等。
equals 和 == 的区别
- ==用于比较变量的值,可以应用于任何类型,如果用于引用类型,比较的是两个引|用变量中存储的值(地址信息), 判断两个变量是否指向相同的对象
- equals是Object的方法重写以后,可以用于比较两个对象的内容是否"相等’
- 需要注意的是, Object默认的equals方法的比较规则同==
public class Demo2 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = new String("hello");
System.out.println("s1:"+s1);
System.out.println("s2:"+s2);
/*
* ==是值比较。对于引用类型变量而言,保存的是地址,因此==成立时说明
* 两个引用类型变量保存的地址相同(指向的是同一个对象)。
*
* equals方法的作用是比较两个引用类型变量指向的对象的内容是否相同
*/
//s1和s2指向的是两个不同的字符串对象,因此地址不同
System.out.println("s1==s2:"+(s1==s2));//false
//s1和s2指向的字符串内容都是hello,因此两个字符串对象的内容相同。
System.out.println("s1 equals s2:" + s1.equals(s2));//true
Point p1 = new Point(1,2);
Point p2 = new Point(1,2);
System.out.println("p1==p2:" + (p1==p2));//false
/*
* java提供的类equals方法基本都重写了,比如上面的String类。
* 而我们定义的类若不重写则使用Object提供的,那么比较规则就是==,没有
* 实际价值。对此我们如果自己定义的类也希望用equals比较内容就需要重写
* 这个方法。
*/
System.out.println("p1 equals p2:"+p1.equals(p2));//true
}
}
包装类:
包装类概述:
- 在进行类型转换的范畴内,有一种特殊的转换,需要将int这样的基本数据类型转换为对象;
- 所有基本类型都有一个与之对应的类,即包装类( wrapper )。
- 包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值;
- 包装类是final的,不能定义他们的子类。
- 包装类就是为了解决基本类型不能直接参与面向对象开发的问题.实际上就是将基本类型以" 对象"形式表示
基本类型 | 基本类型 | 父类 |
int | java.lang.Integer | java.lang.Number |
long | java.lang.Long | java.lang.Number |
double | java.lang.Double | java.lang.Number |
short | java.lang.Short | java.lang.Number |
byte | java.lang.Short | java.lang.Number |
byte | java.lang.Byte | java.lang.Number |
char | java.lang.Character | java.lang.Object |
boolean | java.lang.Boolean | java.lang.Object |
8种基本类型包装类:
Number 及其主要方法:
- 抽象类Number是Byte、Double、Float、Integer、Long和Short类的父类;
- Number的子类必须提供将表示的数值转换为bytedouble,float , int , long和short的方法
- doubleValue ( )以double形 式返回指定的数值
- intValue ( )以int形式返回指定的数值
- floatValue ( )以float形式返回指定的数值
包装类常用方法:
方法 | 说明 |
valueOf( ) | 将对应的基本类型转换为包装类,并且这种方式也是java推荐的方式。 |
xxxValue(); | 包装类转换为xxx类型( 例如:intValue( ); 包->基 doubleValue( ); 包-->浮 ) |
static xxx MAX_VALUE | 表示xxx类型能表示的最大值 |
static xxx MIN_VALUE | 表示xxx类型能表示的最小值 |
static parseXXX(String str) | 用于将字符串转换为xxx类型, 如果字符串的格式不是整数形式,将无法转换。 |
public class IntegerDemo {
public static void main(String[] args) {
//基本类型转换为对应的包装类(引用类型)
int i = 1;
Integer i1 = new Integer(i);
Integer i2 = new Integer(i);
System.out.println(i1==i2);//false
System.out.println(i1.equals(i2));//true
/*
* 所有的包装类类型都提供了静态方法valueOf,可以将对应的基本类型转换为
* 包装类,并且这种方式也是java推荐的方式。
*/
Integer i3 = Integer.valueOf(i);
Integer i4 = Integer.valueOf(i);
System.out.println(i3==i4);
System.out.println(i3.equals(i4));
Double d1 = Double.valueOf(123.123);
Double d2 = Double.valueOf(123.123);
System.out.println(d1==d2);
System.out.println(d1.equals(d2));
/*
* 包装类转换为基本类型
*/
int n = d1.intValue();
System.out.println(n);
double dou = d1.doubleValue();
System.out.println(dou);
/*
* 包装类提供两个常量:MAX_VALUE和MIN_VALUE可以获取取值范围
*/
//查看int的最小值与最大值
int min = Integer.MIN_VALUE;
int max = Integer.MAX_VALUE;
System.out.println(min);
System.out.println(max);
long lmin = Long.MIN_VALUE;
long lmax = Long.MAX_VALUE;
System.out.println(lmin);
System.out.println(lmax);
double dmin = Double.MIN_VALUE;
double dmax = Double.MAX_VALUE;
System.out.println(dmin);
System.out.println(dmax);
/*
* 包装类提供了一个静态方法:parseXXX(String str)
* 可以将字符串解析为对应的基本类型数据。前提是该字符串正确描述了基本
* 类型可以保存的值
*/
// String str = "123";
String str = "123.123";//小数的字符串不能解析为整数,下面代码会报错
int d = Integer.parseInt(str);
System.out.println(d);//123
double doub = Double.parseDouble(str);
System.out.println(doub);//123.0
}
}
自动拆装箱:
JDK1.5发布后,提供了一个新的特性:自动拆装箱。该特性是编译器认可的。作用是当编译器编译源代码时, 发现有基本类型和引用类型相互赋值时会自动补充转换代码。这样一来我们在源代码中就可以在基本类型和对应的引用类型之间直接赋值了。
public class IntegerDemo2 {
public static void main(String[] args) {
int d = 1;
/*
* 触发了编译器的自动装箱特性:基本类型->包装类
* 编译器会将代码改为:
* Integer i = Integer.valueOf(d);
*/
Integer i = d;//Integer.valueOf(d);
/*
* 触发了自动拆箱特性:包装类->基本类型
* 编译器会将代码改为:
* int n = i.intValue();
*/
int n = i;//i.intValue();
}
}
综合扩展:
数据类型 | 其他数据类型转换为字符串的方法一 | 其他数据类型转换为字符串的方法二 | 字符串转换为其他数据类型的方法 |
byte | Byte. toString(byte] byte) | String.valuef([byte] byte) | Byte. toString(byte] byte) |
short | Short. toString(short] s) | String.valuef(short] s) | Short.parseShort(str) |
int | Int. toString(int] ) | String.valueOf([in] i) | Integer.parseInt(str) |
long | Long.toString(long] D) | String.valueOf(long] D) | Long.parseLong(str) |
float | Float.toString([float] f) | String.valueOf(float] f) | Float.parseFloat(str) |
double | Double. toStrig(double] d) | String.valueOf([double] d) | Double.parseDouble(str); |
boolean | Boolean.toString([boolean] b) | String.valueOf([boolean] b) | Boolean.parseBoolean(str) |