1. Object类的使用
- Object类是所有Java类的根父类
- 如果在类的声明中未使用extends关键字指明其父类,则默认父类为 java.lang.Object 类
- Object类中的功能(属性、方法)具有通用性。
①属性:无
②方法:equals() / toString() / getClass() / hashCode() / clone() / finalize() / wait() / notify() / notifyAll() - Object类只声明了一个空参的构造器,也就意味着我们造的所有对象,最终都会调用 Object类的空参构造器。
2. 面试题:"=="和equals()的区别
- “==”:运算符,可以使用在基本数据类型变量(比较数值是否相等)和引用数据类型变量中
①如果比较的是基本数据类型,比较的是两个变量保存的数据是否相等。(不一定需要类型相同,double型和int型也可以比较)
②如果比较的是引用数据类型变量,比较的是两个对象的地址值是否相同,即两个引用(变量名)是否指向同一个对象实体。 - equal():是一个方法,而非运算符
① 只能适用于引用数据类型
② Object类中定义的equals()方法和 “==” 的作用是相同的,比较的是两个对象的地址值是否相同,即两个引用(变量名)是否指向同一个对象实体。
③ 像String、Date、 File、包装类等都重写了Object类中的equals()方法,重写后比较的不是两个引用的地址是否相同,而是比较两个对象的“实体内容”是否相等。
④ 通常情况下,我们自定义的类如果使用equals()方法的话,也通常是比较两个对象的“实体内容”是否相等。那么,我们就需要对Object类中的equals()方法进行重写。
public class EqualsTest{
public static void main(String[] args){
int i = 10;
int j = 10;
double d = 10.0;
System.out.println(i == j);//true
System.out.println(i == d);//true
boolean b = true;
//System.out.println(i == b);//boolean类型的变量不参与运算
char c = 10;
System.out.println(i == c);//true
char c1 = 'A';
int c2 = 65;
System.out.println(c1 == c2);//true
}
}
练习:
package equalstest;
public class OrderTest {
public static void main(String[] args) {
Order o1 = new Order(10,"Order");
Order o2 = new Order(10,"Order");
System.out.println(o1.equals(o2));//true
Order o3 = new Order(1001,"Order");
Order o4 = new Order(1002,"Order");
System.out.println(o3.equals(o4));//false
}
}
class Order {
int orderId;
String orderName;
public Order(int orderId,String orderName){
this.orderId = orderId;
this.orderName = orderName;
}
public boolean equals(Object obj){
if(this == obj){
return true;
}
if( obj instanceof Order){
Order order = (Order)obj;
return this.orderId == order.orderId && this.orderName.equals(order.orderName);
}
return false;
}
public int getOrderId(){
return orderId;
}
public void setOrderId(int orderId){
this.orderId = orderId;
}
public String getOrderName(){
return orderName;
}
public void setOrderName(String orderName){
this.orderName = orderName;
}
}
3. toString()方法的使用
Object类中toString()的使用:
- 当我们输出一个对象的引用时,实际上就是调用当前对象的toString()方法
- Object类中toString()的定义:
public String toString(){
return getClass.getName() + "@" + Integer.toHexString(hashCode());
}
- 像String、Date、 File、包装类等都重写了Object类中的toString()方法。使得在调用对象的toString()方法时,返回 “实体内容”信息。
- 自定义类也可以重写toString()方法,当调用此方法时,返回对象的“实体内容”。
package equalstest;
public class OrderTest {
public static void main(String[] args) {
Order o1 = new Order(10,"Order");
//当我们输出一个对象的引用时,实际上就是调用当前对象的toString()方法,因为println源码调用的是toString()方法
System.out.println(o1);//equalstest.Order@16d3586;重写方法后输出Order[10,Order]
//由于toString在Order类中未重写,那么此时调用的是Object类当中写的toString()方法
System.out.println(o1.toString());//equalstest.Order@16d3586
//String类重写了Object类中的toString()方法。使得在调用对象的toString()方法时,返回 “实体内容”信息。
String str = new String("MM");
System.out.println(str);//MM
}
}
class Order {
int orderId;
String orderName;
public Order(int orderId,String orderName){
this.orderId = orderId;
this.orderName = orderName;
}
//重写Object类的toString方法
public String toString(){
return "Order[" + orderId +"," + orderName + "]";
}
public int getOrderId(){
return orderId;
}
public void setOrderId(int orderId){
this.orderId = orderId;
}
public String getOrderName(){
return orderName;
}
public void setOrderName(String orderName){
this.orderName = orderName;
}
}
4.Object类的练习
package objecttest;
public class GeometricObject {
protected String color;
protected double weight;
protected GeometricObject(){
this.color = "white";
this.weight =1.0;
}
protected GeometricObject(String color,double weight){
this.color = color;
this.weight = weight;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
package objecttest;
public class Circle extends GeometricObject {
private double radius;
//三个构造方法
public Circle(){
super();
}
public Circle(double radius){
super();
this.radius = radius;
}
public Circle(double radius,String color,double weight){
super(color, weight);
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
//求圆面积
public double findArea(){
return 3.14 * radius * radius;
}
//重写equals方法
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if(obj instanceof Circle){
Circle circle = (Circle)obj;
return this.radius == circle.radius;
}
return false;
}
//重写toString方法
public String toString(){
return "圆的半径为:" + this.radius;
}
}
package objecttest;
public class CircleTest {
public static void main(String[] args) {
Circle c1 = new Circle(2);
Circle c2 = new Circle(3);
System.out.println(c1.getColor().equals(c2.getColor()));
System.out.println(c1.equals(c2));
System.out.println(c1.toString());
System.out.println(c2.toString());
}
}
输出结果:
5. 单元测试方法的使用
Java中的JUnit单元测试:
- 将JUnit的jar包导入到idea中(为第四步导包做准备)
- 创建Java类,进行单元测试
此时的Java类要求:①:此类是public的; ②此类提供公共的无参的构造器 - 在此类中声明单元测试方法。
此时的单元测试方法要求:方法的权限是public,没有返回值类型(返回值类型为void),没有形参 - 此单元测试方法上需要声明注解:@Test,并在单元测试类中导入:import org.junit.Test。
- 声明好单元测试方法以后,就可以在方法体内测试相关的代码
- 写完代码以后,左键双击单元测试方法名,右键-运行-JUnit Test
说明:如果执行结果没有任何异常:进度条为绿色
如果执行结果出现异常:进度条为红色
public class JUnitTest{
//单元测试方法外面可以定义一些属性
int num = 10;
//单元测试方法
@Test
public void testEquals{
String s1 = "MM";
String s2 = "MM";
System.out.println(s1.equals(s2));
//单元测试方法(是非static)内可以直接调用属性(main方法(static的)内需要先造对象,通过对象调用属性)
//单元测试方法可以理解为一个普通的方法
System.out.println(num);
//单元测试方法内也可以调用别的方法
show();
}
public void show(){
num = 20;
System.out.println("show方法。。。");
}
//重新造一个单元测试方法
//选中该单元测试方法去执行时,不再执行上一个单元测试方法,输出结果只有下面单元测试的结果
@Test
public void testToString{
}
}