java基础10题

1.设有下面两个类的定义:

class  Person {}
class  Student  extends  Person {
public int id;     //学号
public int score;  //总分
public String  name;   // 姓名
public int getScore(){return  score;}
}

类Person和类Student的关系是()。
A.包含关系
B.继承关系
C.关联关系
D.无关系,上述类定义有语法错误
2.编译java程序的命令文件是( )
A.java.exe
B.javac.exe
C.applet.exe
3.下面代码运行结果为

import java.io.*;
import java.util.*;
public class foo{
    public static void main (String[] args){
        String s;
        System.out.println("s=" + s);
    }
}

A.代码得到编译,并输出“s=”
B.代码得到编译,并输出“s=null”
C.由于String s没有初始化,代码不能编译通过
D.代码得到编译,但捕获到 NullPointException异常
4.Test.main()函数执行后的输出是( )

class Test {
    public static void main(String[] args) {
        System.out.println(new B().getValue());
    }
    static class A {
        protected int value;
        public A (int v) {
            setValue(v);
        }
        public void setValue(int value) {
            this.value= value;
        }
        public int getValue() {
            try {
                value ++;
                return value;
            } finally {
                this.setValue(value);
                System.out.println(value);
            }
        }
    }
    static class B extends A {
        public B () {
            super(5);
            setValue(getValue()- 3);
        }
        public void setValue(int value) {
            super.setValue(2 * value);
        }
    }
}

5.关于运行时常量池,下列哪个说法是正确的
A.运行时常量池大小受栈区大小的影响
B.运行时常量池大小受方法区大小的影响
C.存放了编译时期生成的各种字面量
D.存放编译时期生成的符号引用
6.java中用()字指明继承关系,用()关键字指明对接口的实现。
A.implements extends
B.extends implements
C.extend implement
D.implement extend
7.与未加访问控制符的缺省情况相比,public和protected修饰符扩大了属性和方法的被访问范围,private修饰符则缩小了这种范围。
A.正确
B.错误
8.以下叙述正确的是
A.实例方法可直接调用超类的实例方法
B.实例方法可直接调用超类的类方法
C.实例方法可直接调用子类的实例方法
D.实例方法可直接调用本类的实例方法
9.下列关于Java并发的说法中正确的是()
A.CopyOnWriteArrayList适用于写多读少的并发场景
B.ReadWriteLock适用于读多写少的并发场景
C.ConcurrentHashMap的写操作不需要加锁,读操作需要加锁
D.只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了
10.jre 判断程序是否执行结束的标准是()
A.所有的前台线程执行完毕
B.所有的后台线程执行完毕
C.所有的线程执行完毕
D.和以上都无关

(1)B
(2)B
(3)C
局部变量在使用时必须先初始化
(4)22 34 17
第一个数值

  1. new B()构造B类实例对象,进入B类的构造方法,B类构造方法的第一行代码用super(5)调用了父类带有参数的构造函数,父类的构造函数又调用了setValue()方法,但值得注意的是,子类中的方法覆盖父类的方法以后,由于向上转型,父类调用的方法实际上是子类的。那么这里的setValue(v);调用了B类的setValue()方法,而B类中setValue()方法又使用super关键字调用了父类的setValue()方法,将B实例的value值设置为2 x 5 = 10。那么到这里,B类的构造函数中第一行代码super(5)执行完毕,程序继续向下执行进入setValue(getValue()- 3);代码块。

  2. 这里先执行getValue()方法,但因为B类中并没有重写该方法,这里需要调用父类的getValue()方法。进入A类getValue()方法,首先是value++,那么此时B的成员变量value值由 10变为11,程序继续向下执行,将11作为返回值,但此处要注意的一点是,在Try catch finally体系当中,在return之前始终会执行finally里面的代码,如果finally里面有return,则数据跟随finally改变。如果没有return,则原数据不跟随finally里改变的数据改变。那么进入finally代码块,由于此时正在初始化的是B类的一个对象(运行时多态),因此调用B类的setValue()方法。B类的setValue()方法中使用super关键字调用了父类的setValue()方法,将原有的value*2,即11 x 2 = 22,继续向下进行System.out.println(value);输出第一个数值22。随后,A类的getValue()方法将之前暂存的value=11返回。

第二个数值

  1. 拿到getValue()方法返回值之后程序继续运行,此处代码变为setValue(11- 3);根据和之前相同的流程,B类成员变量value的值变为16。程序运行到此处,new B()执行完毕。

  2. 回到main函数中,实例化的B类对象调用getValue()方法,B类中并没有重写该方法,需要调用父类的getValue()方法。getValue()方法第一行代码value++将B的成员变量value值变为17,此时执行到return代码,将value=17暂存,等待finally代码块运行完毕后返回。

  3. 此处finally代码块执行流程和之前相同,这里不再赘述。那么执行完this.setValue(value);后,value值变为2 x 17 = 34。继续向下进行System.out.println(value);输出第二个数值34,return刚刚暂存的value=17。

第三个数值

回到main函数,将刚刚返回的值输出,就得到了第三个数值17。

综上所述,本题正确答案为B。
(5)BCD
运行时常量池是方法区的一部分,Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表,用于存放编译器生成的各种字面量与符号引用,这部分内容在类加载后存放到运行时常量池。一般除了保存 Class 文件中描述的符号引用外,还会把符号引用翻译的直接引用也存储在运行时常量池。运行时常量池相对于 Class 文件常量池的一个重要特征是动态性,Java 不要求常量只有编译期才能产生,运行期间也可以将新的常量放入池中,这种特性利用较多的是 String 的 intern 方法。运行时常量池是方法区的一部分,受到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError。
(6)答案:B
extends表继承父类
implements表是实现接口
(7)A
(8)D
A错误,类的实例方法是与该类的实例对象相关联的,不能直接调用,只能通过创建超类的一个实例对象,再进行调用
B错误,当父类的类方法定义为private时,对子类是不可见的,所以子类无法调用
C错误,子类具体的实例方法对父类是不可见的,所以无法直接调用, 只能通过创建子类的一个实例对象,再进行调用
D正确,实例方法可以调用自己类中的实例方法
(9)答案:B
A,CopyOnWriteArrayList适用于写少读多的并发场景
B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,
读与读之间可以并发执行。在读多写少的情况下可以提高效率
C,ConcurrentHashMap是同步的HashMap,读写都加锁
D,volatile只保证多线程操作的可见性,不保证原子性
(10)A
main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面。
前台线程和后台线程的区别和联系:
1、后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。
2、可以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。
3、不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。

4、托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。
说明:
应用程序的主线程以及使用Thread构造的线程都默认为前台线程
使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nicholas_giao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值