Java面向对象习题(带解析)

1.以下Java程序运行的结果是: A

public class Tester{
public static void main(String[] args){
   Integer var1=new Integer(1);
   Integer var2=var1;
   doSomething(var2);
   System.out.print(var1.intValue());
   System.out.print(var1==var2);
}
public static void doSomething(Integer integer){
    integer=new Integer(2);
    }
}
A.  1true
B.  2true
C.  1false
D.  2false

解析: Java中处理8种基本的数据类型用的是值传递,其他所有类型都用的是引用传递,由于这8种基本数据类型的包装类型都是不可变类,因此增加了对“按引用传递”的理解难度。其实还是很好理解的,题目中doSomething方法中new了一个对象,这是误导大家选择答案C的原因。其实,按引用传递的实质是将地址值的副本作为实参代替方法中的形参,因此var2与var1里面存储的地址值仍然是一样的,方法中操作的只是var2的一个副本值,并不影响var2本身存储的地址值,所以答案选择A。

2.下面关于变量及其范围的陈述哪些是不正确的(BD)

A.  实例变量是类的成员变量
B.  实例变量用关键字static声明
C.  在方法中定义的局部变量在该方法被执行时创建
D.  局部变量在使用前必须被初始化+

3.下列程序执行后输出结果为(D)

class BaseClass {
    public BaseClass() {}
 
    {
        System.out.println("I’m BaseClass class");
    }
 
     static {
         System.out.println("static BaseClass");
     }
 }
 
 public class Base extends BaseClass {
     public Base() {}
 
     {
         System.out.println("I’m Base class");
     }
 
     static {
         System.out.println("static Base");
     }
 
     public static void main(String[] args) {
         new Base();
     }
 }
​
A.  static BaseClass
    I’m BaseClass class
    static Base
    I’m Base class
B.  I’m BaseClass class
    I’m Base class
    static BaseClass
    static Base
C.  I’m BaseClass class
    static BaseClass
    I’m Base class
    static Base
D.  static BaseClass
    static Base
    I’m BaseClass class
    I’m Base class

解析: 父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数。

4.下面叙述错误的是 (C )

A.  一个类可以有多个构造方法
B.  最终类不能派生子类,最终方法不能被覆盖
C.  如果一个类中没有定义构造方法,则Java在生成这个类的实例时不会调用构造方法。
D.  数组一旦创建之后,就不能再改变其长度

解析:A.一个类可以有多个构造方法,实际上就是方法的重载,正确

B.用final修饰的类不能被继承,方法不能被覆盖,正确

C.如果没有构造方法,编译器会自动添加一个空参构造方法,错误

D.数组内部采用字符数组存储,该字符数组用final修饰,长度一旦确定不可再变,正确

5.下列java程序的输出结果为B

public class Example{
    String str=new String("hello");
    char[]ch={'a','b'};
    public static void main(String args[]){
        Example ex=new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str+" and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[]){
        str="test ok";
        ch[0]='c';
    }
}
A.  hello and ab
B.  hello and cb
C.  hello and a
D.  test ok and ab
E.  test ok and cb
F.  test ok and c

解析: String 是不可变类,a = "test ok"等于重新创建了一个对象,并不改变原来的值,数组是直接改变的

6.用户不能调用构造方法,只能通过new关键字自动调用。(错误)

解析:

  1. 在类内部可以用户可以使用关键字this.构造方法名()调用(参数决定调用的是本类对应的构造方法)

  2. 在子类中用户可以通过关键字super.父类构造方法名()调用(参数决定调用的是父类对应的构造方法。)

  3. 反射机制对于任意一个类,都能够知道这个类的所有属性和方法,包括类的构造方法。

7.在创建派生类对象,构造函数的执行顺序(A)

A.  基类构造函数,派生类对象成员构造函数,派生类本身的构造函数
B.  派生类本身的构造函数,基类构造函数,对象成员构造函数
C.  基类构造函数,派生类本身的构造函数,派生类对象成员构造函数
D.  对象成员构造函数,基类构造函数,派生类本身的构造函数

解析:

类的初始化过程也就是方法执行的过程。

父类的静态域-子类的静态域 父类的非静态域-父类的构造函数 子类的非静态域-子类的构造函数 规律就是 父类先于子类 静态的先于非静态的其中静态域包含静态代码块与静态方法,这个谁在前面,则先执行谁。非静态域同理

父类静态域——>子类静态域——>父类成员初始化——>父类构造块——>1父类构造方法——>2子类成员初始化——>子类构造块——>3子类构造方法;——对应A

8.下列说法正确的有(ACD )

A.  构造方法的方法名必须与类名相同
B.  构造方法也没有返回值,但可以定义为void
C.  在子类构造方法中调用父类的构造方法,super() 必须写在子类构造方法的第一行,否则编译不通过
D.  一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,
则编译系统会自动插入一个默认的构造方法,这个构造方法不执行任何代码

解析: 构造方法 没有任何返回值包括void

9.类Car里面有个方法run(),如果直接用Car.run(),则方法run前面必须用的关键词是? (D )

A.  class
B.  final
C.  public
D.  static

解析: 被static声明的为静态方法,可以直接通过类名调用而不需要通过对象调用。

10.在java中,下列对继承的说法,正确的是(A )

A.  子类能继承父类的所有成员
B.  子类继承父类的非私有方法和状态
C.  子类只能继承父类的public方法和状态
D.  子类只能继承父类的方法

解析: 我们有时候会分不清继承和访问权限的问题。

子类可以继承父类所有的成员,但是对private这样的,没有访问权。

你可能感兴趣的:(java,开发语言)