Java-面向对象之(抽象类+接口)

本文详细介绍了抽象类和接口的概念、语法及应用场景,对比了两者之间的区别,并对Object类进行了深入解析。

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

一、抽象类

1、什么是抽象类

向我们之前讲的类,比喻成了制造洗衣机的图纸,能够描述一个完整的洗衣机。
如果现在有一个类,它不能完整的描述一个对象,不能完整的描述一个洗衣机,那么它就被称为抽象类。

2、为什么会出现抽象类

  1. 如果一个类中的方法没有实际的代码块,没有具体的工作,具体的工作都是由重写这个方法中完成的,这个方法就被称为抽象方法,这个方法所在的类就被称为抽象类。
  2. 在继承体系下,有些方法必须要进行重写,并且调用方法时,必须调用重写的方法,如果再在调用的时候,方法没有重写,那么肯定会调用父类的方法,为了防止这一错误发生,所以就产生了抽象类,继承抽象类,必须要重写方法,以防止方法没有被重写,而造成错误。

3、抽象类的语法

语法都是大部分是依据抽象方法出现的:

  1. 抽象方法和抽象方法被abstract修饰,抽象方法默认被public修饰
  2. 抽象方法由于没有具体的工作,所以可以没有方法体
  3. 由于抽象方法没有具体的工作,所以抽象类必须要被继承,继承之后的类要重写里面的抽象方法
  4. 如果不想重写抽象方法,那么这个类也变成抽象类,因为这个类继承了抽象方法却没有重写,那么这个类也不能完整的描述一个对象
  5. 如果再有一个类,继承了这个继承了抽象类的抽象类,那么这个类必须要重写里面的抽象方法,出来混,迟早要还的,既然你有胆量写出抽象方法,就要做好被重写的准备!
  6. 抽象方法是要被重写的,所以不能被final,static,private修饰,要满足重写的规则(不熟悉重写的,看我上一篇关于面向对象之(封装+继承+多态)的文章)。
  7. 抽象类中可以有抽象方法,也可以没有抽象方法,抽象类不太严格,比较佛系。
  8. 由于具有抽象方法,使得这个类不能完整的描述一个对象,所以不能实例化,产生一个对象。
  9. 抽象类也是类,也有普通的成员变量和成员方法
  10. 抽象类中,由于不能实例化对象,也就不能初始化成员变量,所以我们可以自己写出构造方法,通过构造方法来初始化成员变量。

二、接口

1、什么是接口

为了理解接口,抽象出一个生活中的例子:像你的笔记本上的usb接口,或者电源插口,如果你的数据线或者充电器插头,满足插口的协议,也就可以使用这个usb接口和电源插口。

用Java知识去理解:usb接口和电源插口就是Java中的接口,接口就是一个规范,只要满足这个规范,就可以使用这个接口,接口就是多个类的公共规范,是一种引用数据类型。

2、为什么会出现接口

  1. 为了解决Java中不能实现多继承的问题
  2. 为了解决在继承时,要关注类型,所以产生了接口
    继承和接口都为了实现代码的复用
    继承只能单继承,是子类只能继承一个父类,一个父类可以有多个子类,但当有子类需要的方法,父类中没有,并且由于是单继承,所以出现了接口,类可以实现多个接口。
    只要符合接口这个规范,就可以实现这个接口,不要担心类型,忽略类型。

3、接口的语法

接口是一个比抽象类更抽象的特殊的类

  1. 接口使用interface关键词定义
  2. 接口名使用大写的I开头,表示代表的是一个接口
  3. 接口中默认的方法是抽象方法,且必须要有抽象方法,默认使用public abstract修饰,不能有普通的方法
  4. 可以有default修饰的方法,也可以有static修饰的方法
  5. 接口中的成员变量必须是public static final修饰
  6. 由于有抽象方法,所以接口不能实例化出对象
  7. 由于接口中默认的方法是被public abstract修饰,变量是被public static final修饰,所以为了代码的简洁,修饰符可以隐藏不写。
  8. 在子类中重写接口中的抽象方法时,不能使用默认的访问修饰符,也就是default,因为接口中的方法的访问修饰符是public,所以为了满足重写的规则,必须是子类中重写的方法必须是public。
  9. 由于接口中的变量被就地初始化了,所以不需要构造方法和静态代码块
  10. 实现接口的子类必须重写接口中所有的抽象方法,如果不重写,就是抽象类,需要使用abstruct修饰。
  11. 类实现接口时,使用关键字implements实现
  12. 接口之间的继承使用关键字extens实现

4、接口的特性

1、接口之间的继承

为了实现代码的复用,不用每一次都要调用好几个接口,接口与接口之间可以继承,并且一个接口可以继承好几个接口,一个类可以实现好几个接口,但一个类只能继承一个类。

5、接口的应用

三、抽象类和接口之间的区别

四、Object类

1、什么是Object类?

人的祖先可能是炎黄大帝。
Object类就可以看作炎皇大帝,类就可以看作人,所有类的祖先是Object类,Object类是所有类的父类,所以Object类的对象的引用可以接收任何一个类的对象的引用,然后发生向上转型和动态绑定。

由于类只能继承一个类,所有当类继承了一个类之后,所以这个类就不会继承Object类,但被继承的类同样继承Object类。

1、equals方法

equals方法是Object类中的方法,用来判断两个数是否相等

如果使用默认的Object类的equals方法去比较对象相不相等,比较的是这两个对象的引用相不相等,引用是代表地址的一组数,由于Java为了安全,是不会将内存地址暴露出来的,所以对地址加密了,所以两个对象的引用肯定不相等,默认的equals方法不符合我们的逻辑。
所以应该在子类中重写equals方法,在equals方法体内编写符合我们逻辑的代码。

例如:创建一个自定义类,人这个类,实例化出两个人这两个对象,赋予两个对象名字和年龄,现在要比较这两个对象相不相等,就要比较名字和年龄相不相等。

手动重写equals方法:

对两个对象进行比较的思路:

一个对象的引用调用重写的equals,将另一个对象的引用作为参数传给equals

第一点:有可能这两个引用指向的是同一个对象,所以直接对这两个引用进行判断,如果相等,就是引用的对象是同一个,直接返回true即可。
第二点:有可能作为参数传给equals的引用和调用equals的引用的类型不是同一个类,也就意味着是对两个不同类型的对象在进行判断,那就没有可比性了。
第三点:如果作为参数传给equals的变量没有存放引用,是个空引用,那么直接返回false
第四点:最后传进去的引用都是正常的了,对名字和年龄进行比较,对名字进行比较也是调用equals,并且String类中也对equals方法重写,String类继承Object类,equals方法使用Object类接收参数,发生向上转型之后,才能调用String中重写的方法,名字是String类型的,String类型也是引用类型,和自定义类型一样。
判断年龄,年龄是具体的数,所以对两个变量进行判断即可。

使用idea编译器解放双手自动生成重写的方法:
第一步:
右击,点击Generate或者之间按快捷键:Alt+Insert
在这里插入图片描述
第二步:
点击图中第五行,一路点击next即可。
在这里插入图片描述

2、hashCode方法

3、toString方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值