关键字
interface接口的深入解 析
先说结论,接口的出现是为了打破类(只能描述一类事物的特性,对于某些不属于任何一个类的,界定不清楚的行为无法正确描述,很难用类描述清楚的行为,如果强行用类去描述,那么继承去该类的子类都拥有这种特性,但现实是子类是没有这种特性的,例如捕猎,你把写在动物的抽象类里面,但不是每一种动物都具备捕猎这项技能的,但继承于该抽象类的动物都继承了这项技能,也就意味着都会捕猎,这显然是不符合逻辑,也造成了方法资源的浪费)的逻辑的局限性。
接口的使用其实和抽象类的使用更类似一点,只不过接口不具备类的特性而已
接口的出现不仅是为了描述这类事物,而且能让这类事物更好的配合多态去使用(所以接口其实也是可以看作一个基类型的)
什么时候该用接口而不是用抽象类
1.要实现的方法(功能)不是当前类族的必要(行为)描述
2.要为不同类族实现同样的方法(功能),其实这就是打破了类的单继承性
3.其实这两者都是突破了类的概念的局限性,有些确实是用一类事物是描述不清楚的
注意点:不要将接口的意义和多态的意义混为一谈,多态只是接口的其中的一个意义,当然这也是接口当中非常重要的意义
abstract抽象类的深度解析
先说结论,抽象类的出现是为了更好的实现多态,专门来刻画现实中大家都有同样的功能,但每个人实现的又不一样,例如吃东西,大家都会吃东西,但大家吃东西的方法都不尽相同,如果单带用普通类继承去实现的话,意味着他们吃东西d额方式都一样,这显然不符合逻辑,如果不把吃东西的方法写在基类上,仅仅只是在每个人那里写一个吃东西的方法,这样当去调用吃东西的方法的时候,就需要为每个人吃东西的方式专门定制一个方法,这样就造成方法的重载了,而不能使用多态,以不变应万变,大大降低了效率,平白无故编写了很多方法,浪费了资源。所以抽象类的出现就是来描述这类现实事物,配合多态的使用,更好的提高代码的效率,可以以不变应万变。顺便说一句,抽象类的设计思想就是模板式设计思想(作为基类更的刻画现实事物配合多态使用)
类的深度理解,继承的深度理解
java没有对类进行分类,我自身的理解是将类分成两种,一种是基类,一种是实体类,基类是来描述一类事物的抽象性,概念性描述,是一类事物,而实体类是来描述某个实体事物的抽象性,概念性描述,不是一类事物,区别很大。基类又再细分成两种,一种是普通基类(object),一种是抽象基类,普通基类刻画的是大家不仅用有同一个功能,并且实现都一样,而抽象基类是用来刻画大家都有同样的功能,但实现不一样的。
继承的深度理解:继承隐含的逻辑关系是is a,子类是父类的一种,而接口隐含的是有没有这种行为,具体接口深度理解在上面写了
多态的深度理解
前面写过多态的理解,写的是多态实现出来后的效果,现在写的是理解怎样才能实现多态这种效果的。多态的基础是继承和覆盖重写,对象的向上转型,继承让基类可以指向不同类型的子类,为多态接受任何不同类型的子类打下基础(或者说动态绑定不同的实现子类打下基础),而覆盖重写,因为接受的是不同类的子类(指向不同类型的子类对象),那对应的功能也应该随着指向的变化而变化,而方法覆盖重写就可以实现这种变化。最后是向上转型,使用向上转型让子类转变成基类才能以基类的身份接受不同类型的子类对象(指向不同类型的子类对象)。
补充两个关键字
static
从两个角度去理解
1.实际使用意义
用static修饰的属性或方法标志着他是属于类的,是为他的实例对象所共享的,也就是说对他的每一个实例对象都是一样的
2.生命周期
用static修饰的结构是随着类的加载而加载的,而类只加载一次就保存在缓冲区里了,至于非静态结构就是随着对象的加载而加载的,每个对象都独立的拥有一套类的非静态结构,而对于静态结构则是共享一套,对于每个对象都是一样的。根据二者的生命周期不一样,静态不能调用非静态,而非静态可以调用静态,因为对象的加载要晚于类的加载,静态要想调用非静态结构只能通过创建对应类的对象才能调用,也就是要加载了对象才能调用。
final就从他意义上理解即可,就是最终的,不可变的。用来修饰方法,说明该方法就是最终版本了,不可被覆盖重写,用来修饰类,说明该类就是最终版本了,不能被继承
对于一些要变化的结构是不能修饰的,如构造器,抽象方法,抽象类,接口,静态的修饰也没有意义,本质上本身对于大家都是一样的。属性修饰也没有意义。
补充类和接口的深度(大白话)理解
1
类可以作为基类,也可以作为一个个体类(不存在继承关系的类),普通的类(非抽象类)作为基类的时候是作为一个真模板(不仅做的事情一样,做的方式也要求一模一样)。而抽象类作为基类的时候是作为一个假模版(要求做的事情一样,但做的方式不一样)。关于真模板和假模版的大白话理解:例如我要求两个人都要在两天内在王者荣耀这款游戏中打上荣耀王者,A学生选择了找五个NB的好朋友组队上分打到荣耀王者,B同学选择了上淘宝付费请了个代练打上荣耀王者。这就是他们做的事情一样(都是两坛之内打上荣耀王者),做的方式不一样(一个是找好朋友五排上分打上荣耀王者的,一个是花钱请代练打上荣耀王者的)
2
而接口也是作为一个假模版存在的,但与抽象类的假模版不一样。一个是只对行为的假模版(动态特征),一个是对事物的假模版(静态特征(属性)加动态特征(行为)),对于一些行为难以划分到一类事物的时候就需要用到接口了。例如:飞行这项行为,如果你把这类行为划分到动物这类事物的话,明显逻辑错误了。因为鸟是动物,也会飞,但鳄鱼也是动物,但他不会飞,所以就产生逻辑矛盾了,所以就需要接口出现去刻画这些行为了
3
要区分开类作为基类(或者说是模板)和个体类的使用,设计类的时候还是有很大区别的。类如果作为继承出现的话,并且不是继承的最后一个的话,那就是作为基类使用了。接口就必定是作为模板来使用了,抽象类也是必定是作为模板来使用了,因为抽象类和接口本身都不能造对象。抽象类必定存在继承关系,而接口必定存在实现关系,继承在类里面出现就必定有类作为模板来使用。而接口一旦出现实现关系就必定作为模板来使用了。
4
但是要注意一个非常重要的点。我们用一个类去继承一个类(模板),或者说去实现一个接口(模板),我们除了可以在做的事情和这些模板是一样的情况下照着他们来做,还可以加入一些自己的个性化需求(也就是模板里面没有做过的事情)