前言
上节课说了ADT的相关内容,这节课老师讲述了ADT思想在编程语言中的具体体现-》OOP。OOP思想我们已经很熟悉了,这次其实就算是复习。
一、OOP的基本概念
OOP最典型的特点就是封装,继承,多态。我们这里讲的更细一些,大概分为如下四点:
二、基本概念
类,对象,属性,方法
设计类的时候,我们需要注意该类的行为有哪些,状态有哪些,这构成了对象或类的两个基本的内容即方法和属性。
如下图所示,所有对象都是一个类的实例,该类规定了它的方法与作用域。类的方法与属性都是它的成员。类定义了类型与具体实现。如果不严格的说,我们可以把类的方法叫做接口(API),即定义了用户可以如何与实例进行交互。
而对象的话,除去上面所讲的内容,invoke a method其实就是调用一个方法,也就是call a function。
我们这里需要辨析一个内容,就是实例方法、实例成员变量与类方法、类成员变量。具体来说,类方法就是类声明的时候前面带有static修饰的,反之亦然。带有static修饰的方法,可以说只是实现一个过程而不保存状态。这种方法仅仅与类有关,可以通过类名直接调用(类似Math.abs()等)。而实例方法必须通过new一个对象来调用。
这种类方法,在程序实现的时候在内存中的存储也存储在类的栈中,而非对象的栈中。
三、接口
接口比较类似于没有属性和方法实现的抽象类,可以实现多继承。
我们在新建变量的时候最好通过接口名来创建,这样抽象程度更高,客户端体验也就越好。
改错:
首先这张图里我们知道,接口是不能有构造器的。另外下面它也不能直接用ArraySet做返回值,因为这样不够抽象(虽然讲道理编译也能过)。然后就是下面的实际ArraySet实现的时候没有重写contains方法,这样编译器必然会报错。
对于Java8之后的语法,我们可以在接口中包含static方法,这在以前是不被允许的,我们可以通过这种方法来确定所有的子类中包含名字相同的构造器,而不需要知道该接口的某个具体实现类的名字。
当然接口中不是完全不可以有函数体,除了static修饰,我们还可以通过default修饰接口中的方法。
如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法
为什么要重写呢?是因为,类在继承接口中的default方法时,不知道应该继承哪一个接口中的default方法。
如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么子类会继承父类的b方法而不是继承接口中的b方法。
接口在信息隐藏方面也有很大的作用,如:
我们可以把不同的属性或者方法用不同的字符来修饰以确保他们不同的安全性,如private,protected,public等
一些设计原则如下:
四 继承与重写
Java想要实现多继承只能通过接口来实现,我们不能通过一个类继承多个类。另外,除非我们有显而易见的理由去使用继承特性,否则应当尽量避免使用继承。
如果一个方法被final修饰,那么他所指向的地址就不能改变,即,他在子类中也无法被重写。同理,被final修饰的属性也不能更改指向的内容。另外被final修饰的类也不能被继承。
final是java中的一个关键字,可以用来修饰变量、方法和类。用关键词final修饰的域成为最终域。用关键词final修饰的变量一旦赋值,就不能改变,也称为修饰的标识为常量。如果一个类的域被关键字final所修饰,它的取值在程序的整个执行过程中将不会改变。
假如说整个类都是final,就表明自己不希望从这个类继承,或者不答应其他任何人采取这种操作。换言之,出于这样或那样的原因,我们的类肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)。
除了接口还有抽象类。
抽象类除了用abstract修饰之外,其他的语法层面和普通的类没有什么区别。
五 多态 子类型 重载
注意重载和重写还是有一些显著区别的。重载的话,是方法层面的,重点是参数与返回值的
区别;而重写的话就是子类与父类间的关系。另外,重载在编译前就能检查到,重写的话得在运行时检查到,因为与重写相关的问题都与内存的分配相关,内存只有在运行时才会被分配。
另外我们需要学会集合中泛型的用法,在开发中十分方便。
总结
以上就是今天的大致内容,还是很多的。想要全部理解需要一定的时间,加油啊,爱看番的大哥哥(雾)。