`
YuHuang.Neil
  • 浏览: 187517 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
详细分析以下代码段,给出执行结果及其原因。 public class WithReturn{ public int methodA(int money) throws SpecialException{ if(--money<=0) throw new SpecialException("Out of money!!"); return money; } public int methodB(int money){ try{ System.out.pr ...
谈谈Java异常处理机制对程序性能的影响。 一般来说,在Java程序中使用try...catch语句不会对程序的性能造成非常大的影响。仅仅当异常发生时,Java虚拟机需要执行额外的操作来定位处理异常的代码块,这时才会对程序性能造成负面的影响。如果抛出异常的代码块和捕获异常的代码块位于同一个方法中,对性能的影响就会相对比较小一些;如果Java虚拟机必须搜索方法调用栈来寻找异常处理的代码块,此时对程序的性能影响就比较大了。尤其是当异常处理代码块位于调用栈的底部时,Java虚拟机定位异常处理代码块就需要大量的工作。 因此,我们必须杜绝使用异常处理机制来控制程序的正常流程,而应该保证仅仅在程序可能出 ...
Java的异常处理机制相对于传统的异常处理方式有什么优势,请详细阐述。 1、传统的异常处理方式表达异常的能力非常有限,光凭函数返回值来承载程序的异常信息是非常不够的,尤其是在复杂的系统中使用这种异常处理方式将很难定位问题的类型以及出现的原因。而在Java中把各种不同类型异常情况进行分类,用Java类来表示异常情况,这种类被称为异常类。把异常情况表达成异常类的形式,可以充分利用类的扩展性和可重用性。 2、传统的异常处理方式,将异常处理逻辑嵌入到正常的逻辑代码中,增加了系统的复杂性。在Java中异常代码和正常的逻辑代码是分开的,提高了程序的可读性,简化了程序的结构。 3、随着系统规模的扩大,传 ...
接口与抽象类从某个方面来说是非常相似的,请问它们之间有什么异同? 首先,接口是构建松耦合的软件系统的重要法宝。接口仅仅描述了系统能够做什么,而不涉及任何的实现细节,所以接口中所有方法都是抽象的。接口不涉及与任何具体实例相关的细节,因此接口没有构造方法,也不能被实例化,更加没有实例变量。 此外,接口与抽象类都位于系统的抽象层,但两者有着不同的特点和用处。抽象类的优点就是可以为部分方法提供默认的实现,避免了子类对这些方法的重复实现,提高了开发效率和代码的重用程度。但是抽象类有一个比较大的限制就是不能支持多继承。因为子类有可能覆盖抽象类中方法的实现,还有可能隐藏抽象类的成员变量和静态方法。为了简化 ...
阅读以下代码,请问最后输出的结果是多少? import java.util.Date; public class Test extends Date{ public static void main(String[] args){ new Test().test(); } public void test(){ System.out.println(super.getClass().getName()); System.out. ...
在苹果机器上检查自带的IPv6协议是否正常工作可以使用下面的命令: Lab-Computer-0db2f6:~ labuser$ ping6 -c5 ::1 PING6(56=40+8+8 bytes) ::1 --> ::1 16 bytes from ::1, icmp_seq=0 hlim=64 time=0.089 ms 16 bytes from ::1, icmp_seq=1 hlim=64 time=0.097 ms 16 bytes from ::1, icmp_seq=2 hlim=64 time=0.089 ms 16 bytes from ::1, icmp_seq ...
在输出时,遇到行结束符endl才刷新缓冲区,因此使用行结束符endl,会在回车换行的同时清理缓冲区,endl做了两件事情。因为endl在执行换行时还调用了cout的成员函数flush(),该方法会输出缓冲区中的所有数据并且刷新缓冲区。 在编译器的include目录中ostream.h文件,可以看到endl的原型: inline _CRTIMP ostream& __cdecl endl(ostream& _outs){ _outs<<"\n"<<flush; } 从上面的代码中可以清晰地看出,函数除了执行&q ...
虚函数是C++中一个重要的概念,搞清楚这个概念对于理解C++运行的内在机制有一定的帮助。下面通过一个例子来总结一下C++中虚函数的调用原理。 示例代码: #include <iostream> #include <cstdlib> using namespace std; class A ...
虚基类是为了消除歧义和保持基类成员一个拷贝而产生的概念。当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或者说是多个副本),如果想要保持这个基类的一个实例,可以将这个公共基类说明为虚基类。 在继承中产生歧义的原因可能是继承类继承了基类多次,从而产生了多个拷贝,即不止一个通过多个路径继承基类,导致在内存中创建了基类成员的多个拷贝。虚基类的基本原则是在内存中只有基类成员的一份拷贝。这样,通过吧基类继承声明为虚拟的,就只能继承基类的一份拷贝,从而消除歧义。使用virtual限定符吧基类继承说明为虚拟的。 虚基类的初始化: 虚基类的初始化与一般继承的初 ...
今天看书遇到了C++中比较难缠的概念,就是重载、覆盖和隐藏。如果只要区分重载和覆盖,相信应该没有什么难度,并且它们的界限还是比较清晰的。现在加上了隐藏,初次看这些概念还真是不好区分。下面总结一下它们之间的区别: 成员函数的重载的特征有以下4点: (1) 必需在相同的范围内,即在同一个类的内部; (2) 函数名称相同; (3) 函数的参数不相同; (4) virtual关键字可选,即可以加上也可以不加上,不影响重载的发生。 覆盖是指派生类函数覆盖基类函数,它的特征有以下4点: (1)必需在不同的范围中,即分别在派生类和基类中; (2) 函数名称相同; (3) 参数也必需相同; (4) 基类函数 ...
今天看书时注意到C++在多继承时,基类的构造顺序是按照继承时给定顺序执行的,析构的顺序正好相反!而与它们初始化的顺序没有任何关系,下面随便写了一个Demo程序来验证C++在多继承时基类的构造顺序。 #include <iostream> #include <cstdlib> using namespace std; class a { public: a(){cout<<"a constructor!!"<<endl;} ~a(){c ...
今天使用C++编程练习时遇到了一个小问题:包含头文件iomanip文件后,在标准输出流中使用setprecision函数指定了输出数据的精度。没有预料到setprecision函数会影响到后面输出流的精度。 查阅了些C++的资料,下面总结一下C++设定输出格式的几种方式: (1) 使用cout对象的width方法,如: cout.width(20); (2) 使用<iomanip>里面的函数设置输出的行宽。 <iomanip>中总共有六个成员函数: setw  //指定显示区域宽度 ---  不影响后续的输出流! setprecision  //指定浮点数的精度  ...
Global site tag (gtag.js) - Google Analytics