Java中的面向对象(抽象类与接口)

因为抽象类实在是跟接口息息相关,这里我们就把抽象类和接口放在一起学习了。(这篇写的比较乱)

What

简单来说使用了abstract关键字来修饰的类就是一个抽象类。Oracle的Java的文档中是这么形容的, an abstract class is a class that is declared absract--it may or may not include abstract methods. Abstract classes cannot be instantiated, but they can be subclassed. An abstract method is a method that is declared without an implementation(without braces, and follows by a semicolon).

1.如果一个类中有抽象方法,那这个类一定要被declared为抽象的也就是一定要加上abstract

2.当一个抽象类被子类继承的时候,子类通常都会提供他的父类(这个抽象类)中所有的抽象方法的实现。但是,如果这个子类没有提供 所有 的抽象方法实现的话,这个子类也必须被声明为抽象类。接口中的没有被声明为default或者static的方法都是 implicitly的抽象,所以abstract的修饰符不用于接口方法。(其实是可以用的,但是这个没有必要)。

抽象类跟接口很相似,你不能实例化他们,而且他们一般都一些带有实现或者没有被实现的方法。但是,在抽象类中,你可以声明一些fields that 不是static和final的。并且定义public, protected还有private的的具体方法。然而在接口中,所有的fields都自动的为public,static和final的,并且所有你声明或者定义的方法(as default method)都是public的。另外,不管是不是抽象类,你都只能继承一个类,然而你可以继承多个接口。


Why

为什么要用到抽象类?或者换句话说什么时候要用抽象类,什么时候用接口?

其实很简单,看了stackoverflow上面一个人的回答有点豁然开朗。Java想通过面向对象的过程来模拟一些东西。本来会以为仅仅有接口也可以实现多重继承啊,那为什么还要抽象类呢?我们可以用一个特别经典的例子,比如说我现在有个animal的类,dog还有cat类都是animal的子类(因为dog和cat都是animal),动物能干什么呢?动物有一些共同的行为,还有不相同的行为。比如说有些动物能飞,有些动物不能,但是所有动物都可以繁殖,所有动物都可以睡觉。注意了,在这里,虽然所有动物都可以繁殖,但是他们的繁殖方式可能有所不同(比如说鸟卵生,狗胎生)。这种情况下,如果我们使用接口,那么所有的动物比如说一个鸟类一个狗类都要在自己的内部实现一个繁殖的方法,(他们各自不同的表现由他们各自类中自己定义的方法来实现,这里我们不考虑了),他们还都必须得实现一个相同的睡觉的方法。如果有100W种动物类,岂不是我们要反复实现100W次相同的代码??(就是睡觉的代码)。这个时候,就要使用抽象类。我们把睡觉定义在抽象类中,作为非抽象方法,所有的动物类的子类都可以通过super.method()来进行调用,然后把繁殖定义为抽象类,要求所有的子类都要自己实现这个方法(繁殖方式不同,实现方式不同)。这样我们就省去了100W次重复对睡觉这个方法的实现了!!这就是为什么要有抽象类,也是抽象了最大的用途!

以下情况使用抽象类:

1.你想要在几个十分相似相近的类之间share代码

2.你希望子类们有许多相同的方法和fields,或者需要除了public之外的访问修饰符(比如说protected或者private)。这个时候就可以使用抽象类

3.你希望声明非静态或者非final的fields,This enables you to define methods that can access and modify the state of the object to which they belong.(这段话我并没有理解)

抽象类(public肯定okay,因为他需要被其他的类来继承,定义为final别的类无法继承。所以不能是final的。抽象类是内部类的时候可以被private修饰,不是内部类时不能被private修饰,为什么呢?内部类时能被外部类访问的,所以抽象类作为内部类的时候是可以为private的,因为无论如何,他是不是private他都能被外部类访问到,也就是说能被其他类继承到)

fields:可以有final的,非final的,static或者非static的变量

method: 抽象,非抽象(public protected, private)(在JAVA8中,抽象类中也可以有default和static的方法了),他甚至可以提供接口的实现


抽象类中可以有抽象方法,可以有非抽象方法,但是有抽象方法的类一定要声明为抽象类。

interface(只能是default或者public)

fileds:默认前面就加上了public static final三个关键字,所以加别的都不对!

method:接口中要么就是默认为abstract的方法(没有方法体),要么也可以定义一些private什么的具有方法体的方法,但是因为接口不能被实例化,所以你也用不到这些方法,原则上可以,但是没有任何意义。


接口只能继承另一个接口,但是抽象类可以继承另外一个JAVA类,并且实现多个JAVA接口。


Consider using interfaces if any of these statements apply to your situation:

  • It is total abstraction, All methods declared within an interface must be implemented by the class(es) that implements this interface.
  • A class can implement more than one interface. It is called multiple inheritance.
  • You want to specify the behavior of a particular data type, but not concerned about who implements its behavior.
此处转载自geeksforgeeks


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值