难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.实例方法与类方法
演示:
实例方法与类方法
实现:
Student类:
Main类:
结果:
从运行结果来看,准确无误。
下面我们就来看看实例方法和类方法在继承中有什么变化。
2.访问修饰符public
public:表示紧随其后的元素对任何人都是可用的。
演示:
在People类中,使用public修饰实例方法和类方法。在Student类中调用People里实例方法和类方法。
实现:
People类:
Student类:
Main类:
结果:
从运行结果来看,正确无误。运行过程中也没有发现错误。
上面通过this关键字调用父类的实例方法和类方法,但不推荐使用this调用类方法。
下面通过super关键字调用父类的实例方法和类方法。
People类无需修改。
修改Student类:
Main类无需修改。
结果:
从运行结果来看,正确无误。运行过程中也没有发现错误。
上面通过super关键字调用父类的实例方法和类方法,但不推荐使用super调用类方法。
下面通过类名调用父类的类方法。
People类无需修改。
修改Student类:
Main类无需修改。
结果:
从运行结果来看,正确无误。运行过程中也没有发现错误。
上面通过类名调用父类的类方法,但不推荐使用子类类名调用父类类方法。
综合:
修改Student类:
结果:
我们知道类方法只有一份,那么继承之后,子类和父类各自保存一份还是共享一份?
实际上,子类和父类共享一份类方法。
提示:
因为public访问修饰符无论是在同一个包下还是在不同包下都可以正常访问,所以这里就不演示不同包情况。
3.访问修饰符protected
protected:与private作用相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员。
演示:
在People类中,使用protected修饰实例方法和类方法。在Student类中调用People里实例方法和类方法。
实现:
People类:
Student类:
Main类:
结果:
从运行结果来看,准确无误。
被protected修饰的元素只能被子类所使用。
提示:
因为protected访问修饰符无论是在同一个包下还是在不同包下都可以正常访问,所以这里就不演示不同包情况。
4.默认的访问修饰符
默认访问修饰符,当没有使用前面提到的任何访问指定名词时,它将发挥作用。这种权限通常被称为包访问权限,因为在这种权限下,类可以访问在同一个包(库构件)中的其他类成员,但是在包之外,这些成员如同指定了private一样。
演示:
在People类中,使用默认的访问修饰符修饰实例方法和类方法。在Student类中调用People里实例方法和类方法。
实现:
People类:
Student类:
Main类:
结果:
从运行结果来看,准确无误。
这是子类和父类在同一包下,如果将父类放置与子类不同包下,情况如何?
演示:
将People类移至main包下。
实现:
People类只需修改包:
Student类只需修改导入People类的位置:
Main类无需修改。
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Student.javaError:(15, 13) java: 找不到符号 符号: 方法 sayHi(java.lang.String)Error:(17, 13) java: 找不到符号 符号: 方法 sayHello(java.lang.String)Error:(20, 14) java: sayHi(java.lang.String)在main.People中不是公共的; 无法从外部程序包中对其进行访问Error:(22, 14) java: sayHello(java.lang.String)在main.People中不是公共的; 无法从外部程序包中对其进行访问Error:(25, 16) java: 找不到符号 符号: 方法 sayHello(java.lang.String) 位置: 类 lab.StudentError:(27, 15) java: sayHello(java.lang.String)在main.People中不是公共的; 无法从外部程序包中对其进行访问
只有同一个包下的类才可以访问被默认访问修饰符修饰的元素。
5.访问修饰符private
private:表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素。private就像你跟客户端程序猿之间的一堵墙,如果有人试图访问private成员,就会在编译时得到错误信息。
演示:
在People类中,使用private修饰实例方法和类方法。在Student类中调用People里实例方法和类方法。
实现:
People类:
Student类:
Main类:
结果:
错误信息:
文字版:
/Users/admin/Workspace/Java/Hello/src/lab/Student.javaError:(13, 13) java: 找不到符号 符号: 方法 sayHi(java.lang.String)Error:(15, 13) java: 找不到符号 符号: 方法 sayHello(java.lang.String)Error:(18, 14) java: sayHi(java.lang.String) 在 lab.People 中是 private 访问控制Error:(20, 14) java: sayHello(java.lang.String) 在 lab.People 中是 private 访问控制Error:(23, 16) java: 找不到符号 符号: 方法 sayHello(java.lang.String) 位置: 类 lab.StudentError:(25, 15) java: sayHello(java.lang.String) 在 lab.People 中是 private 访问控制
子类继承其父类的所有public成员和protected成员,无论子类在哪个包中。如果子类与其父类在同一个包中,它还继承父类的被默认访问修饰符修饰的成员。
提示:
因为private访问修饰符无论是在同一个包下还是在不同包下都可以正常访问,所以这里就不演示不同包情况。
6.添加新实例方法和新类方法
什么叫新实例方法和新类方法呢?
就是实例方法签名和类方法签名与父类里面不同。
演示:
添加新实例方法和类方法。
实现:
People类:
Student类:
Main类:
结果:
从运行结果来看,准确无误。
其中,Student类中studentSayHi和studentSayHello是新增的实例方法和类方法。然后在构造方法中调用父类和子类中的实例方法和类方法,请大家按规范编写代码,调用本类成员使用this关键字(也可以省略),调用父类使用super成员关键字,调用类变量请使用类名。
提示:
覆写父类中的方法在后面单独一章中讲解。
8.继承中通过公共或受保护方法与private成员通信
子类不继承其父类的私有成员。 但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。
演示:
通过方法与父类中的私有成员通信。
实现:
People类:
Student类:
Main类:
结果:
从运行结果来看,准确无误。
9.继承中通过公共或受保护嵌套类与private成员通信
嵌套类可以访问其封闭类的所有私有成员 - 包括字段和方法。 因此,子类继承的公共或受保护嵌套类可以间接访问超类的所有私有成员。
演示:
通过嵌套类与父类中的私有成员通信。
实现:
People类:
Student类:
Main类:
结果:
从运行结果来看,准确无误。
父类中私有成员可以通过公开或受保护的方法和公开或受保护的嵌套类两种方式进行通信。
下一章我们将继续探讨继承中特性:构造方法在继承中的变化。
总结
- 子类从其父类继承所有成员(字段,方法和嵌套类)。
- 子类可以访问父类中所有public实例方法和类方法,无论是否在同一个包下。
- 子类可以访问父类中所有protected实例方法和类方法,无论是否在同一个包下。
- 子类可以访问父类中所有被默认访问修饰符修饰的实例方法和类方法,前提是在同一个包下。
- 子类不继承其父类的私有实例方法和类方法。 但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。
- 嵌套类可以访问其封闭类的所有私有实例方法和类方法 - 包括字段和方法。 因此,子类继承的公共或受保护嵌套类可以间接访问超类的所有私有成员。
至此,Java中继承与字段相关内容讲解先告一段落,更多内容请持续关注。
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
下一章
“全栈2019”Java第四十八章:重写方法@Override
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号gorhaf,私信“Java学习小组”。
- 方式二:关注公众号gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!