Java继承多态中的方法访问权限控制
java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多。
最简单的继承多态
声明一个接口BaseIF,只包含一个方法声明
public interface BaseIF {
void Access();
}
一个基类Base,基类实现了BaseIF接口,Access会调用Base类的public函数test()(实现类最好不要有自己的public函数,public函数应提到接口中,这里是为了说明问题方便)
public class Base implements BaseIF {
public void Access(){
test();
} public void test(){
System.out.println("test in Base");
}
}
一个派生类Derived,派生类重写test(),并保持test()的访问权限保持不变,依然为public
public class Derived extends Base {
//@Override
public void test(){
System.out.println("test in Derived");
}
}
Demo入口测试代码
public class Main { public static void main(String[] args) {
BaseIF face = new Derived();
face.Access();
}
}
代码运行结果为:
表明实际调用的test()方法来自Derived类,这便是继承多态的运行方式。
降低派生类中test方法的访问权限
将Derived类中test()的访问权限改为protect或者private,这时IDE会报编译错误,子类重写父类方法时,不可以降低方法的可访问性。
public class Derived extends Base {
@Override
protected void test(){
System.out.println("test in Derived");
}
}
这一点其实很好理解,将测试代码写成下面这样。假如可以在Derived中降低test()的访问权限,那么base.test()应该调用基类的test()方法还是Derived类的?
假如调用Base类的test(),那么子类重写test()变没有什么意义了;假如调用Derived类的,就会出现一个问题,Derived类的test()是protect方法,无法在类外部调用,假如通过基类可以调用派生类的protect或private方法,权限访问控制变出现了漏洞,所以最好的处理方式就是禁止在派生类中降低重写方法的可访问性
public class Main { public static void main(String[] args) {
Base base = new Derived();
base.test();
}
}
提升派生类中test方法的访问权限
将Base类中test()的访问权限改为protect,将Derived类中test()的访问权限改为public,这时程序可以正确执行,说明可以在派生类中提升test()方法的可访问性。
public class Base implements BaseIF {
public void Access(){
test();
} protected void test(){
System.out.println("test in Base");
}
}
public class Derived extends Base {
@Override
public void test(){
System.out.println("test in Derived");
}
}
但有一点需要注意的是,如果Base中test()为private,那么在Derived中是看不到Base的test()的。这时Derived中如果也添加test()方法(无论访问权限是什么),都不属于重写Base的test()方法,Derived的test()方法只属于Derived类本身,而这时也无法实现多态。举例:
public class Base implements BaseIF {
public void Access(){
test();
} private void test(){
System.out.println("test in Base");
}
}
public class Derived extends Base {
//@Override
public void test(){
System.out.println("test in Derived");
}
}
public class Main { public static void main(String[] args) {
BaseIF face = new Derived();
face.Access();
}
}
运行结果:
test in Base
Java继承多态中的方法访问权限控制的更多相关文章
- Java之路(五) 访问权限控制
在Java中,所有事物都具有某种形式的访问权限控制. 访问权限的控制等级从最大到最小依次为:public,protected,包访问权限(无关键词)和private. public,protected ...
- Java中protected方法访问权限的问题
先看Test.java 此时出现上文提到的错误:The method clone from the type Object is not visiuable. 我们已经清楚Object.clone() ...
- JAVA笔记 -- 访问权限控制
访问权限控制 没有权限控制的时候,由于所有的接口都是可以访问的.当一个类库部分代码,发现有更好的方法解决的时候,可能其他接口会发生改动.这会导致另一个地方的引用该类库的程序发生崩溃.为了解决这种问题, ...
- (转)浅析Java中的访问权限控制
原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案
多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...
- Java中的访问权限控制
Java提供了public, private, protected 三个访问权限修饰词,提供了以下四种访问权限控制机制: 1.包访问权限: 2.Public访问权限: 3.Private访问权限: 4 ...
- Java 访问权限控制:你真的了解 protected 关键字吗?
摘要: 对于类的成员而言,其能否被其他类所访问,取决于该成员的修饰词:而对于一个类而言,其能否被其他类所访问,也取决于该类的修饰词.在Java中,类成员访问权限修饰词有四类:private,无(包访问 ...
- 论Java访问权限控制的重要性
人在什么面前最容易失去抵抗力? 美色,算是一个,比如说西施的贡献薄就是忍辱负重.以身报国.助越灭吴:金钱,算是另外一个,我们古人常说“钱乃身外之物,生不带来死不带去”,但我们又都知道“有钱能使鬼推磨” ...
随机推荐
- windows窗体继承问题
窗体继承什么时候用的到呢?当我们使用三层架构来编写我们的cs程序时,我们的U层大部分是windows窗体.这个时候如果我们有一些公共变量,或者是一个窗体需要使用另一个窗体的数据.或者是有一些用于判断的 ...
- phper談談最近重構代碼的感受(1)
作爲一個工作時間並不算長的phper,卻參與了兩家公司的代碼重構.下面談談我的一些感受. 在mjm公司,當時我負責日常的需求開發和2.0的重構.當初的重構更多的是clean codes和一些代碼規範上 ...
- 【Zookeeper】源码分析之持久化--FileTxnLog
一.前言 前一篇已经分析了序列化,这篇接着分析Zookeeper的持久化过程源码,持久化对于数据的存储至关重要,下面进行详细分析. 二.持久化总体框架 持久化的类主要在包org.apache.zook ...
- 结构-行为-样式 - Angularjs 环境下Ztree结合JqueryUI实现拖拽
新的项目中有一个需求是要求客户标签可以自定义,于是就想到了客户体验,让客户自己拖拽标签进行组合查询.但是理想很丰满,现实很骨感.一开始就遇到了问题,各个插件之间的结合问题,折腾一翻之后终于实现了这个功 ...
- GMap学习笔记
GMap学习笔记 1.GMap体系详解 What is the map control (GMapControl)? This is the control which renders the map ...
- hdu1042
#include"stdio.h" #include"stdlib.h" #include"string.h" #define N 1000 ...
- [SQL基础教程] 5-1视图
[SQL基础教程] 5-1视图 视图和表 从SQL角度看视图就是一张表 视图与表的差别 表保存了实际的数据,视图保存的是SELECT语句: 视图的优点 节省存储空间: 将常用的Select 语句保存成 ...
- wife信号如何传播
方法一:像哈利波特一样穿墙而出 无论是wife信号还是广播信号本质上都属于电磁波.x光穿透力强所以可以穿透人体给体内照相,但是wife信号作为电磁波虽然也可以穿透墙而过,但是他的穿透能力实在是太弱了. ...
- 最简单的MFC
#include <SDKDDKVer.h> #include <afxwin.h> #include <afxext.h> #include <iostre ...
- CODE[VS]-最小数和最大数-整数处理-天梯青铜
题目描述 Description 输入n个数,n<=100,找到其中最小的数和最大的数 输入描述 Input Description 第一行一个整数n 接下来一行n个整数,每个整数不超过231 ...