细说继承和接口,为什么要用接口替代继承?

在开始之前,我们要了解什么是继承?什么是组合?什么是接口

继承

继承其实就是子类从父类里得到了什么属性或者行为

从字面上的理解就是,你自己是你自己,你爸是你爸,但是你和你爸是继承的关系,你爸是父类,你是子类,你爸的东西你都会有,除了私有(private)的东西,你从你爸那里继承过来的东西,例如房子,你可以拿过房子来就住,但是你也可以对房子进行改造,这种方法就叫重写(overriding)

在子类中,如果想要引用父类的东西,则要用super关键字,且super关键字要放在第一行执行

也就是说,你买了一块地皮,你觉得你爸的这个房子的框架设计挺好,想拿过来用,再在原来的基础之上,先去掉一些东西之后,再添加一些东西,你首先要做的就是,先把你爸房子的框架拿来先,拿来之后再对框架上面的设计做一些修改,不然你先修改了设计,再去拿框架的话,显然是不对的,你所做的修改都会被覆盖

每个类有且只有一个父类,没有声明父类的,其父类为Object,子类继承了父类非private的属性和方法,可以增加自己的属性和方法,以及重写父类的方法实现

你只可能有一个亲生的父亲,不能同时有两个,而且你从你爸那继承过来的东西,不能是你爸个人私有的,例如个人日志,隐私物品

new过程中,父类先进行初始化,可通过super调用父类相应的构造方法,没有使用super的情况下,调用父类的默认构造方法。

在创造你之前,首先要有父亲这个概念

子类对象可以赋值给父类引用变量,这叫多态;实际执行调用的是子类实现,这叫动态绑定

public class Father{
	void hone(){
		System.out.println("这是你爸的房子");
	}
}

public class Son extends Father{
	//重写父方法
	void hone(){
		System.out.println("这是儿子的房子");
	}
}
class Main{
	public static void main(String[] args){
		Father a=new Son(); //这叫多态
		a.home();
		//实际输出的是 这是儿子的房子  这叫动态绑定
	}
}

什么叫做静态绑定

4.1节我们提到,子类可以重写父类非private的方法,当调用的时候,会动态绑定,执行子类的方法。那实例变量、静态方法和静态变量呢?它们可以重名吗?如果重名,访问的是哪一个呢?
重名是可以的,重名后实际上有两个变量或方法。private变量和方法只能在类内访问,访问的也永远是当前类的,即:在子类中访问的是子类的;在父类中访问的是父类的,它们只是碰巧名字一样而已,没有任何关系。
public变量和方法,则要看如何访问它。在类内,访问的是当前类的,但子类可以通过super.明确指定访问父类的。在类外,则要看访问变量的静态类型:静态类型是父类,则访问父类的变量和方法;静态类型是子类,则访问的是子类的变量和方法。我们来看个例子,这是基类代码:
在这里插入图片描述

重载与重写

重载是指方法名称相同但参数签名不同(参数个数、类型或顺序不同),
重写是指子类重写与父类相同参数签名的方法。对一个函数调用而言,可能有多个匹配的方法,有时候选择哪一个并不是那么明显。

继承的基本原理

这里是引用在这里插入图片描述在这里插入图片描述
控制台打印输出
在这里插入图片描述

继承的缺点

继承好用是好用,但是继承会破坏我们的封装性。
父类定义了addAll方法里面调用了父类的add方法
在这里插入图片描述
子类重写了父类的addAll和add方法
在这里插入图片描述
在这里插入图片描述
当我们调用子类的addAll方法的时候,根据代码,首先回去调用父类的addAll方法,而父类的addAll方法调用了add方法,子类重写了add方法,则优先调用子类的方法,子类的方法又调用了父类的add方法,最后又执行了一次sum+=number【i】,,多次累加,使得计算结果不正确。本来父类的方法就是可以正确运行的,但是你拓展之后,却出错了,说明封装性被破坏了

既然封装性会被破坏的话,那么我们怎么处理呢?

  1. 设置有些方法不允许被重写,例如add方法,加上final关键字拒绝重写
  2. 使用组合关系
  3. 使用接口

组合

什么是组合呢?

组合是has-a的关系,继承是is-a的关系,也就是范围大小的说法了
在这里插入图片描述
在这里插入图片描述
父类作为一个属性放在子类里面,也就是子类的范围更加的宽广
但是对于继承来说,父类的范围是比子类大的,例如父类是车轮,子类就是各种品牌的车轮 (is -a)
对于组合来讲,子类就是一辆汽车,而车轮只是一个属性。(has -a)

接口

什么是接口

接口就是一个说明性的类,假设一个动物有一个会运动的接口,但是这个会运动的接口只说明了这个动物是会运动的,并没有详细说明怎么运动,所以,接口只是一个声明,并没有实现。
在这里插入图片描述

那怎么实现接口与使用接口

接口的实现不同于类的继承,一个类可以实现多个接口,但是只能继承一个父类。也就是说你作为儿子,只能又一个爸爸,但是你可以有很多才艺,例如:跑步,弹琴,打代码
在这里插入图片描述
必须说明的是,一个类继承了一个接口之后,必须实现该接声明的所有方法。
我们现在已经实现了一个接口了,那么我们怎么去使用这个接口呢?
在我看来,使用接口和类的多态很相似
在这里插入图片描述
将一个实现类用接口接着,但是实现何种方法确是实现类所说明的,和类的多态和动态绑定很相似

写在最后

我们上面讲了,可以使用组合+接口的方法来代替继承,这是为什么呢?这样子做的原因和好处是什么?

继承至少有两个好处:一个是复用代码;另一个是利用多态和动态绑定统一处理多种不同子类的对象。
使用组合替代继承,可以复用代码,但不能统一处理。
使用接口替代继承,针对接口编程,可以实现统一处理不同类型的对象,但接口没有代码实现,无法复用代码。
将组合和接口结合起来替代继承,就既可以统一处理,又可以复用代码了。

补充:接口与抽象类之间的关系是什么?

含有 abstract 修饰符 class 即为抽象类,抽象类不能创建实际对象,含有抽象方法的抽象类必须定义为 abstract
class。(抽象类可以有不是抽象方法)

接口可以说成是一种特殊的抽象类,接口中的所有方法都必须是抽象的,接口中的方法定义默认为 public abstract
类型,接口中的成员产量类型默认为 public static final。

两者的区别:

a. 抽象类可以有构造方法,接口中不能有构造方法。

b. 抽象类中可以有普通成员变量,接口中没有普通成员变量。

c. 抽象类中可以包含非抽象普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的方法。

d. 抽象类中的抽象方法的访问权限可以是 public、protected 和(默认类型,虽然 eclipse
不报错,但也不能用,默认类型子类不能继承),接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract
类型。

e. 抽象类中可以包含静态方法,在 JDK1.8 之前接口中不能不包含静态方法,JDK1.8 以后可以包含。

f. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问权限可以是任意的,但接口中定义的变量只能是 public
static final 类型的,并且默认即为 public static final 类型。

g. 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。

以上很多知识点都来自《Java编程的逻辑》,如果大家不想花那份钱买纸质版的图书,当当上也有电子版的图书,我用的是微信读书里面的电子版。
在这里插入图片描述
知道的越多,不知道的越多,大家一起努力!!!
————————————————————————————————————
补充一下:关于abstract类的,不能和abstract共存的关键字

1).private :因为一个abstract方法需要被重写,所以不能修饰为private;
2).final:因为一个abstract方法需要被重写。被final修饰的方法是不能被重写的,所以不能同final共存;
3).static:因为一个abstract方法没有方法体。静态方法需要对方法体执行内容分配空间,所以不能同static共存;(abstract是没有实现的,不能产生对象,而是static是属于类的,类本身是已经存在的对象)
4).synchronized: 是同步的,然而同步需要具体的操作才能同步,但abstract是只有声明没有实现的(即,使用synchronized关键字的是需要有具体的实现同步的操作的,但是使用abstract是只有声明而没有实现的,这样就产生了冲突)
5).native:他们本身的定义就是冲突的,native声明的方法是移交本地操作系统实现的,而abstract是移交子类对象实现的,同时修饰的话,导致不知道谁实现声明的方法

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值