面向对象的编程(OOP)

在之前我们讨论了ADT,包括什么是?啥特点?怎么实现?三方面,我们已经知道了ADT就是提供了一种抽象隔离使用与实现。现在就具体说说,这种抽象隔离的具体实现方法OOP

1.OOP的基本概念

1.1Object

真是世界都可以的场景都可以用对象进行分割,而每个对象主要都有两个特征,反别是states和behaviors,我们在考虑面向对象编程时,第一件事就是划分出object的states和behaviors,在java种object用class表示,status用fields表示,behaviors用methods表示,举例如下:

其中成员与方法还分为static与instance,简单来说就是类变量和类方法与一个类相关联,并且每个类出现一次。使用它们不需要创建对象。而实例方法和变量在每个类的实例中出现一次,只有实例被创造了才会使用该方法。

1.2Interface,Abstrack Class,Class

这里把三个内容放在一起说,因为三者做从抽象抽象程度说:Interface>Abstrack Class>Class。

1.2.1Interface

接口主要是用来定义ADT的,接口中只有方法的定义,没有实现,接口直接可以继承与扩展,一个class可以实现多个接口,一个接口可以有多种实现类。

接口中没有constructor,可以使用static的valueof方法返回一个具体的实现。

我们可以让认为接口就是对ADT的操作进行了定义并给出spec,让具体的类去实现,而实现不影响接口,所以实现了使用与实现的分离。

可以使用default方法把实现中共性的方法在接口中实现,虽然这样破坏了抽象,但是可以减少代码量,在一定条件下可以使用。

1.2.2Abstrack Class

抽象类与接口很像,除了继承上的区别,其他几乎一致。

抽象类中含有抽象方法,只定义没实现,需要使用具体的class继承抽象类然后实现抽象方法,但是这种继承是一对一关系,依旧是一个class只能继承一个抽象类,但抽象类可以被多个class继承。

因为有抽象方法,抽象类也不可以直接实例化,可以看到这里就是在继承方面与interface有所区别,其内部可以实现一些共性的方法,因此抽象程度有所降低。

1.2.3class

类这个概念就比较简单了,一般作为抽象程度最低的,他需要对所有的方法都给出实现,对继承的抽象方法必须全部实现。

1.3信息隐藏

我们已经了解了Interface,Abstrack Class,Class的概念,也知道了他们的抽象程度关系,那我们对应的类或者接口中的信息如何得以保护,不被其他外部的类或者接口知道呢,这就是信息隐藏,下面这张表描述了不同修饰符下的信息的可见程度:

 怎么做到信息隐藏呢?

(1)仅提供客户端所需的功能,并且所有其他成员都应该是私有的

(2)仔细设计API

(3)您总是可以在不破坏客户的情况下晚一些公开一个私人成员

2.继承与重写

2.1继承(Inheritance)

前面继承的概念已经介绍一些了,接口可以继承接口,类可以继承类,继承的作用主要是解决代码复用

2.2重写(Overriding)

重写是允许重新实现满足子类的特殊要求的方法的一种方式。但不要改变原方法的本意

如果父类的方法被final修饰,无法被子类重写。

重写的函数有完全一致的签名,包括参数,返回值,以及修饰符,加上@Overridie,编译器会检查方法的签名是否一致,实际上执行时调用那种方法是在运行时决定的,也就是说看运行类型。

可以使用super使用父类的方法,再在重写方法中进行扩展,在构造器中如果同时使用super与this要把super放在前面。

3.多态,子类型,重载(Polymorphism, subtyping and overloading

3.1三种多态

3.1.1特殊的多态-多方法重名-重载(overloading)

重载:多个方法具有同样的名字,但是不同的参数列表或者返回值类型

价值:方便客户端调用,客户端可以用不同的参数列表,调用类似功能的方法

重载是静态类型检查,在编译阶段就决定了具体执行哪个方法,也就说是看编译类型的。

重载的规则:

(1)必须不同的参数列表

(2)相同或不同的返回值类型

(3)相同或不同的修饰符

(4)相同或不同的异常

这里重载和重写有很多值得对比的地方:

 这里的协变我们可以先简单理解为子类的方法的规约比父类方法的规约要么一样要么更强,要满足父类的的规约是完全可满足的。

其中在方法使用时,会发生重载与重写同时出现的情况,具体我们可以依照下面这个方式进行判断:

       首先重载是静态类型检查,因此如果在编译类型检查发现没有某个方法是一定会报错,而如果静态类型检查通过,也就是说在编译类型里,有定义的方法,上下的就要在运行阶段去判断运行类型到底是父类型还是子类型进行重写的判断,进而选择正确的方法。

3.1.2参数多态化和泛型多态化(Parametric polymorphism and Generic programming

参数多态化:指方法针对多种类型时具有同样的行为,此时可使用同一的类型表达多种类型。

在java中叫做泛型(Generic),在运行时根据具体的指定类型确定具体类型(在编译成class文件时,把泛型用指定类型代替,一般用Object,除非指定通配符继承某个父类,就用那个父类替换)

泛型使用的三种形式:

(1)泛型类

 

(2)泛型接口

 

(3)泛型方法

 只在方法内部出现

3.1.3子类型多态(Subtyping Polymorphism

一个类只有一个父类,但可以实现多个接口。

一个子类型的规约不能弱化超类型的规约

例子:List 的子类 ArratList和LinkedList。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值