14【Java多态】面向对象之多态、Java 基础 object 类介绍、equals() toString() 方法

一、面向对象之多态性
何谓多态?

广义上:

  1. 方法的重写、方法的重载
  2. 子类对象的多态性

狭义上:

就是指子类对象的多态性

多态的前提:
  1. 要有继承关系
  2. 要有方法的重写
  3. 父类的引用指向子类的对象
思考:属性有多态性嘛?——没有。

只有方法可以多态

对象类型转换

Man m = (Man) p; //发生错误: ClassCastException ——类型转换异常

注意:

为了解决类型转换异常可以在向下转型时使用 instanceof:

temp instanceof Man:temp对象是否是 Man的一个实例(对象),如果是返回true

public class Person(){
    
}

public class Woman extends Person (){
    public void show(){
        System.out.println("beautiful")
    }
    ...
}

...
    //多态:动态绑定——编译看左边,运行看右边
    Person p = new Woman(); //

	//在多态前提下如何调用子类对象中特有的属性和方法?——采用向下转型的方式:
	Woman w = (Woman)p;//注意:p指向的对象必须是 woman 的对象才可以这么做

	Creature cre = new Woman();
	Person per = (Person) cre;
	per.show();//这里调用的仍然是 woman 对象的方法,person是障眼法,要看 实际指向的对象到底是谁
	


二、Object 类的介绍
基础:
  1. object 类是所有类的父类
  2. 如果一个类没有显式继承其他类,那么默认继承object类
  3. object只有一个空参的构造器
  4. object中有11个方法,其中三个wait方法是重载方法
equals方法:

【一道面试题】:equals 和 == 的区别是什么?

⭐==:

  1. 基本数据类型,比较的是具体的内容是否相等;
  2. 引用数据类型,比较的是地址值是否相同(两个变量指向的是否是同一个对象)

⭐object中的equals方法:

public boolean equals(Object obj){
    return (this == obj);
}

像 String、data 等核心类库基本上都重写了 equals 方法,用来比较具体内容;

自定义类如果没有重写equals 方法,那么调用的是 object 类中的 equals 方法来比较地址值。但是我们自定义类的时候通常都会重写 equals 方法,用来比较内容。

public class Person{
    
    String name;
    int age;
    
    @Override
    public boolean equals(Object obj){
        if(this == obj){//同一个对象,内容一定相同
            return true;
        }
        if(obj instanceof Person){
            //向下转型???为什么是向下???
            Person p = (Person) obj;
            //比较内容
            return (p.age == this.age) && this.name.equals(p.name);
        }
        //return super.equals(obj);
        return false;
    }
    
}


public class EqualsTest{
    
    public static void main(String[] args){
        Person p1 = new Person("cc",20);
        Person p2 = new Person("cc",20);
        System.out.println(p1.equals(p2));//如果没有上面那个 重载的 equals方法,这里的返回值是false,如果重载了,则可以比较大小,此时返回的是true
        
    }
}
toString 方法:

Object中的 toString方法就是输出地址。

注意:当我们输出对象的名字时,默认调用的是当前对象的 toString 方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值