写在前面:
从这一章开始学习的难度就大大增加了起来,明显感受到需要花更多的时间和精力来实验和解决遇到的问题。不过,成功解决了问题以后还是很有成就感哒~鞠躬~
目录
1. Java的访问控制修饰符有哪些?各有什么访问权限?
2. 子类对于从父类继承的哪些属性与方法是可见的?
3. 什么是组合?有什么作用?
4. 什么是重载?有什么作用?
5. 什么是覆写?有什么作用?覆写父类方法的条件有哪些?
正文
1. Java的访问控制修饰符有哪些?各有什么访问权限?
答:
为了看起来整齐,这里总结了一张表,其余的就不再赘述,表述的应该足够详尽清楚了(再看不懂就吃了你哦!o(* ̄▽ ̄*)ブ)
2. 子类对于从父类继承的哪些属性与方法是可见的?
答:这个问题要先看子类和父类在不在同一个包里
如果在一个包里:
对于public,protected,以及默认方法都是可见的(对应于上图中倒数第二列。)
如果不在一个包里:
此时访问权限已经很小了,只有当父类是public类型而且属性与方法是public和protected的时候子类才是可见的(上图中上半部分倒数第一列)其余情况都是不可见滴~
这里额外提醒一下,我们讨论的问题是“是否可见”而不是“是否拥有”因为只要是从父类继承而来的子类,就一定会有父类的所有内容,只不过在子类中这些并不总是可见的。不可见,也就对应着不可访问。
下面贴几张图吧
先贴贴代码
然后是运行的结果
一切如我们所愿,十分美好~
下面看看去掉注释会发生什么
仔细看可以看到,这里的u被标红了,而getU方法也是灰色的状态,表示不可用。为什么呢?我想你已经知道答案了,什么?还不会?!那!我!就!要!把!你!吃!掉!
(回去看第一张图片的上面的表格)
此时来看一下系统的反馈:
喂!你的眼睛在看哪里啊喂!不要在乎下面的黄色小三角啦~
这再一次验证了子类无法访问父类中的私有成员。
3. 什么是组合?有什么作用?
答:
组合是把某个类的对象作为另一个类的成员组合起来,用来实现“另一个”类的功能,使用的时候你看到的是“另一个”类的方法,而不能看到“某个”对象的方法(因为被覆盖了)。因此,通常要在“另一个”类中使用private来修饰“某个”类的对象以防止被修改。
那么就有这样一个疑惑了:组合和继承的区别?
组合强调“has-a”的关系,而继承强调“is-a”的关系。举例,鸟不是飞机,飞机不是鸟,但是鸟和飞机都可以飞,因此“飞”这个属性,就具备被重用的可能,可以不加修改直接被所有能飞的东西统用。假设“飞”这个属性有1000行代码,现在鸟类已经写好,需要写飞机类。显然我们不能使用继承的方法,一方面继承会显得不伦不类,另一方面,有很多属性鸟具有但是飞机不具有,一旦继承,那么鸟类所有的不属于飞机的方法也要写,这是多余而完全没有必要的。
你打算重新写一遍这个“飞”的属性吗?(不许重写,你敢重写我就敢吃了你(╯▔皿▔)╯)
不过,既然有现成的东西,那肯定不能放过。这个时候就体现出来组合的好处了。飞机其他属性照写不误,等到飞的时候,就直接使用鸟类的飞(注意飞机类的数据成员中有鸟类对象)。这样就实现了代码重用。
4. 什么是重载?有什么作用?
5. 什么是覆写?有什么作用?覆写父类方法的条件有哪些?
答:第四问和第五问将合在一起解答
关于多态方面的知识是我学习时的一大难点所在,为了更好理解,复习的时候先写了一个word,这里就直接粘过来了。顺便还有这个word里提到的几张picture,从上到下顺序为多态1,多态2,多态3
(里面废话可能比较多,轻喷~惜惜鞠躬~)
多态
多态是指一个程序中,同名的不同方法共存的情况。看来计算机区分方法不仅仅依靠方法名,这在之后将会讨论。
Java中提供两种多态的机制:重载(overloading)与覆写(overriding)
- 重载
重载:方法名称相同,参数类型或个数不同
编译器视角:
方法签名=方法名称+参数类型+参数个数
组成唯一键。并不以返回值类型不同而区分不同的方法。这比较好理解,不再额外举例。
事实上,同一个类中通常会提供多个重载方法,以供传参情况不同时区别使用。Java内部有一个名为addAll的函数,就有两种形式,第一种,参数只有一个为Collection类的对象c;第二种在第一种的基础上多一个参数为int类的对象index。具体功能与主题无关,这里不展开叙述。
最后再补充一句,重载只需要一个类即可完成,并不一定需要继承后再重载。
- 覆写
子类对父类的同名方法(方法名称相同,参数相同,返回类型相同)重新进行定义,即在子类中定义与父类中已定义的同名而内容不同的方法。
此外,覆写时子类的返回类型可以向上转型到父类的返回类型。
我们约定,在java代码中,如果你对父类的某一个方法进行了覆写,则需要在覆写的地方进行标注“@Override”
这里的理解需要花一点时间,详细可参见对本节代码图片的解释。(多态1,2,3)
多态1:正常代码,作为覆写的示例。传进去的参数无意义,仅仅用于调用正确的函数,而子类实现了对父类的覆写,因此最终结果为8.
多态2:出现错误,名称为“正在尝试分配更低的访问权限”
多态3:仍可正常运行。
(暂时不存在的多态4:)如果不在一个包内,那么由于父类无修饰符,只有包访问权限,因此子类将无法访问父类,更无法继承,代码必将报错。
现在我们给出覆写需要满足的条件:
- 子类的访问修饰符权限应等于或大于父类,不能变小(如多态2中错误所示)
2.子类的返回类型能够向上转型成为父类的返回类型(如多态3中所示)
3.异常也要能向上转型为父类的异常
4.方法名、参数类型及个数必须严格一致
注意:
覆写只能针对非静态、非final、非构造方法
在JDK中,很多父类的方法被子类重新覆盖,赋予了不同的含义,如Object类中的boolean equals(Object obj)方法
最后是练习覆写的代码:
好啦,这一章的分享就是酱紫~
累趴了鸭.jpg
所以——
你要是不点赞的话。。。
至少也给羽惜点个关注呀~
学习的心得体会将第一时间更新
期待小红点呦~
晚安玛卡巴卡,溜啦溜啦