初识Java三大特性

初识Java三大特性

继承

首先,理解继承是什么?

我们通常情况下,理解Java的面向对象编程,拓展到继承是父子的关系。

对于初学者来说,这样理解是没有任何问题的。那么,再深入的去理解呢?

为什么要有继承?

Java是拓展性很好的一门语言,从跨平台实现的JVM上就能看出这一特点。

而继承,其实很大程度上也是拓展性的体现。

一个很好的内存模型——洋葱模型:

解释

Dog继承自Animal,其实对于Dog类来说就是在Animal类的基础上扩展了一些新的东西。

Dog保留了Animal提供的eat方法,同时新增了自己特有的run(),sleep()方法。这就是类的继承。

扫描二维码关注公众号,回复: 13119348 查看本文章

当然了,这只是继承的一个简单的demo。其实继承总的来说就是一个内存的拓展关系,当你学习jvm之后,你会对这种拓展关系更清晰。包括JVM怎么去对方法进行寻址,怎么去对属性进行寻址;父类有属性a,子类还定义属性a,JVM怎么去寻找;子类重写父类的方法,JVM怎么去判定,这些都是继承涉及到的方方面面。

多态

多态其实是我更想去聊的东西,因为多态本身就是依赖与继承关系所衍生的特性,没有继承就没有多态。

其实多态可以从宏观上面解释上述继承留下的一些问题。我们一起来看看多态是什么吧!

怎么理解多态?

我们可以从网上,从书籍以及各种资料上看到说:多态表示的是多身份多状态,那又怎么去理解这句话呢?

看下面的代码

Person p = new Chinese();

父类的声明指向子类的构造方法,活脱脱的一个多态例子。

那么问题来了,现在的对象p是什么类型呢
可能接触一些视频或者资料,会看到说p是Person类型,因为什么类型的声明,就是什么类型的对象。能够理解很多资料上为什么这样解释,因为通过instanceof关键字判断p是否是Person类型返回值为true。但是,咱们不能忽略,instanceof判定是扩展性判定的,即向上延伸。

a instanceof A ,只要a是A的类型或者是A的子类,他都会返回true 所以这样判定是不严谨的 而且更重要的是这样一来就解释不了多态多身份的含义了。
最好的判定类型的方式,利用反射 p.getClass() 我们进行输出可以很容易知道p是Chinese类型,由此知道一个对象是什么类型不是由类型声明决定的,而是由构造方法决定的。以此作为基础,咱们去理解多态多身份的解释

首先,上述代码 表示构造了一个Chinese类型的对象,他现在的身份是Person类型
所以此时咱们通过p.去调用类成员,只能访问到Person类拥有的成员(属性或方法),而我们可以通过强制类型转换:
Chinese c = (Chinese)p;
此时表示咱们将p对象的身份改变为了Chinese,用c去接收,我们发现此时c就可以访问到Chinese类型拥有的成员和方法了。
而如果咱们的声明是
Person p = new Person();
表示当前的对象p是Person类型的
所以咱们通过(Chinese)p去强转会抛出类型转换异常
因为对于此时的对象p来说,他是Person类型的 他并没有Chinese类型的身份。
所以,从某一层面来说,继承拓展的也是对象的身份,这便是多态,多身份的体现。

基于多态的方法寻址

多态执行方法或者.属性是什么过程呢?

咱们知道Person p = new Chinese();
此时p对象的身份是Person 所以在搜索成员的时候,他会优先在Person的空间内去搜索,如果搜索不到这个成员,表示当前的身份没有这个成员,编译就报错了。如果搜索到了这个成员,那么他会再到子类里面去搜索,如果在子类找到了这个成员,那么就使用的是子类的成员。如果子类成员搜索完毕,没有找到这个成员,那么就执行Person搜索到的成员了。
体现在咱们教科书里归纳的就是,
p只能访问到Person类内部的属性和方法,如果方法在Chinese里重写了,那么执行子类重写的方法

封装

java的世界全是对象,你不能看到单独存在的一个方法,一个属性。

而这种对象宏观上怎么理解呢?

和面向过程的编程去对比,怎们很容易看到像C这种语言,一个功能就是一个函数。

面向过程的理解:

现在有一个业务需求,实现一个造车的方法。

面向过程的编程语言直接动手就了一个造车的流程用来造车,每一次造车的时候就不断的执行这一个流程,这就是功能函数。

面向对象的理解:

还是同样的业务需求,面向对象怎么理解呢?

面向对象的编程,会根据造车这个需求,去找寻能造车的人,也就是我们的类对象。

在Java的世界里,我们通常情况下是在类里面编写函数的,通过各种权限访问,能够暴露我们的对象对外的访问权限。

比如我的对象A,外界知道他能造车,因为他对外暴露了造车的方法(public)。而具体怎么造车我们就不知道了,这套业务流程通过private,让他留在了对象A的体内,不对外暴露,这就是封装的特性。

猜你喜欢

转载自blog.csdn.net/qq_38557583/article/details/115293595