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访问权限控制的重要性
人在什么面前最容易失去抵抗力? 美色,算是一个,比如说西施的贡献薄就是忍辱负重.以身报国.助越灭吴:金钱,算是另外一个,我们古人常说“钱乃身外之物,生不带来死不带去”,但我们又都知道“有钱能使鬼推磨” ...
随机推荐
- hdu3415 Max Sum of Max-K-sub-sequence
Max Sum of Max-K-sub-sequence Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64 ...
- 34. LotusScript中的错误处理程序
错误处理程序是所有严肃的程序的必要部分.但是在Lotus Notes开发中,很多程序员编写LotusScript代码时,并没有写专门的错误处理代码的习惯.这能够行得通,主要是因为LotusScript ...
- ok6410 u-boot-2012.04.01移植二修改源码支持单板
继ok6410 u-boot-2012.04.01移植一后修改代码,对ok6410单板初始化,主要包括时钟.串口.NAND.DDR等初始化.这些工作在以前的裸板程序都写了,直接拿来用.我觉得先写裸板程 ...
- 开发人员如何上google查资源,如果浏览国外资源方法
启动浏览器后15秒左右,浏览器的右上角就会出现图标 启用防火墙功能(右上角墙形图标),这时候程序就会去寻找网上代理,从而达到访问GOOGLE的效果,提示如果不访问google网站,可再点击一下关闭防火 ...
- 【Zookeeper】源码分析之Watcher机制(一)
一.前言 前面已经分析了Zookeeper持久话相关的类,下面接着分析Zookeeper中的Watcher机制所涉及到的类. 二.总体框图 对于Watcher机制而言,主要涉及的类主要如下. 说明: ...
- NG2入门 - 根模块
根模块 app.module 建议大家先去学习angularjs官网的英雄教程后再进行后面的阅读,app.module.ts 就是ng2应用中的引导启动模块也称根模块 import { NgModul ...
- Python第一天 安装 shell 文件
Python第一天 安装 shell 文件 python里面一切都是对象 object 代码缩进:建议用四个空格来缩进,不要用tab键 安装 Linux自带python,windows需要下载m ...
- iOS开源项目周报0112
由OpenDigg 出品的iOS开源项目周报第五期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. GD ...
- virtualbox 中的linux 共享文件
首先要安装VirtualBox的增强版功能(VBoxGuestAdditions) 在 设备--->安装增强版功能----->运行,重启电脑. 出现这个问题,看看安装增强功能的时候,有没有 ...
- wife信号如何传播
方法一:像哈利波特一样穿墙而出 无论是wife信号还是广播信号本质上都属于电磁波.x光穿透力强所以可以穿透人体给体内照相,但是wife信号作为电磁波虽然也可以穿透墙而过,但是他的穿透能力实在是太弱了. ...