JavaSE学习【Day 12】

本文详细讲解了Java中的面向对象特性,包括Object类的toString()和equals()方法的重写,多态的概念及其表现形式,以及转型操作。通过实例展示了多态在方法调用中的特点和好处,并探讨了抽象类与抽象方法的使用规则。同时,文章还提到了instanceof运算符的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaSE学习【Day 12】

今天主要学习了面向对象的多态,大家观看后有什么疑问或好的建议可以评论区留言,谢谢!

面向对象

Object类

又称老祖宗类,是java中的所有类的父类

在Java中的所有类都会直接或间接的继承自Object类

toString()

把对象数据以字符串的形式表示

直接打印一个对象的引用的时候,默认打印的是调用toString()方法的返回值

需求:

在打印一个javabean类型对象的引用的时候,其实是想要了解这个对象的基本信息->成员变量的值

解决:

在子类中重写toString方法,因为打印对象引用时候默认会调用toString(),toString功能需要,实现不满意,就重写

子父类继承关系下,toString方法的重写:

class Animal{
    private String type;
    private String name;
    //重写toString()
    @Override
    public String toString() {
        return "Animal{" +
                "type='" + type + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
class Cat extends Animal{
    
}
equals()

比较引用数据类型的数据

== 与 equals:

==:可以比较所有数据类型的数据,基本数据类型比较数据值,引用数据类型比较对象的地址

equals:只能比较引用数据类型的数据

比较两个数据是否相等:

对象1.equals.(对象2);

Object类中equals方法的实现:

默认比较对象的地址,可以通过重写equals方法实现比较对象的内容

需求:

比较两个引用数据类型对象的时候,想要比较两个对象的所有成员变量的值是否都相等,而非比较对象地址

解决:

子类中重写equals方法,实现比较对象内容非地址

equals方法的重写:

class Animal{
    
}
class Cat extends Animal{
    private String type;
    private String name;
    //重写equals()
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Cat cat = (Cat) o;
        return Objects.equals(type, cat.type) &&
                Objects.equals(name, cat.name);
    }
}

多态

面向对象的三大特性之一

多态:多种形态->多种表现形式

多态的最终体现:

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

前提:

继承关系

实现关系

使用:

当多态调用的时候,会调用子类中的重写方法

多态调用成员的特征:

成员变量:编译运行看父类

成员方法:编译看父类,运行看子类

多态又叫行为的多态,行为的不同实现方式

多态要配合方法的重写才有意义

多态引用对子类内容不可见

多态的好处:

解耦

灵活性高

便于后期维护

例:

public class Class01_Test {
    public static void main(String[] args) {
        //多态:父类引用指向子类对象
        Animal animal = new Cat();
        animal.shout();
    }
}
class Animal{
    public void shout(){
        System.out.println("我会叫!!!");
    }
}
class Cat extends Animal{
    public void shout(){
        System.out.println("喵喵叫!!!");
    }
}

转型

引用变量只能调用它编译类型的方法,不能调用它运行类型的方法。

向上转型:

子类的对象可以当作父类的对象来使用

向下转型:

父类的对象可以当作子类的对象来使用

通过多态的引用调用子类中新增内容的时候,需要向下转型

注意:

向下转型时候,如果类型不注意,就有可能出现ClassCastException类型转换异常

instaceof 运算符

引用 instaceof 类型

判断前面的引用是否是指向后面类型的对象|子类对象->是true|否false

抽象类(abstract)

抽象类与抽象方法:

抽象方法:被abstract修饰的方法

没有方法体

要求定义在抽象类中

抽象类:被abstract修饰的类

抽象类的特点

1、抽象类可以存在具体方法,可以存在抽象方法,可以存在成员变量、构造器

2、抽象类不能实例化(不能创建对象)

3、一个抽象方法必须被重写,重写可以为抽方法定义方法体

4、抽象类的使用:通过具体子类的对象使用

具体的子类:抽象了所有抽象方法+按需新增
抽象的子类:按需重写抽象方法+按需新增

5、一个抽象方法一旦被重写,后续是否需要重写根据实现

6、abstract关键字不能跟private,final,static,native一起使用

例:

abstract class Animal{
    abstract void shout();
}
class Cat extends Animal{
    @Override
    public void shout(){
        System.out.println("喵喵叫!!!");
    }
}
//或
abstract class Animal{
    abstract void shout();
}
abstract class Cat extends Animal{
    @Override
    public void shout(){
        System.out.println("喵喵叫!!!");
    }
}
class Dog extends Animal{
    @Override
    public void shout(){
        System.out.println("汪汪叫!!!");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值