Java第五章学习心得

写在前面:

从这一章开始学习的难度就大大增加了起来,明显感受到需要花更多的时间和精力来实验和解决遇到的问题。不过,成功解决了问题以后还是很有成就感哒~鞠躬~

目录

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)

  1. 重载

重载:方法名称相同,参数类型个数不同

编译器视角:

方法签名=方法名称+参数类型+参数个数

组成唯一键。并不以返回值类型不同而区分不同的方法。这比较好理解,不再额外举例。

事实上,同一个类中通常会提供多个重载方法,以供传参情况不同时区别使用。Java内部有一个名为addAll的函数,就有两种形式,第一种,参数只有一个为Collection类的对象c;第二种在第一种的基础上多一个参数为int类的对象index。具体功能与主题无关,这里不展开叙述。

    最后再补充一句,重载只需要一个类即可完成,并不一定需要继承后再重载。

  1. 覆写

子类对父类的同名方法(方法名称相同,参数相同,返回类型相同)重新进行定义,即在子类中定义与父类中已定义同名而内容不同的方法。

此外,覆写时子类的返回类型可以向上转型到父类的返回类型。

我们约定,在java代码中,如果你对父类的某一个方法进行了覆写,则需要在覆写的地方进行标注“@Override”

这里的理解需要花一点时间,详细可参见对本节代码图片的解释。(多态1,2,3)

多态1:正常代码,作为覆写的示例。传进去的参数无意义,仅仅用于调用正确的函数,而子类实现了对父类的覆写,因此最终结果为8.

多态2:出现错误,名称为“正在尝试分配更低的访问权限”

多态3:仍可正常运行。

(暂时不存在的多态4:)如果不在一个包内,那么由于父类无修饰符,只有包访问权限,因此子类将无法访问父类,更无法继承,代码必将报错。

现在我们给出覆写需要满足的条件:

  1. 子类的访问修饰符权限应等于或大于父类,不能变小(如多态2中错误所示)

2.子类的返回类型能够向上转型成为父类的返回类型(如多态3中所示)

3.异常也要能向上转型为父类的异常

4.方法名、参数类型及个数必须严格一致

注意:

覆写只能针对非静态、非final、非构造方法

在JDK中,很多父类的方法被子类重新覆盖,赋予了不同的含义,如Object类中的boolean equals(Object obj)方法

 

 

 最后是练习覆写的代码:

 

 

好啦,这一章的分享就是酱紫~

累趴了鸭.jpg

所以——

你要是不点赞的话。。。 

至少也给羽惜点个关注呀~

学习的心得体会将第一时间更新

期待小红点呦~

晚安玛卡巴卡,溜啦溜啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值