Java 与C++区别:复写(override)
C++中子类复写父类virtual方法要做到函数参数和返回值类型都一致,而Java中返回值类型可以不同,即子类复写的方法返回值类型可以使父类方法返回值类型的一个子类型。比如
返回类型兼容情况
Java 中不同返回值类型复写
public class Demo {
public static void main(String[] args) {
X x = new Y();
System.out.println(x.getValue());
}
}
public class X {
public Number getValue() {return new Integer(0);}
}
class Y extends X {
public Double getValue() {return new Double(1.0);}
}
上述代码能够成功编译比执行输出1.0。不过对于基本数值类型还是不行的,如下代码无法通过编译:
class X {
public int getValue() {return 0;}
}
class Y extends X {
public long getValue() {return 1;}
}
C++中要求严格一致
class Object {
};
class SpecialObject : public Object {
};
class A {
public:
virtual Object getValue() {
return Object();
}
};
class B: public A {
public:
virtual SpecialObject getValue() {
return SpecialObject();
}
};
int main() {
A* x = new B();
return 0;
}
报如下错误:
virtual.cpp:21:24: error: virtual function 'getValue' has a different return type ('SpecialObject') than the function it overrides
(which has return type 'Object')
virtual SpecialObject getValue() {
~~~~~~~~~~~~~ ^
virtual.cpp:13:17: note: overridden virtual function is here
virtual Object getValue() {
~~~~~~ ^
1 error generated.
可见性
Java
Java中要求子类复写父类方法时,其可见性不能低于父类。如下代码将报错
class X {
public int getValue() { return 0;}
}
class Y extends X {
private int getValue() { return 1;}
}
C++
对复写方法可见性不要求,如下代码可以顺利编译并运行,输出为1.
class A {
public:
virtual int getValue() {
return 0;
}
};
class B: public A {
private:
virtual int getValue() {
return 1;
}
};
int main() {
A* x = new B();
cout<<x->getValue()<<endl;
return 0;
}
异常处理
Java
Java可以在方法参数后用throws指出可能会抛出的异常,来回避try-catch块。当子类中复写这样的方法时,子类中的方法声明抛出的异常范围不能超过父类中所定义的。
如下是可以的,虽然throws声明不是完全一致,子类声明抛出的异常类型是父类声明抛出异常类型中的子类。
class X {
public void call() throws Exception {}
}
class Y extends X {
public void call() throws IOException, ClassCastException {}
}
但是下面的就不行
class X {
public void call() throws IOException {}
}
class Y extends X {
public void call() throws Exception {}
}
C++
C++中没有类似throws声明
Java 与C++区别:复写(override)的更多相关文章
- C++和java多态的区别
C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报 转载自:http://www.cnblogs.com/plmnko/archive ...
- 第一章.java&golang的区别之:闭包
对于golang一直存有觊觎之心,但一直苦于没有下定决心去学习研究,最近开始接触golang.就我个人来说,学习golang的原动力是因为想要站在java语言之外来审视java和其它语言的区别,再就是 ...
- C++与Java的语法区别
C++与Java的语法区别 首先,两个大的不同是主函数和怎样编译的不同,接下来是许多小的区别. main 函数C++//自由浮动的函数int main( int argc, char* argv[]) ...
- Effective Java 36 Consistently use the Override annotation
Principle Use the Override annotation on every method declaration that you believe to override a sup ...
- java的版本区别、下载、配置
参考:http://blog.csdn.net/liujun13579/article/details/7684604 java的版本区别 常用的 java 程序分为 Java SE.Java EE ...
- java的this static public protected private abstract interface 在python的对应,java python一些区别
1.因为工作的原因,最近使用了三个多月的java作为主力语言.很早之前在菜鸟教程也看过java文档两遍,但实践少,处于能看懂写出来不流畅的状态(对于java必须要略懂,不能能看到就头疼跳过,因为现在百 ...
- 7 -- Spring的基本用法 -- 8... 抽象Bean与子Bean;Bean继承与Java继承的区别;容器中的工厂Bean;获得Bean本身的id;强制初始化Bean
7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...
- Android Library和Android APP、Java Library的区别
Android Library和Android APP.Java Library的区别 Android Library在目录结构上与Android App相同,它能包含构建APP所需的一切(如源代码. ...
- JS与JAVA数据类型的区别
JavaScript与Java数据类型的区别 阅读目录 Number String Boolean Null Undefined Object 今天开始正式认真学习js,虽然在平常j2ee开发中也 ...
随机推荐
- padding(内边框), border(边框), margin, 标准文档流, 块级元素和行内元素, 浮动 ,margin的用法
盒模型 在CSS中,"box model"这一术语是用来设计和布局时使用,然后在网页中基本上都会显示一些方方正正的盒子.我们称为这种盒子叫盒模型. 盒模型有两种:标准模型和IE模型 ...
- Java - Tips
001 - Java中print.printf与println的区别? printf:格式化输出,用来控制输出的格式. print:标准输出,不换行. println:标准输出,换行.例如,print ...
- ES6中的元编程-Proxy & Reflect
前言 ES6已经出来好久了,但是工作中比较常用的只有let const声明,通过箭头函数改this指向,使用promise + async 解决异步编程,还有些数据类型方法...所以单独写一篇文章学习 ...
- 利用VS2017跨平台远程调试aspnetcore应用
vs2017开始支持跨平台远程调试coreclr的应用,通常用于调试linux与mac上运行的aspnetcore程序,而如果运行在docker中的应用 要使用跨平台远程调试功能,首先运行corecl ...
- Linux的mv 命令
mv 命令的10个例子 1.移动文件 移动文件时需要注意的是文件的源地址和目标地址必须不同.这里有个例子,想要将file_1.txt文件从当前目录移动到其它目录,以/home/pungki/为例,语法 ...
- (转) CentOS7.4 + MySQL8.0 + Git + Gogs搭建
原文:https://blog.csdn.net/qq_16075483/article/details/80295793 1.装系统,这个不会的下面就不用看了2.CentOS7.X安装MySQL8. ...
- c# winform as3相互调用
C#主要代码: 首先要添加COM组件-Shockwave Flash Object //接收flash发送过来的信息 private void axShockwaveFlash1_Fla ...
- Python基础之好玩的字符串格式化f-string格式
转自白月黑羽 Python3教程 : http://www.python3.vip/doc/tutorial/python/0010/#f-string-格式化 f-string 格式化 f-stri ...
- 堆与堆排序/Heap&Heap sort
最近在自学算法导论,看到堆排序这一章,来做一下笔记.堆排序是一种时间复杂度为O(lgn)的原址排序算法.它使用了一种叫做堆的数据结构.堆排序具有空间原址性,即指任何时候都需要常数个额外的元素空间存储临 ...
- maven-插件-不同的开发环境指定
通常指定 dev环境 和 prod 环境 <profiles> <profile> <id>prod</id> <build> <re ...