oop知识复习

类方法与类变量前面有static修饰,它们是属于整个类的,而不是属于某个实例的,所以类方法只能调用其他类方法或类变量,而不能调用实例方法。判断类方法时,看前面有没有static修饰。类方法或类成员变量可以直接使用类引用,不需要实例化,一般作为工具类使用。

实例方法也叫对象方法,必须实例化后才可以使用。实例方法的限制比较宽泛,既可以调用该类中的类方法,也可以调用该类中的实例方法。

一个类中的main()函数作为一个类方法,可以直接调用该类中的类方法或类变量,但是在main()中必须将该类实例化后,才可以调用对象方法。

类方法在该类被加载到内存中时就分配了内存空间,但是对象方法只有在实例化后才会被分配内存空间。

Interface

Java中的接口是一系列方法的声明,没有构造器,没有变量(只能是常量,定义为public static final类型),没有方法的实现(抽象方法),往往在Interface中定义ADT,然后通过Class给出方法的具体实现,并且一个Class可以实现多个接口,还可以使用多个Class给出一个接口的不同实现方式。

由于接口中并没有定义constructor,也无法保证所有实现类都使用了相同名字的constructor,故客户端需要知道谋克具体实现类的名字,这也是一种外泄,为了避免这种情况,我们可以使用静态工厂函数,如:现有一个Graph<L>接口,它有ConcreteEdgesGraph<L>和ConcreteVerticesGraph<L>两种实现,我们可以在Graph接口中加入这样一个函数

封装(Encapsulation),就是把对象的variable和methods结合为一个整体,尽可能的隐藏内部具体实现,以便控制用户对类的修改和访问数据的程度,减少了可能的模块间干扰,达到降低程序复杂性和提高可控性的目的。

好的代码往往隐藏内部的实现(information hiding):将API和具体实现完全分开,各模块间通过接口来实现交互,各模块间互不干扰。我们可以通过API的设计,仅提供客户端需要的方法,其他成员均定义为private类型来做到信息隐藏。

严格继承(static Inheritance),子类只能添加新方法,无法重写父类中的方法,在无法重写的方法前有关键词final,关于关键词final:

1. A final field:防止变量的值被修改。

2. A final method:防止方法被重写。

3. A final class:防止方法被继承。

Overriding(覆盖/重写)要求:重写的函数要求与原函数有相同的名字、参数列表、返回值类型;实际执行时调用哪个方法,运行时决定。当一个子类重写了父类的方法时,它仍然可以使用关键词super来调用父类中的该方法。

我们往往在重写方法前面加上 @Override,作用是告诉编译器这是一个重写方法,如果父类中有该方法,则覆盖;否则在子类中作为一个新方法来使用。所以如果想要覆盖父类中的方法时,最好还是写上@Override,这样有利于编译器检查错误。

abstract class(抽象类):使用关键词abstract修饰的类为抽象类。如果一个类里面包含一个或多个抽象方法(只有声明、没有主体),类必须被定义为抽象类。

严格继承(static Inheritance),子类只能添加新方法,无法重写父类中的方法,在无法重写的方法前有关键词final,关于关键词final:

1. A final field:防止变量的值被修改。

2. A final method:防止方法被重写。

3. A final class:防止方法被继承。

Overriding(覆盖/重写)要求:重写的函数要求与原函数有相同的名字、参数列表、返回值类型;实际执行时调用哪个方法,运行时决定。当一个子类重写了父类的方法时,它仍然可以使用关键词super来调用父类中的该方法。

我们往往在重写方法前面加上 @Override,作用是告诉编译器这是一个重写方法,如果父类中有该方法,则覆盖;否则在子类中作为一个新方法来使用。所以如果想要覆盖父类中的方法时,最好还是写上@Override,这样有利于编译器检查错误。

abstract class(抽象类):使用关键词abstract修饰的类为抽象类。如果一个类里面包含一个或多个抽象方法(只有声明、没有主体),类必须被定义为抽象类。

抽象方法要用关键词abstract来声明:

abstract void fun();

由于方法没有主体,所以不能用抽象类创建对象,可以看出,抽象类是为了继承而存在的,这里要注意,如果一个子类继承了抽象类,那么子类一定要实现父类的抽象方法,否则就需要把子类也定义成abtract类型。

抽象类中可以有普通的成员变量和普通的方法,但是接口中只能有抽象方法(默认为public abstrct),可以说接口是一种极端的抽象类,并且一般不在接口中定义变量。一个类只能继承(extends)一个抽象类,但是一个类可以遵循(implements)多个接口。

 
  1. class ClassName implements Interface1,Interface2,[....]{

  2. }

有关接口与抽象类在设计层面的区别,可以查看查看参考资料

Polymorphism, subtyping and overloading

多态的三种类型:ad-hoc polymorphism(特殊多态)、Parametric polymorphism(参数化多态)、Subtyping(子类型多态)

ad-hoc polymorphism集中体现为方法的Overloading(重载),多个方法有相同的名字,但有不同的参数列表(必须),返回值类型也可以不同。Overloading是一种静态多态,在编译阶段时决定要具体执行哪个方法;与之相反,Overriden methods则是在run-time时进行动态检查。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值