1. A派性出籽类B,B派生出子类C,并且在Java源代码中有如下声明:
1.A a0=new A();
2.A a1 =new B();
3. A a2=new C();
问以下哪个说法是正确的? (D )
A.只有第1行能通过编译
B.第1、2行能通过编译,但第3行编译出错
C.第1、2、3行能通过编译,但第2、3行运行时出错
D.第1行、第2行和第3行的声明都是正确的
解析:
继承是单继承,并且继承是具有传递性的,子类向上转型是无条件的,所以C类也可以说是A类的子类,故1、2、3全部是正确的
2.下面代码将输出什么内容:(B)
public class SystemUtil{
public static boolean isAdmin(String userId){
return userId.toLowerCase()=="admin";
}
public static void main(String[] args){
System.out.println(isAdmin("Admin"));
}
}
A. true
B. false
C.1
D.编译错误
解析:
这里admin指向堆内存字符串常量池里admin的地址,而toLowerCase方法在源码中重新new String()返回的,指向的是这个字符串对象在堆内存中的地址,而这个地址里存放了指向堆内存字符串常量池里admin的地址。所以二者引用不相等,==判断为false
3.阅读如下代码。请问,对语句行test.hello0.描述正确的有( A)
package NowCoder;
class Test {
public static void hello0 {
System.outprintln("hello");
}
public class MyApplication {
public static void main(String[ args) {
// TODO Auto-generated method stub
Test test=null;
test.hello0;
}
A能编译通过,并正确运行
B因为使用了未初始化的变量,所以不能编译通过
C以错误的方式访问了静态方法
D能编译通过,但因变量为null ,不能正常运行
解析:
静态方法的使用不依靠对象,只看类型,在编译时就确定了
4.在使用super和this关键字时,以下描述正确的是( A)
A在子类构造方法中使用super( )显示调用父类的构造方法, super( ) 必须写在子类构造方法的第一行,否则编译不通过
B super( )和this( )不一定要放在构造方法内第一-行
C this( ) 和super ( )可以同时出现在一个构造函数中
D this ( )和super ( )可以在static环境中使用,包括static方法和static语句块
解析:
1.this 和 super 只能放在第一行
2.this()和super()不可以同时出现在一个构造函数中
3.在方法中定义使用的this关键字,它的值是 当前对象 的引用.也就是说你只能用它来调用属于当前对象的方法或者使用this处理方法中成员变量和局部变量重名的情况.
this和super都无法出现在static 修饰的方法中,static 修饰的方法是属于类的,该方法的调用者可能是一个类,而不是对象.如果使用的是类来调用而不是对象,则 this就无法指向合适的对象.所以static 修饰的方法中不能使用this.
5.如下代码的结果是什么?(B)
class Base {
Base() {
System.out.print("Base'");
}
public class Alpha extends Base {
public static void main( String[ args) {
new Alpha();
//调用父类无参的构造方法
new Base0;
}
A Base
B BaseBase
C编译失败
D代码运行但没有输出
E运行时抛出异常
解析:
在执行new Alpha()时,会先执行父类的构造方法,在执行相应的子类的构造方法,所以此处会打印Base,在执行new Base()时,会直接执行Base中无参构造器的代码,再输出Base,所以选B
6.如下代码的输出结果是什么?(D)
public class Test {
public int aMethod0{
static int i= 0;
i++;
return i;
}
public static void main(String args[){
Test test = new Test();
test.aMethod();
intj = test.aMethod0);
System.out.println(j);
}
A.0
B.1
C.2
D.编译失败
解析:
Java中静态变量只能在类主体中定义,不能在方法中定义。 静态变量属于类所有而不属于方法。
7.下列哪一种叙述是正确的(D)
A abstract修饰符可修饰字段、方法和类
B 抽象方法的body部分必须用一对大括号{ }包住
C 声明抽象方法,大括号可有可无
D 声明抽象方法不可写出大括号
8.选项中哪一行代码可以替换 //add code here 而不产生编译错误(A)
public abstract class MyClass {
public int constInt = 5;
//add code here
public void method( ){
}
}
A public abstract void method(int a);
B consInt=constInt+5;
C public int method();
D public abstract void anotherMethod(){}
解析:
A:抽象类可以包含抽象方法
B:类中定义成员和方法,不能直接进行运算,可以写在代码块{}或者静态代码块中static{}中
C: 与第四行想要构成重载,二者区别是返回类型,但是返回类型不能作为重载的依据
D: 该方法使用abstract修饰,是抽象方法,但是他有方法体(带有{}的就是方法体,即使里面是空的),就不能作为抽象方法
9.以下代码运行输出的是(C)
public class Person{
private String name = "Person";
int age=0;
public class Child extends Person{
public String grade;
public static void main(StringD args){
Person p = new Child0;
System.out.println(p.name);
}
A输出:Person;
B没有输出
C编译出错
D运行出错
解析:
Java中对字段属性是静态绑定,方法成员是动态绑定,这里错在:在子类中试图访问父类的private字段,所以编译不通过,将private去掉就可访问,不是动态绑定的问题,它本来就属于静态绑定。
10.以下程序的输出结果为(D)
class Base{
public Base(String s){
System.out.print("B");
}
public class Derived extends Base{
public Derived (String s) {
System.out.print("D);
public static void main(StringO args){
new Derived("C");
}
A.BD
B. DB
C.C
D.编译错误
解析:
1.写一个类,如果没有写构造函数,那么这类默认会有一个无参的构造函数。如果写构造函数了,那么就不会有默认的无参构造函数,以自己写的构造函数为准。
2.子类在写构造函数的时候,第一行必须用super 关键字调用父类的任一构造函数。
3.用super调用父类的构造函数时,如果调用的是父类无参构造函数,则super()可以不用写,如果是有参构造函数,则必须显示调用。
所以看这道题:
1.父类 Base 有一个有参构造函数,那么默认的无参构造函数就没有了;
2.在子类Derived的构造函数中,必须通过super调用父类的构造函数
3.父类Base 没有无参的构造函数,所以必须显示调用父类的有参构造函数,即显示的调用 super("");