14、下列给出各种形式的Java语句,哪种形式在Java语言中是错误的语句( )
(1)break stop;
(2)continue goon;
(3)goto goon;
(4)if(A > B ){ A=1; }
解答:
Java语言中的break语句主要有如下三个方面的应用:其一是在循环体中用于跳出循环体以结束当前的循环;另一个是用在switch语句体中,同样也是为了跳出switch语句体,不再执行后续的判断语句;最后,使用 break 语句可以实现其它语言中的goto语句的应用功能。因为,在Java语言中不再提供goto语句,而是由break 语句代替实现goto语句的功能。因此,本题的答案是“(3)goto goon;”。 break 语句承担一般语言中的goto语句功能的程序代码示例,请参看如下示例图所示的程序代码示例。
而Java语言中的continue 语句在应用方面与 break 语句类似,但它的功能是中断正常的循环控制的流程,continue 语句将控制转移到最内层循环的首部。也就是说,continue 语句是跳过循环体中剩余的语句而强制执行下一次的循环,其作用为结束本次的循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。
continue 语句在应用的场合方面与break 语句有差别,continue 语句只能出现在循环体中,而且continue语句并不是中断循环而强制退出循环,而只是中止当前迭代的循环并再进入下一次的迭代判断和根据判断的结果决定是否再次执行循环。由于循环可能会出现循环嵌套的应用状况,因此continue语句有两个不同的应用形式——“不带标签”和“带标签”,参看如下示例图所示的程序代码示例。
之所以在应用continue 语句时有时需要给出目标语句的位置(由标签定义),是因为在默认的情况下,continue只会跳出最近的内循环(如上面示例图中的程序代码的第18行位置处的for循环),而如果要跳出到上面示例图所示的程序代码的第16行位置处的外部for循环,可以为此外部for循环再添加一个目标标签如示例图程序代码中的targetLine,然后在第22行的位置处的continue 语句后面指定这个目标标签targetLine。
15、设有如下的程序类定义:class MyClass{ public MyClass( int X ){ } }
在如下的各种方式的创建对象语句中,哪一种形式是正确的( )
(1) MyClass myobj = new MyClass;
(2) MyClass myobj = new MyClass( );
(3) Myclass myobj = new MyClass(1);
(4) MyClass myobj = new MyClass(1,2);
解答:
在Java语言的程序编程中,可以应用new关键字(可以理解为“新建”的意思)创建一个新的对象,而使用关键字new来创建一个对象也叫类的对象实例化。当然,当程序执行到使用new关键字创建某个类的对象实例语句时,Java虚拟机会自动地根据对象在创建时所给定的参数个数和类型匹配地调用对应的构造方法以初始化该对象实例。
当然,在应用new关键字创建某个类的对象实例时,如果需要给出初始参数值,则该初始参数值在数据类型和参数个数方面必须要与对应类中的构造方法相匹配,否则将会出现错误。由于本问题中的MyClass类只定义有一个带int类型参数的构造方法,因此在对象创建时的对象初始化语句中也只能给出一个int类型的参数值。故“Myclass myobj = new MyClass(1);”是正确的。因此,本题的答案是“(3) Myclass myobj = new MyClass(1);”。
而且一旦类中定义有构造方法,则对象初始化时必须要匹配所有的构造方法中的某一种形式的构造方法。因此,“(2)MyClass myobj = new MyClass( );”是错误的,因为在MyClass类中没有定义出public MyClass(){ } 形式的构造方法;同样,“(4) MyClass myobj = new MyClass(1,2);”也是错误的,因为在MyClass类中没有定义出public MyClass(int X, int Y){ } 形式的构造方法。
而“(1) MyClass myobj = new MyClass;”形式的语句是错误的创建对象实例化的语句。
16、在下列各种形式的Java程序类的定义中,哪种形式是错误的( )
(1)class MyBaseClass{ }
class MyDerived extends MyBaseClass{ }
(2)abstract class MyBaseClass{ }
class MyDerived extends MyBaseClass{ }
(3)public class MyBaseClass{ }
class MyDerived extends MyBaseClass{ }
(4)final class MyBaseClass{ }
class MyDerived extends MyBaseClass{ }
解答:
在Java语言的继承与派生类的定义中应用extends定义符指明所继承的基类名,基类可以是普通的程序类,也可以是由abstract所修饰的抽象类。因此,本问题中的“(1)”、“(2)”和“(3)”三种形式的基类MyBaseClass的定义及派生类MyDerived的定义都是正确的。
final定义符在Java程序中可以有如下的三种不同的应用:其一是用来修饰类定义,其二是修饰类中的成员方法定义和其三是修饰类中的成员数据定义。由final定义符所修饰的类称为“中止类”,该类不能在继承与派生类的定义中被应用于基类。因此,本题的答案是“(4)final class MyBaseClass{ }”,因为MyBaseClass被声明为final类型的类。
在编程应用中之所以将某个类声明为final类型的类,应用的目的之一是基于该类所反映的功能的安全性方面的考虑,避免该类的核心方法所体现出的“特殊运算”和“算法”被错误或者不合理地在子类中覆盖重写,如java.lang程序包中的Math、String、Class和System等类;应用的目的之二是提高该类中的成员方法的执行速度,这是因为final类型的类中的成员方法是不能够在子类中被覆盖的,所以其地址引用和装载在编译期间就可以直接完成,而不是也没有必要在运行期间由Java虚拟机(JVM)再进行复杂的装载,因而简单和有效。
当然,提高方法的程序代码的执行速度,在现在的超高速的CPU的主机中没有太多的实际应用意义,但回退到90年代仍然是有意义的。现在在Java编程中再应用final类型的类的主要目的基本上是基于安全方面的考虑。
17、下列给出各种形式的Java程序类的定义代码,哪种定义形式是错误的( )
(1)class MyBaseClass{
void myFun(){
}
}
class MyDerived extends MyBaseClass{
void myFun(){
}
}
(2)abstract class MyBaseClass{
abstract void myFun();
}
class MyDerived extends MyBaseClass{
void myFun(){
}
}
(3)public class MyBaseClass{
public void myFun(){
}
}
class MyDerived extends MyBaseClass{
public void myFun(){
}
}
(4)class MyBaseClass{
public final void myFun(){
}
}
class MyDerived extends MyBaseClass{
public void myFun(){
}
}
解答:
final定义符在Java程序中可以有如下的三种不同的应用:其一是用来修饰类定义,其二是修饰类中的成员方法定义和其三是修饰类中的成员数据定义。由final定义符所修饰的类中的成员方法称为“中止方法”,该方法不能在派生类中被覆盖重写。在本问题中的第4个选项中,由于MyBaseClass类中的myFun方法被定义为final类型的成员方法,该myFun方法就不能再在子类MyDerived类中被覆盖重写。因此,本题的答案是“(4)”。
18、下列给出各种形式的Java程序的方法定义,哪种能够实现引用数据方式的方法调用( )
(1)void myFun( char X){
}
(2)void myFun( byte X){
}
(3)void myFun( Circle X){
}
(4)void myFun( float X){
}
解答:
Java程序中的方法在调用时根据该方法的参数在声明时的类型决定是采用传地址的引用调用还是传值拷贝调用方式,如果方法的参数是复合数据类型(类对象、接口对象和数组),则该方法在调用时采用传地址的引用调用方式传递参数;而如果方法的参数是基本的数据类型(如int、float、double等数据类型),则该方法在调用时采用传值拷贝的调用方式传递参数。因此,本题的答案是“(3)void myFun( Circle X){ }”,因为myFun方法的参数声明为Circle类的对象实例,因此myFun方法在被调用时,其参数Circle类的对象实例将采用传地址的引用调用方式传递实际参数的Circle类的对象实例。
19、下列给出各种形式的Java语言中的构造方法的定义,哪种定义形式是错误的构造方法定义( )
(1)class MyClass{
public MyClass(){
}
}
(2)class MyClass{
public MyClass(int X){
}
}
(3)class MyClass{
public int MyClass(){
}
}
(4)class MyClass{
public MyClass(int x, int y){
}
}
解答:
Java程序中的构造方法是指方法名与类名同名并且无任何返回值类型定义的public型成员方法,当某个程序类中未明确地定义出任何形式的构造方法时,此时编译系统将会在该程序类代码中插入生成一个缺省形式的构造方法(方法体为空),但此时的对象在实例化时将不能进行初始化;当然,构造方法也可以是重载形式(在同一个程序类中可以定义出多个同名的构造方法),从而可以在对象实例化时以多种方式初始化该对象实例。
因此,构造方法的方法名称必须要与类名同名,而且不能带有任何的返回类型定义。因此,选项“(3)”中的“public int MyClass(){ }”方法声明,不属于MyClass类中的构造方法定义,而是普通的方法定义,尽管该方法的名称与类名同名。故本题的答案是“(3)”。
20、下列给出各种形式的Java程序类的定义,哪种定义形式是错误的( )
(1)class MyClass{
private int Val;
public int getVal(){
return Val;
}
}
(2)class MyClass{
private static int Val;
public int getVal(){
return Val;
}
}
(3)class MyClass{
private int Val;
public static int getVal(){
return Val;
}
}
(4)class MyClass{
private static int Val;
public static int getVal(){
return Val;
}
}
解答:
本问题主要考察对Java程序中的static定义符的正确应用。static定义符可以用于定义数据,形成静态成员属性;也可以用于定义成员方法,产生出静态成员方法(包括方法中的一段程序代码,形成static代码块)。由static定义符所修饰的成员(方法和属性)是类成员。它属于整个类所有,而不是某个对象所有,即被该类的所有对象实例所共享(也就是类中的全局成员)。
类中的静态成员(方法和属性)可以使用类名直接访问,也可以使用对象名进行访问。但一般都更推荐用类名访问。
在静态成员方法体中可以直接调用同类中的静态成员(方法和属性),因此,选项“(4)”是正确的;但不能直接调用非静态成员(方法和属性)。因此,选项“(3)”是错误的。如果希望在静态成员方法中调用本类中的非静态成员(方法和属性),可以通过创建类的对象实例,然后通过该对象实例来访问非静态成员(方法和属性)。
而在类的普通成员方法体中,可以直接访问同类的非静态成员(方法和属性,故选项“(1)”是正确的)和静态成员(方法和属性,故选项“(2)”是正确的)。因此,本题的答案是“(3)”。
21、下列给出各种形式的Java程序类的定义,哪种定义形式是错误的( )
(1)class MyClass{
private int Val;
public int setVal(int Val){
this.Val=Val;
}
}
(2)class MyClass{
private static int Val;
public int setVal(int Val){
this.Val=Val;
}
}
(3)class MyClass{
private int Val;
public static int setVal(int Val){
this.Val=Val;
}
}
(4)class MyClass{
private static int Val;
public static int setVal(int ValData){
Val=ValData;
}
}
解答:
本题与上一题基本相同,本题的答案是“(3)”。在静态成员方法体中可以直接调用同类中的静态成员(方法和属性),但不能直接调用非静态成员(方法和属性)。
22、下列给出各种形式的Java程序类的定义,哪种定义形式是错误的( )
(1)class MyClass{
public synchronized void myFun(){
wait();
}
}
(2)class MyClass{
public void myFun(){
wait();
}
}
(3)class MyClass{
public synchronized void myFun(){
notify();
}
}
(4)class MyClass{
public void myFun(){
System.out.println(" wait() ");
}
}
解答:
本题主要考察对synchronized定义符所修饰的方法(同步方法)的正确应用方面的知识,当然synchronized定义符也可以修饰一段程序代码而形成同步语句块。当synchronized定义符用来修饰一个方法或者一段代码块时,能够保证在同一时刻最多只有一个线程执行该方法或者该段代码。
wait()和notify()方法都是属于Object类的内置的成员方法,它们都只能在同步语句块(由synchronized定义符修饰的代码段)或者同步方法中(由synchronized定义符修饰的方法)使用。因此,选项“(1)”和“(3)”是正确的,因为它们都应用在由synchronized定义符修饰的成员方法——同步方法中;而选项“(2)”是错误的,因为myFun方法不是由synchronized定义符修饰的成员方法——同步方法,在该方法体中不能应用wait ()方法。因此,本题的答案是“(2)”。
如果调用了wait()方法之后,会引起当前线程处于等待状态。而通过notify()方法后,则可以让处于等待状态的线程重新处于活动状态。因此,wait()/notify() 方法相互配合,可以产生“信号灯”的调度效果。在多线程的应用开发中,广泛地应用于多线程的调度控制中。
23、下列给出各种形式的Java程序类的定义,哪种定义形式是错误的( )
(1)class MyClass{
public synchronized void myFun(){
wait();
}
}
(2)class MyClass{
public void myFun(){
notify();
}
}
(3)class MyClass{
public synchronized void myFun(){
notify();
}
}
(4)class MyClass{
public void myFun(){
System.out.println(" notify() ");
}
}
解答:
本题与上一题基本相同,本题的答案是“(2)”。因为myFun方法不是由synchronized定义符修饰的成员方法——同步方法,在该方法体中不能应用notify()方法。
24、如下四种形式的继承与派生的程序类定义,哪一种定义形式是正确的( )
(1) class Base {
public abstract void myfun();
}
class Dervived extends Base {
public void myfun() {
}
}
(2) final class Base {
public void myfun(){
}
}
class Dervived extends Base {
public void myfun(){
}
}
(3) class Base {
public final void myfun(){
}
}
class Dervived extends Base {
public void myfun(){
}
}
(4) abstract class Base {
public abstract void myfun();
}
class Dervived extends Base {
public void myfun(){
}
}
解答:
选项“(1)”是错误的,因为在Base类中定义有abstract类型的抽象方法,Base类则也必须要定义为abstract类型的抽象类;选项“(2)”也是错误的,因为Base类被定义为final类,从而导致Base类不能再被继承;选项“(3)”也是错误的,因为Base类中的myfun成员方法被定义为final类型的成员方法,该方法是不能在子类Dervived类中被覆盖形式的重写。
选项“(4)”是正确的,抽象基类Base中的抽象方法myfun在子类Dervived类中被覆盖形式的重写定义。因此,本题的答案是“(4)”。
25、欲获取MyClass程序类中的名称为member的成员变量之值,下列哪种方式是正确的( )
class MyClass{
private static int member=1;
public static int getMember(){
return member ;
}
}
(1)MyClass.member ;
(2)new MyClass ().member ;
(3)MyClass.getMember ();
(4)MyClass ().getMember () ;
解答:
MyClass类中的名称为member的成员变量由于是static类型的变量,而且它是private类型的访问控制选项。因此,在类外要访问它则必须要通过public类型的static成员方法来访问。为此,在MyClass类中提供有public类型的static成员方法getMember。
访问static成员方法可以通过对象名或者类名两种形式进行访问,但更推荐采用类名称的方式访问。因此,选项“(3)”是正确的。选项“(1)、(2)”都是错误的,因为member成员是private类型的成员,不能在类外通过类名或者通过对象来访问。选项“(4)”是语法错误,不能采用“MyClass ()”这样的形式访问getMember方法。因此,本题的答案是“(3)”。