C++ 和 Java 中的默认虚拟行为有何不同及其异常处理的比较

简介: 在 C++ 中,类成员方法默认是非虚拟的。可以使用virtual关键字将它们设为虚拟。例如,Base::show() 在以下程序中是非虚拟的,并且程序打印 “Base::show() called”

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战


一、C++ 和 Java 中的默认虚拟行为有何不同

方法的默认虚拟行为在 C++ 和 Java 中是相反的:


在 C++ 中,类成员方法默认是非虚拟的。可以使用virtual关键字将它们设为虚拟。例如,Base::show() 在以下程序中是非虚拟的,并且程序打印 “Base::show() called”

#include<iostream>
using namespace std;
class Base {
public: 
  void show() {
    cout<<"Base::show() called";
  }
};
class Derived: public Base {
public: 
  void show() {
    cout<<"Derived::show() called";
  } 
};
int main()
{
Derived d;
Base &b = d;
b.show();
getchar();
return 0;
}
复制代码


Base::show() 的定义之前添加virtual使程序打印 “Derived::show() called”****

在 Java 中,方法默认是虚拟的,可以通过使用final关键字使其成为非虚拟的。例如,在


下面的java程序中,show() 默认是虚拟的,程序打印 “Derived::show() called”

class Base {
  public void show() {
  System.out.println("Base::show() called");
  }
}
class Derived extends Base {
  public void show() {
  System.out.println("Derived::show() called");
  }
}
public class Main {
  public static void main(String[] args) {
    Base b = new Derived();;
    b.show();
  }
}
复制代码


与 C++ 非虚拟行为不同,如果我们在Base 中的 show() 定义之前添加final,那么上述程序将无法编译。**


二、C++ 和 Java 中异常处理的比较


两种语言都使用trycatchthrow关键字进行异常处理,并且trycatchfree块的含义在两种语言中也相同。以下是 Java 和 C++ 异常处理之间的差异。


1) 在 C++ 中,所有类型(包括原始类型和指针)都可以作为异常抛出。但是在 Java 中,只有可抛出对象(Throwable 对象是 Throwable 类的任何子类的实例)可以作为异常抛出。例如,以下类型的代码适用于 C++,但类似的代码不适用于 Java。

#include <iostream>
using namespace std;
int main()
{
int x = -1;
try {
  if( x < 0 )
  {
    throw x;
  }
}
catch (int x ) {
  cout << "发生异常:抛出的值为" << x << endl;
}
getchar();
return 0;
}
复制代码

输出:发生异常:抛出的值为 -1


2) 在 C++ 中,有一个称为“catch all”的特殊捕获,可以捕获所有类型的异常。


#include <iostream>
using namespace std;
int main()
{
int x = -1;
char *ptr;
ptr = new char[256];
try {
  if( x < 0 )
  {
    throw x;
  } 
  if(ptr == NULL)
  {
    throw " ptr is NULL ";
  }
}
catch (...) // catch all
{
  cout << "发生异常:退出"<< endl;
  exit(0);
}
getchar();
return 0;
}
复制代码


输出:


发生异常:退出


在 Java 中,出于所有实际目的,我们可以捕获 Exception 对象来捕获所有类型的异常。因为,通常我们不会捕获除了异常(错误)之外的 Throwable(s)


catch(Exception e){
…….
}
复制代码

3) 在Java中,有一个称为finally的块,它总是在try-catch块之后执行。此块可用于执行清理工作。C++ 中没有这样的块。


class Test extends Exception { }
class Main {
public static void main(String args[]) {
  try {
    throw new Test();
  }
  catch(Test t) {
    System.out.println("得到测试异常");
  }
  finally {
    System.out.println("在 finally 块里");
  }
}
}
复制代码


输出:


得到测试异常
在 finally 块里
复制代码

4) 在 C++ 中,所有异常都是未经检查的。在 Java 中,有两种类型的异常 - 已检查和未检查。


5) 在Java中,新关键字throws用于列出函数可以抛出的异常。在 C++ 中,没有throws关键字,同样的关键字throw也用于此目的。


6) 在 C++ 中,如果没有捕获到异常,则异常处理子系统会调用函数 unknown(),它会异常终止程序或应用程序。如果在我们的 C++ 程序中出现任何异常,那么查找该特定异常将非常耗时,因为在 C++ 中unexpected() 并没有告诉我们异常发生在哪种类型和哪一行。


但是在 Java 中,如果系统生成的异常没有被捕获,那么 Java 运行时系统 (JVM) 会将异常对象移交给默认的异常处理程序,它基本上会打印名称、描述以及异常发生在哪一行。


因此在 Java 中查找和处理异常比在 C++ 语言中更容易。


如果你发现任何不正确的内容,或者你想分享有关上述主题的更多信息,请发表评论。



目录
相关文章
|
2天前
|
Java C++
部落(pta)(并查集) Java以及C++
部落(pta)(并查集) Java以及C++
11 2
|
2天前
|
Java C++
愤怒的牛(java c++)(二分典型例子)
愤怒的牛(java c++)(二分典型例子)
8 1
|
2天前
|
Java 程序员 编译器
【Java开发指南 | 第二十三篇】Java异常处理
【Java开发指南 | 第二十三篇】Java异常处理
10 1
|
2天前
|
Java 数据库连接 数据库
【JAVA基础篇教学】第六篇:Java异常处理
【JAVA基础篇教学】第六篇:Java异常处理
|
2天前
|
存储 Java API
关于Java异常处理的9条原则
关于Java异常处理的9条原则
|
2天前
|
Java 数据安全/隐私保护
java中异常处理机制
java中异常处理机制
13 1
|
2天前
|
NoSQL 测试技术 C++
C++的异常处理及错误调试技巧
C++的异常处理及错误调试技巧
12 0
|
2天前
|
IDE Java 测试技术
java异常处理及错误调试技巧
java异常处理及错误调试技巧
10 0
|
2天前
|
Java 数据库连接 开发者
Java中的异常处理机制详解
Java异常处理是确保程序健壮的关键,涉及Throwable的Error和Exception子类。Error由JVM抛出,不建议捕获;Exception分为检查异常(需要捕获)和未检查异常。处理异常的关键字有try、catch、finally、throw和throws。最佳实践包括捕获具体异常、不吞没异常、释放资源和避免滥用异常。示例展示了如何在main方法中处理IOException,并在finally块中进行资源清理。
13 1
|
2天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
【5月更文挑战第2天】JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
42 2