Java学习记录——错题总结(六)

第一套

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

关于B选项:Java:语法要求的构造函数只能那么写。如果写成public void 类名(){} 这种格式的话。此时就相当与你重新定义了一个函数,不能起到构造函数的作用,调用这个类的时候不能自动执行构造函数里的代码。

2.下面程序的结果是

public class Demo {
    public static String sRet = "";
    public static void func(int i)
    {
        try
        {
            if (i%2==0)
            {
                throw new Exception();
            }
        }
        catch (Exception e)
        {
            sRet += "0";
            return;
        } 
        finally
        {
            sRet += "1";
        }
        sRet += "2";
    }
    public static void main(String[] args)
    {
        func(1);
        func(2);
        System.out.println(sRet);
    }
}

正确答案: B
120
1201
12012
101

过程:
①调用func(1),if不符合,直接进入finally,sRet=“1"
②finally语句中没有返回值,故继续向下执行,sRet=“12”
③调用func(2),if符合,sRet=“120”,此时有返回值!!!
④调用finally语句,sRet=“1201”
⑤因为已经有返回值了,finally之后的语句也不再执行,sRet=“1201”。

3.下列不是 Java 关键字的是 ( )

正确答案: D
abstract
false
native
sizeof

Java中的关键字有哪些?
答:1)48个关键字:abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while。
2)2个保留字(现在没用以后可能用到作为关键字):goto、const。
3)3个特殊直接量:true、false、null。

第二套

1.在一个基于分布式的游戏服务器系统中,不同的服务器之间,哪种通信方式是不可行的()?
正确答案: A
管道
消息队列
高速缓存数据库
套接字

管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

2.下面有关Java的说法正确的是( )
正确答案: A C D F
A. 一个类可以实现多个接口
B. 抽象类必须有抽象方法
C. protected成员在子类可见性可以修改
D. 通过super可以调用父类构造函数
E. final的成员方法实现中只能读取类的成员变量
F. String是不可修改的,且java运行环境中对string对象有一个对象池保存

E解析:解释一下后两个,final 的成员方法除了能读取类的成员变量,还能读取类变量
F解析:String 不可以修改,StringBuffer 和 StringBuilder 可以修改,String 只能改变指引,如果字符串常量池中没有正需要的串,就创建一 个新的字符串,然后让 String 对象指向它。

3.(Java反射相关)
Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:( )
正确答案: A D F
A.Java反射主要涉及的类如Class, Method, Filed,等,他们都在java.lang.reflet包下
B.通过反射可以动态的实现一个接口,形成一个新的类,并可以用这个类创建对象,调用对象方法
C.通过反射,可以突破Java语言提供的对象成员、类成员的保护机制,访问一般方式不能访问的成员
D.Java反射机制提供了字节码修改的技术,可以动态的修剪一个类
E.Java的反射机制会给内存带来额外的开销。例如对永生堆的要求比不通过反射要求的更多
F.Java反射机制一般会带来效率问题,效率问题主要发生在查找类的方法和字段对象,因此通过缓存需要反射类的字段和方法就能达到与之间调用类的方法和访问类的字段一样的效率

A Class类在java.lang包
B 动态代理技术可以动态创建一个代理对象,反射不行
C 反射访问私有成员时,Field调用setAccessible可解除访问符限制
D CGLIB实现了字节码修改,反射不行
E 反射会动态创建额外的对象,比如每个成员方法只有一个Method对象作为root,他不胡直接暴露给用户。调用时会返回一个Method的包装类
F 反射带来的效率问题主要是动态解析类,JVM没法对反射代码优化。

第三套

//point X
public class Foo {
    public static void main(String[] args) throws Exception {
 
        PrintWriter out = new PrintWriter(
                new java.io.OutputStreamWriter(System.out), true);
        out.println("Hello");
    }
 
}

下面哪个选项放在point X这里可以正确执行?

正确答案: A 你的答案: C (错误)
import java.io.PrintWriter;
include java.io.PrintWriter;
import java.io.OutputStreamWriter;
include java.io.OutputStreamWriter;
no statement is needed.

说一下c为什么不是:因为这里在创建OutputStreamWriter的时候,使用的是类的全名称java.io.OutputStreamWriter

java.io.OutputStreamWriter(System.out), true);
        out.println("Hello");

所以不需要使用import

static String str0="0123456789";
static String str1="0123456789";
String str2=str1.substring(5);
String str3=new String(str2);
String str4=new String(str3.toCharArray());
str0=null;
假定str0,...,str4后序代码都是只读引用。

Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为()
正确答案: C 你的答案: C (正确)
5
10
15
20

解析:这是一个关于java的垃圾回收机制的题目。垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。

 年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。

年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收

永久代:存储的是final常量,static变量,常量池。

str3,str4都是直接new的对象,而substring的源代码其实也是new一个string对象返回,如下图:


经过fullgc之后,年老区的内存回收,则年轻区的占了15个,不算PermGen。所以答案选C

3.以下描述正确的是
正确答案: B 你的答案: B (正确)
CallableStatement是PreparedStatement的父接口
PreparedStatement是CallableStatement的父接口
CallableStatement是Statement的父接口
PreparedStatement是Statement的父接口

继承关系图
在这里插入图片描述
4.对于JVM内存配置参数:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
,其最小内存值和Survivor区总大小分别是()
正确答案: D 你的答案: D (正确)
5120m,1024m
5120m,2048m
10240m,1024m
10240m,2048m

-Xmx:最大堆大小
-Xms:初始堆大小
-Xmn:年轻代大小
-XXSurvivorRatio:年轻代中Eden区与Survivor区的大小比值
年轻代5120m, Eden:Survivor=3,Survivor区大小=1024m(Survivor区有两个,即将年轻代分为5份,每个Survivor区占一份),总大小为2048m。
-Xms初始堆大小即最小内存值为10240m

5.下列哪些操作会使线程释放锁资源?
正确答案: B C
sleep()
wait()
join()
yield()

1.sleep会使当前线程睡眠指定时间,不释放锁
2.yield会使当前线程重回到可执行状态,等待cpu的调度,不释放锁
3.wait会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify,notifyAll唤醒时进入可执行状态
4.当前线程调用 某线程.join()时会使当前线程等待某线程执行完毕再结束,底层调用了wait,释放锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为一个AI语言模型,我无法编完整的Java应用程序,但我可以给你一些指导,希望能帮到你。 首先,你需要确定你的错题本App需要包含哪些功能。以下是一个简单的功能列表: 1. 用户登录和注册 2. 添加题目和答案 3. 查看错题列表 4. 删除错题 5. 修改错题 6. 退出登录 接下来,你需要设计数据库表结构。你可以使用MySQL或其他数据库管理系统来存储数据。以下是一个简单的数据库表结构: 1. 用户表:包含用户ID、用户名和密码 2. 题目表:包含题目ID、题目、答案和用户ID 3. 错题表:包含错题ID、题目ID和用户ID 然后,你需要编Java代码来实现上述功能。以下是一个简单的代码示例: 1. 用户登录和注册: ``` // 登录 public boolean login(String username, String password) { // 根据用户名和密码查询用户表 // 如果查询到了用户记录,返回true,否则返回false } // 注册 public boolean register(String username, String password) { // 插入新用户记录到用户表 // 如果插入成功,返回true,否则返回false } ``` 2. 添加题目和答案: ``` public boolean addQuestion(String question, String answer, int userId) { // 插入新题目记录到题目表 // 如果插入成功,返回true,否则返回false } ``` 3. 查看错题列表: ``` public List<Question> getWrongQuestions(int userId) { // 根据用户ID查询错题表和题目表,返回错题列表 } ``` 4. 删除错题: ``` public boolean deleteWrongQuestion(int wrongQuestionId) { // 根据错题ID删除错题记录 // 如果删除成功,返回true,否则返回false } ``` 5. 修改错题: ``` public boolean updateWrongQuestion(int wrongQuestionId, String question, String answer) { // 根据错题ID更新题目表的题目和答案 // 如果更新成功,返回true,否则返回false } ``` 6. 退出登录: ``` public void logout() { // 清除用户登录状态 } ``` 最后,你需要将这些代码整合到一个Java应用程序,并使用Java Swing或其他UI框架来实现用户界面。你还需要编一些单元测试来确保你的代码能够正确地处理各种情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值