龙空技术网

计算机等级二级考试辅导:“面向对象”单元题解答(第2部分)

杨教授工作室 146

前言:

如今兄弟们对“在一个java源程序中只能有一个public修饰的类”可能比较关怀,看官们都想要知道一些“在一个java源程序中只能有一个public修饰的类”的相关内容。那么小编也在网上网罗了一些关于“在一个java源程序中只能有一个public修饰的类””的相关资讯,希望你们能喜欢,姐妹们快快来学习一下吧!

1、某Java程序的类定义代码参看如下的程序语句

public class MyClass extends BaseClass{

}

则该Java源程序文件在计算机磁盘中存盘时的源文件名应为如下哪一项( )

(1)myclass.java

(2)MyClass.java

(3)MYCLASS.java

(4)MyClass.jav

解答:

Java语言的源程序文件的命名不是随意的, Java 文件的命名必须满足如下规则:首先,Java 程序源文件的扩展名必须是.java,不能是其它的文件扩展名;其次,用public修饰符所修饰的程序类,该类的源程序文件的文件名与public所修饰的类名称保持一致性。没有用public修饰的类的文件名可随意命名。本问题中的类为public类型的类,因此该类的源程序文件名为MyClass,扩展名必须是.java。

因此,本题的答案是“(2)MyClass.java”,参看如下示例图所示的Derived类的源程序文件为Derived.java

2、下列哪种形式的标识符在Java程序中是错误的( )

(1)MyClass_Base12

(2)_MyClass$Base12

(3)$MyClass_12

(4)76MyClass$12

解答:

本题主要考察读者对Java程序中的各种符号的命名规则,Java语言规定标识符可由任意顺序的字母、下划线(_)、美元符号($)和数字组成,并且第一个字符不能是数字;同时,标识符不能是Java中的保留关键字。因此,MyClass_Base12、_MyClass$Base12和$MyClass_12三个标识符的命名是正确的,但76MyClass$12的命名是不符合要求的,因为该标识符以数字开头。因此,本题的答案是“(4)76MyClass$12”

3、下列给出各种形式的Java方法的定义示例,哪种定义形式在Java语言中是正确的( )

(1)void myFun(int X=1){

}

(2)void myFun(int & X){

}

(3)void myFun(int X ){

}

(4)void myFun(int * X){

}

解答:

为了能够让读者理解本题的最终结果的答案,作者将本题中的四个方法直接放在某个程序类中,由语法检查器程序去识别是否存在错误,参看如下示例图所示的结果,其中“(3)void myFun(int X ){ }”是正确的,另外三个是错误的。因此,本题的答案是“(3)void myFun(int X ){ }”

首先,在Java成员方法定义时,不支持方法的参数带有默认参数值。因此,“(1)void myFun(int X=1){ }”形式的方法定义是错误的。

其次,在Java成员方法定义时,不支持方法的参数是引用调用的显式声明。Java方法的参数如果是复合数据类型定义(类、接口和数组),则该方法在调用时将采用传地址的引用调用。而如果方法的参数是基本类型的数据定义,则该方法在调用时将采用传值拷贝调用。因此,“(2)void myFun(int & X){ }”形式的方法定义也是错误的。

最后,“(4)void myFun(int * X){ }”形式的方法定义也是错误的,因为在参数定义中不能包含有运算符*。

4、在下列各种形式的Java方法定义中,哪种定义形式可以实现传值拷贝调用( )

(1) void myFun( int X){

}

(2)void myFun( Frame Obj){

}

(3)void myFun( Point P){

}

(4)void myFun( Rectangle R){

}

解答:

Java方法的参数如果是复合数据类型定义(类、接口和数组),则该方法在调用时将采用传地址的引用拷贝调用(把对象在内存中的地址拷贝了一份传给了参数)。而如果方法的参数是基本类型的数据定义,则该方法在调用时将采用传值拷贝调用。根据此规则,可以判断出本题中的四个答案中只有“(1) void myFun( int X){ }”形式的方法定义中,采用传值拷贝调用。因此,本题的答案是“(1) void myFun( int X){ }”,在其它的三个方法的参数定义中,参数都是类的类型定义,将采用传地址的引用拷贝调用。

5、下列哪种标识符不能作为Java程序中的变量名定义( )

(1)INT

(2)boolean

(3)character

(4)Java_Float

解答:

Java语言规定程序中的变量名可由任意顺序的字母、下划线(_)、美元符号($)和数字组成,并且变量名称的第一个字符不能是数字;同时,变量名称不能是Java中的保留关键字。根据此规则,可以判断出本题中的四个答案中只有“boolean 标识符不能作为Java程序中的变量名定义,因为“boolean”是Java中的保留关键字,定义布尔数据类型。因此,本题的答案是“(2)boolean”

6、下列给出各种Java语言的数据类型,其中属于基本的数据类型的是哪一项( )

(1)byte 数据类型

(2)数组 数据类型

(3)类 的数据类型

(4)接口 数据类型

解答:

Java语言中的数据类型分为基本的数据类型(如int、float、char、boolean、byte等数据类型)和复合数据类型两种形式(如数组、类、接口等),参看如下示例图所示的说明。

因此,本题中的“(1)byte 数据类型”属于Java语言中的基本数据类型,故本题的正确答案为“(1)byte 数据类型”。

7、下列给出各种Java语言的数据类型,其中属于复合的数据类型的是哪一项( )

(1)int 数据类型

(2)数组 数据类型

(3)float数据类型

(4)char 数据类型

解答:

Java语言中的数据类型分为基本的数据类型(如int、float、char、boolean、byte等数据类型)和复合数据类型两种形式(如数组、类、接口等),参看前面题所给出的示例图所示的说明。

因此,本题中的“(2)数组 数据类型”属于Java语言中的复合数据类型,故本题的正确答案为“(2)数组 数据类型”。

8、下列给出Java语言中的各种符号的定义格式,哪种在Java语言中是正确的常量定义( )

(1)const int SUM=1;

(2)#define SUM 1

(3)final int SUM =1;

(4)int SUM=1;

解答:

常量是指在程序的整个运行过程中值保持不变的量,Java语言中的符号常量的定义符是final。常量在Java程序中可以有如下的三种形式:静态常量、成员常量和局部常量,参看如下示例图所示的说明。因此,本题的答案是“(3)final int SUM =1;”const是C++语言中的常量定义符,#define是C语言中的常量定义符。

9、下列给出各种形式的符号定义语句,哪种定义语句在Java语言中是错误的变量定义( )

(1)int myVal =1;

(2)char $myVal =1;

(3)byte _myVal =1;

(4)float 3.14myVal=1;

解答:

Java语言中的变量在命名时要符合一定的命名规则,Java语言规定标识符可由任意顺序的字母、下划线(_)、美元符号($)和数字组成,并且第一个字符不能是数字,也严格区分字母的大小写符号;同时,标识符不能是Java中的保留关键字。因此,“(4)float 3.14myVal=1;”的选项是错误的,因为 变量名的第一个字符是数字。故本题的答案是“(4)float 3.14myVal=1;”

10、下列给出各种形式的符号定义语句,哪种定义语句在Java语言中是正确的布尔类型(boolean)的变量定义语句( )

(1)boolean myBOOL =1;

(2)boolean myBOOL =0;

(3)boolean myBOOL =true;

(4)boolean myBOOL =null;

解答:

布尔类型又称逻辑类型,在Java语言中的布尔类型的定义符是boolean,但布尔类型的变量只能有两个值:true和false(分别代表布尔逻辑中的“真”和“假”),而不是其它语言中的0和1。因此,本题的答案是“(3)boolean myBOOL =true;”

此外,布尔类型的变量值不能与整数类型的变量值进行转换,也就是在程序中不能将布尔类型和整数类型(包括byte字节类型等)相互赋值。参看如下示例图所示的错误提示说明。

11、下列给出各种形式的Java赋值操作语句,哪种在Java语言中是错误的赋值语句( )

(1) int A =1; byte B=(byte)A;

(2) int A =1; char B=A;

(3) int A =1; float B=A;

(4) int A=1; long B=A;

解答:

变量之间的赋值操作是程序中的最常见的操作方式之一,在Java程序中对变量进行赋值,可以 在声明变量时直接赋值,也可以在声明变量后再进行赋值。但在赋值过程中,不可避免地会涉及到数据转换,这需要遵守一定的转换规则。因此,需要明确和理解Java程序中的数据类型的转换规则—— 不同类型的数据混合运算时,系统自动将数据从低级转换到高级(域小的自动转化为域大的数据类型)。参看如下示例图所示的“自动类型转换”的示例说明。

但如果在程序中需要将高级的数据类型转换到低级时,则必须要进行强制类型转换。而且数据类型在转换时还必须要满足如下的转换规则:

1)不能对boolean类型进行转换。

2)不能把对象类型转换成不相关类的对象(必须为继承或者接口实现类型)。

3)转换过程中有可能导致溢出或损失精度,参看如下示例图所示的程序代码片段示例。

4)浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入: (int)23.7 转换的结果为 23,(int)-45.89f的转换的结果为 -45。

如下示例图中的程序代码说明了本题中的四种答案结果的正确性,其中“(2) int A =1; char B=A;”的选项答案结果是错误的,因为int类型的变量长度的字节数(32位,4个字节)比char类型的变量长度的字节数(16位,2个字节)要长,将int类型的变量赋值给char类型的变量,则必须要进行强制类型转换。也就是要将“(2) int A =1; char B=A;”修改为“(2) int A =1; char B=(char)A;”才是正确的赋值语句。因此,本题的答案是“(2) int A =1; char B=A;”

12、有如下的语句:int X = 1; 则“X == 1”表达式之值为( )

(1)1

(2)false

(3)true

(4)null

解答:

在Java语言编程中需要区分“=”和“==”两者的差别,其中“=”为赋值操作符,而“==”为条件判断操作符。条件判断的结果是布尔类型的结果值,也就是true或者false。因此,本题中的“X == 1”表达式之值为true。故本题的答案是“(3)true”

读者需要注意的是,Java程序中的“null”是Java语言中的关键字,就像public、static、final等符合一样属于保留字,而且它是字母大小写敏感的——也就是不能将null在程序中写成Null或NULL等形式。null其实是任何引用类型变量(数组、类及接口对象实例)的默认值,也就是可以将null赋值给引用类型的变量,但不能将null赋值给基本数据类型的变量(如int、double、float、boolean等类型),参看如下示例图所示的程序代码示例。

不能应用只赋予了默认值null而没有进行对象实例化的对象进行方法调用,否则将会抛出java.lang.NullPointerException类型的异常(空指针异常),参看如下示例图所示的程序代码及抛出的异常。因此,如果程序在执行中出现了java.lang.NullPointerException类型的空指针异常,很多情况下的错误根源都是没有对目标对象进行对象实例化就直接应用它而造成的。

13、下列给出各种形式的Java条件判断语句中的条件判断格式,哪种形式在Java语言的程序中是错误的条件判断格式( )

(1)if (A >= B)

(2)if( A == B)

(3)if( A = B)

(4)if((A >B) ==true)

解答:

Java程序中的条件判断语句if(条件表达式)中的“条件表达式”必须要复合Java语言中的布尔类型的数据应用要求。布尔表达式的值为true或者false,条件判断操作符(比较运算符)为“> 、< 、>= 、<=、== 、!=”。其中的“ > 、< 、>= 、<=”的比较运算符只支持左右两边操作数是数值类型,而“== 、!=”的比较运算符两边的操作数既可以是数值类型,也可以是引用类型。

此外,读者还需要注意在Java语言编程中正确地区分“=”和“==”两者的差别,其中“=”为赋值操作符,而“==”为条件判断操作符。因此“if( A = B)”中的“A = B”不属于布尔表达式,而是赋值表达式。故不满足条件语句中的条件判断必须是布尔表达式的语法要求。因此,本题的答案是“(3)if( A = B)”,具体错误的原因读者可以参看如下示例图所示的错误提示信息。

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)”。

计算机等级二级考试辅导:“面向对象”单元题解答(第1部分)

计算机等级二级考试辅导:“面向对象”单元练习题(第1部分)

计算机等级二级考试辅导:“面向对象”单元练习题(第3部分)

计算机等级二级考试辅导:“面向对象”单元练习题(第2部分)

计算机等级二考试辅导:Java IO机试题及解答(第1部分)

标签: #在一个java源程序中只能有一个public修饰的类