Java之面向对象例子(三) 多态,重写,重载,equals()方法和toString()方法的重写

时间:2021-11-12 13:21:55

重写(继承关系)

子类得成员方法和父类的成员方法,方法名,参数类型,参数个数完全相同,这就是子类的方法重写了父类的方法。

重载

在一个类里有两个方法,方法名是完全一样的,参数类型或参数个数不同。

例子:

//父类
public class Pet {
public void eat(){
System.out.println(
"pet eat");
}
public void eat(String a){ //重载,同一个类,方法名相同,参数类型或个数不同
System.out.println("pet String eat");
}
}
//子类
public class Cat extends Pet{
public void eat(){ //重写
System.out.println("cat eat");
}
public void eat(int a){
System.out.println(
"cat int eat");
}
}

toString() 方法重写

返回该对象的字符串表示。通常, toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

 

返回:
该对象的字符串表示形式。

直接调用 toString() 方法

Java之面向对象例子(三) 多态,重写,重载,equals()方法和toString()方法的重写

还可以点击 Source 中的Genenrate toString() 方法来选择要使用该方法的参数 和方法 来生成官方的 toString() 方法

public class Pet {
public void eat(){
System.out.println(
"pet eat");
}
public void eat(String a){ //重载,同一个类,方法名相同,参数类型或个数不同
System.out.println("pet String eat");
}
@Override
//官方提供的重写toString() 方法
public String toString() {
return "Pet [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
+ "]";
}
}

equals方法重写

equals比较两个new实例化的对象返回结果一定为false,重写让他比较对象的属性

public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。

equals 方法在非空对象引用上实现相等关系:

  • 自反性:对于任何非空引用值 xx.equals(x) 都应返回 true
  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true
  • 传递性:对于任何非空引用值 xy 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
  • 对于任何非空引用值 xx.equals(null) 都应返回 false

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 truex == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

 

参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回  true;否则返回  false

instanceof

java中的instanceof运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

public class Pet {
private String name;
private String sex;
public void eat(){
System.out.println(
"pet eat");
}
public void eat(String a){ //重载,同一个类,方法名相同,参数类型或个数不同
System.out.println("pet String eat");
}
@Override
//官方提供的重写toString() 方法
public String toString() {
return "Pet [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
+ "]";
}
public boolean equals(Object obj){
if(obj!=null){
if(obj instanceof Pet){ //判断传入的对象是不是Pet类的
Pet t1=(Pet)obj; //将obj强制转换成Pet
return this.equals(t1.name)&&this.equals(t1.sex); //判断当前对象的属性是否相同
}
}
return false;
}
}

对象转型(casting)
--父类的引用可以指向其子类的对象
--父类的引用不可以访问其子类对象新增的成员(包括属性和方法), 如果硬要访问-->强转
--可以使用instanceof关键字来判断一下这个变量是不是这个类或者是这类的子类

父类的引用指向子类的对象:

public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pet c=new Cat();
c.eat();
}
}

Java之面向对象例子(三) 多态,重写,重载,equals()方法和toString()方法的重写