您的位置 首页 java

Java初学0基础也能看明白继承的作用,Java初学教程-10

大家好,我是你的老师父,坚持一件事情真的很难,我发现写到第10篇就很累了,毕竟还有生活还要忙工作,但是还是要坚持下去,要对爱学习的人负责,对自己也是一个意志的磨炼吧!那今天继续上次讲的访问权限修饰符。

今天将讲 protected ,当然这个也会引入一个面向对象中第二个经典的概念:

继承保证0基础也能学会的,所以大家认真去看文章,如果哪里没明白,评论问我

一、protected修饰符

什么是protected呢?翻译过来就是受保护的,其实这个单词并不能很直接的表达这个修饰符本身的含义。

还记得private的作用吧?保护类的属性、方法仅仅在当前类中可见!

那protected的作用呢?三点如下:

1、保护当前类的方法和属性在本类中可见

2、保护当前类的方法和属性仅仅在当前包中可见

3、保护当前类的方法和属性可以在子类中可见

看下边例子:

firstName已经是protected的了,但是在当前类中,还是可以访问使用firstName的,这就是第一条,当前类方法和属性在本类中可见。那再看下边代码:

这个Test类是和Person都在同一个包中,这个包叫做test,那看Test类中使用Person的firstName也是没问题的;再看Person中的sayHello()方法,也是protected的,在Test类中同样是可以调用的,但是再看下边的代码

Test01在包test01中,和Person属于不同的包了,那Test01这个类可以使用Person中的firstName属性和sayHello方法吗?看截图显然是报错了。再看提示是什么?把鼠标放在sayHello方法上,看下图:

提示’sayHello()’ has protected access in ‘test.Person’,什么意思呢?就是说 sayHello方法在test包的Person类中是受访问保护的。

所以这两个例子就充分说明第二条:当前类的方法和属性仅仅在当前包中可见!

关于第三点,我必须先讲讲继承的概念了!

二、面向对象三大特征之二:继承

继承什么意思呢?和咱们所说的继承是一个意思,就是小子继承 老子 的基因,小子继承老子的财产,小子继承老子的房子!对,有钱的人的儿子就是富二代,有权的儿子就是官二代,那没钱没权的就是你的老师父!

那大家看到什么规律没?就是父类也就是老子有什么,那儿子就有什么,那老子的名字是不能继承的把,因为老子的名字是私有的private的,那房子、财产、基因这些是可以继承的,同样他们是受保护的或者是公开的。

所以继承的概念的就是说子类可以拥有父类的一些属性和方法,这些属性和方法必须是protected的或者public的或者是默认的(后边再讲这种访问权限)

Java 中继承怎么写呢?有个关键字:extends

写法如下:首先新建一个 Father 类内容如下

有个private String name属性,因为名字是个人的,儿子叫不了,但是price是protected的,儿子可以继承。有个 构造方法 ,需要设置姓名,还有个方法,用来设置赚了多少钱了就是setPrice。

之后建个儿子类,新建完成后,在public class Son后边写上 extends Father 如下:

报错啦!那先跟大家讲讲继承中对象创建的流程:

在创建对象的过程中子类会先去调用父类的构造方法,也就是super,这个关键字表达的是调用父类的方法或者属性

super();这行代码是说调用父类的构造方法,在子类的构造方法中super();是必须写在第一行的,如果父类构造方法有参数比如有name参数,那需要在super中传入参数类似super(name);

那如果父类和子类都有默认构造方法的话,子类默认的构造方法第一行可以不用写super();因为默认会执行,但如果没有默认构造方法,只有有参数的构造方法,那子类必须得写上super();并且传递的参数和父类构造方法一样。

所以可以理解super();就是调用父类构造方法,其实就是这个意思,当然super还有其他用,一会儿讲。

那这个时候大家应该明白了,在构造对象的时候,首先会从子类一层层回调父类的构造方法,比如Son继承Father,Father继承Grandpa,Grandpa继承自Person,Person继承自Object(这个类是Java中默认的类,所有类都继承自Object,虽然大家从未写过,但其实都是默认继承Object的)那最终Son是回调到Object的构造方法了,等父类的构造方法执行完毕后,其实也就是super方法执行完毕了,然后依次有执行Person、Grandpa、Father、Son的构造方法剩余部分逻辑。

首先大家回忆回忆或回去翻翻第6篇,讲构造方法的文章,重点强调了如果定义了有参数的构造方法,那无参构造方法会失效!

那大家考虑刚才出错这个例子,那Father中是有有参数的构造方法的,没有默认构造方法,因为默认的已经失效了,但是Son中没有创建有参构造方法,那是不是说Son中是有默认的构造方法的?对其实是有的,那既然有默认构造方法,我们有去实现这个默认构造方法,那是不是默认会回调无参的super();方法?那Father中是没有无参构造方法的!所以报错说Father这里没有无参的构造方法!大家现在明白了没?很绕,但是多读几遍,慢慢理解!

怎么解决呢?很多种方法:

1、Father中创建无参构造方法,问题解决!

2、Son中创建任意构造方法,调用super();传入你爸爸的名字,比如super(“谁爸爸”);

看下图:

这是第一种方法,是不是问题解决了?

再看第二种:

首先还是去掉默认构造方法

那我在Son中创建一个无参的构造方法,再调用有参数的super();方法,是不是也报错了,说明super其实是调用了父类的构造方法。那或者这样,再看下边:

是不是也不报错了?其实和上边一样,只不过这次的super中的参数是通过构造方法传递进来的!

那super和构造函数的问题大家明白了吧!

那咱们继续刚才没说完的继承

那Father类中有privat的name,有protected的price,我能继承哪个呢?如果能够继承,那我应该能够拿到他的东西,也就是能够访问到属性或者方法,看下边代码:

那大家看,Son其实是没办法使用父类的name作为名字的,已经红色的了报错了!那price是可以使用的,也就是说Son继承了Father的钱!~

那看看下边错误提示吧说name has private access in Father,就是说父类的name是私有的访问权限:

那再看public的setPrice,子类也是可以调用到的,对上一节说过,public的访问权限是最高的,它不分继承、包这些,整个项目都可以访问。

所以继承的话,如果想让子类拥有父类的属性或者方 法,那就不要设置private的权限,否则子类是无法继承下来的!

好了,那protected这个访问权限也介绍完了,但是继承还得再说两句,大家现在仅仅知道继承是如何去写,怎么让子类继承父类的属性和方法了,但是为什么需要继承呢?我都每个类都去写不就好了?

那我就说说继承的作用:

1、可以做模板!什么意思呢?就比如人都会走路,都会说话,那这是人类的统一的行为,你比如婴儿、儿童、少年、青年、成年、老年他们都有不同的特点,这么多小类你不会都把走路、说话、吃饭、睡觉、上厕所的逻辑每个都复制一遍吧?你不嫌累我还嫌看你代码累呢!所以可以把人类统一的一些行为属性封装在Person中,子类就可以直接使用了,这个类其实就是模板类!

2、可以做扩展,什么意思呢?你比如成年人这个类别,那按职业分可以分为程序员、工程师、码农(好吧都一样,我就知道这些职业:P)然后你就可以基于成年人来再进行扩展了,不用改变原有类的逻辑,这样做是最安全的,因为成年人这个类可能很多人在用(比如你在一个很大的项目中,参与人员很多),这种情况下你如果修改了成年人, 那可能很多人的逻辑都受影响,那你怎么办,只能扩展啊,扩展就是用继承的方式去做!

好了就举着两个例子吧,其实讲到设计模式的时候,你会发现继承这个特性是肥肠肥肠常用的!

文章来源:智云一二三科技

文章标题:Java初学0基础也能看明白继承的作用,Java初学教程-10

文章地址:https://www.zhihuclub.com/200855.shtml

关于作者: 智云科技

热门文章

网站地图