java考证练习错题及易错题解析

错题解析


1.
在这里插入图片描述
在开发TCP程序时,首先需要创建服务器端程序。JDK的java.net包中提供了一个ServerSocket类,该类的实例对象可以实现一个服务器端的程序。通过查阅API文档可知,ServerSocket 类提供了多个构造方法,接下来就对ServerSocket的构造方法进行详细讲解

(1)ServerSocket()
使用该构造方法在创建ServerSocket对象时并没有指定端口号,因此该对象不监听任可端口,不能直接使用,使用时还需要调用bind(SocketAddress endpoint)方法将其绑定到定的端口号上。

(2)ServerSocket(int port)
使用该构造方法在创建ServerSocket对象时,可以将其绑定到指定的端口号上。如果 接端指定一个端口号

(3)ServerSocket(int port,int backlog)
该构造方法就是在第2个构造方法的基础上,增加了一个baklog参数,该参数用于超定在服务器忙时,可以与之保持连接请求的等待客户端数量,如果没有指定这个参数,默认值认为是50.

(4) ServerSocket(int port. int backlog, InetAddress lindAddr)
该构造方法就是在第3个构造方法的基上,指定了相关的1P地址,这种情况适用于计算机上有多块网卡和多个IP的情况,使用时可以明确规定ServerSocket在哪块网卡或IP地址上等待客户端的连接请求。显然,对于一般只有一块网卡的情况,就不用专门指定发参数。



2.
在这里插入图片描述

public class e13 {
    void fermin(int m){
        m--;
        System.out.println(m); // 2
    }
    int fermin1(int m){
        m--;
        return m;
    }
    public static void main(String[] args) {
        e13 inc = new e13();
        int i = 3;
        inc.fermin(i);       // 结果1 结果2
        i = inc.fermin1(i);
        System.out.println(i); // 3    2

        i = i--;
        System.out.println(i); // 3    2

        i--;
        System.out.println(i); // 2    1

        int n = i--;
        System.out.println(n); // 2    1
    }i
}

这道题目主要考察的是变量与赋值之间Java 自增(自减)原理的逻辑顺序。
按照原题首先创建了类的实例,创建变量i=3,接着调用方法传入实参i,在方法体内对实参进行了自减,所以在方法体内的i此时为2;接着又将i–赋给了i,最终输出i。
就拿 i = i++来说,执行顺序其实是:

 i = i ++ ; 其实是拆分成3条语句,而不是两条
 
1. int temp = i;
2. i = i + 1;
3. i = temp;

最终输出的还是原来的i值,如果直接i++,则输出的是改变后的值
inc.fermin(i);这句代码的作用只是在该方法内对传入的实参进行了内部处理操作,并未影响到真正的i值本身,所以原体中的i始终没有真正的改变过。我将上面的题目进行了修改,添加了一个有返回值类型的fermin方法,并将该方法返回值重新赋给了i,结果为注释的第二列,结果一目了然。

同类题型:
在这里插入图片描述



3.
在这里插入图片描述
在这里插入图片描述

1.抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰:

  • 抽象方法没有方法体,是用来被继承的,所以不能用private修饰;

1,private 的作用
被private关键字私有的成员之后,就只能在本类当中进行访问了
2,private关键字特点
是一个权限修饰符
可以修饰成员变量和成员方法
被其修饰的成员只能在本类中被访问
3,封装和private的应用:

把成员变量用private修饰

提供对应的getXxx()和setXxx()方法

  • private仅仅是封装的一种体现形式,不能说封装就是私有
  • static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽象方法用static修饰没有意义;
  • 使用synchronized关键字是为该方法加一个锁。而如果该关键字修饰的方法是static方法。则使用的锁就是class变量的锁。如果是修饰类方法,则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的,是在其子类实现的。所以,锁应该归其子类所有。所以抽象方法也就不能用synchronized关键字修饰了;
  • native,这个东西本身就和abstract冲突,他们都是方法的声明,只是一个吧方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢?

2、接口是一种特殊的抽象类,接口中的方法全部是抽象方法 — jdk1.8前(但其前的 public abstract可以省略 — 默认访问修饰符),所以抽象类中的抽象方法不能用的访问修饰符这里也不能用。而且protected访问修饰符也不能使用,因为接口可以让所有的类去实现(非继承),不只是其子类,但是要用public去修饰。接口可以去继承一个已有的接口。

在这里插入图片描述
java 类修饰符、成员变量修饰符、方法修饰符总结
java中抽象类与接口中方法访问修饰符问题



4.
在这里插入图片描述
Java中的事件监听机制的定义

Java事件监听机制在Java图形界面编程处常用。我们会对界面做一些操作,比如输入框输入数据,点击登录按钮等等。这些操作被称为事件,当采取这些操作之后,程序会采取一定的措施响应。

1.事件源对象

  • 1)哪些内容可以成为事件原对象呢?
    只有容器组件和元素组件可以成为事件源对象。
  • 2)图形界面上如何确定谁是事件源对象呢?
    当你的动作发生在哪一个组件上,那么该组件就是事件源对象。

2.事件监听方法

  • 1.事件监听方法是由事件源对象提供的。
  • 2.事件监听方法捕获事件源对象上面的动作,如果有动作发生,则事件监听方法捕获动作,收集事件源对象的信息和动作信息,然后将信息交给事件接口的对象进行处理。

3.事件接口(事件处理类)

  • 事件接口对象拿到信息后,就会根据动作信息,去调用对应的事件处理方法(把动作信息和事件源对象的信息封装到**Event的对象中),执行方法中的代码。

在这里插入图片描述



5.
在这里插入图片描述
在这里插入图片描述
sleep方法可以暂停一个线程的执行,当休眠期结束后,首先结束阻塞状态,进入就绪态,等待CPU的调度后才能恢复其执行。
在这里插入图片描述

public class e15 {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                // start()之后,如果马上运行退出我们获取不到线程在运行的状态。
                // 在这里使用sleep方法休眠一会儿
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        System.out.println("t1线程start前的状态 " + t1.isAlive());
        t1.start();
        System.out.println("t1线程start后的状态 " + t1.isAlive());

        boolean alive = Thread.currentThread().isAlive();
        System.out.println("打印main线程的alive状态:" + alive);

    }
}

在这里插入图片描述
注意线程新建状态的定义,并没有调用start()方法。

【java 多线程】



6.
在这里插入图片描述
大佬博客:深入理解java虚拟机(全章节完整)


在这里插入图片描述
在这里插入图片描述



7.
在这里插入图片描述
java只支持单继承。所有的类都间接继承自Object类,本题中可以将A类看做是Object类。



8.

在这里插入图片描述
static关键字:

  • 1、被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享。

怎么理解 “被类的实例对象所共享”
这句话呢?就是说,一个类的静态成员,它是属于大伙的【大伙指的是这个类的多个对象实例,我们都知道一个类可以创建多个实例!】,所有的类对象共享的,不像成员变量是自个的【自个指的是这个类的单个实例对象】…

  • 2、在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。

  • 3、static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!

  • 4、被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。

Java里面static一般用来修饰成员变量或函数。但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。因为static修饰的东西在类加载之前进行初始化,若用static修饰类,那么为什么还要再去加载呢?发生了冲突~

java.面向对象.static关键字



9.
在这里插入图片描述
在这里插入图片描述

java中File类方法详解
File类的知识
文本文件和二进制文件的差异和区别



10.
在这里插入图片描述
在这里插入图片描述

JAVA 布局管理器
【java GUI图形用户接口总结】

在这里插入图片描述
在这里插入图片描述



11.
在这里插入图片描述
实例方法、类方法、构造方法

实例方法,就是一般的方法
类方法,有static修饰符,典型的主函数
构造方法,没有返回值(就是连void都没有),方法名与类名一样

1、类方法是属于整个类,而不属于某个对象。
2、类方法只能访问类成员变量,不能访问实例变量,而实例方法可以访问类成员变量和实例变量。
3、在类方法中不能使用super、this关键字。
4、类方法的调用可以通过类名.类方法和对象.类方法,而实例方法只能通过对象.实例方法访问。
5、类方法只能访问类方法,而实例方法可以访问类方法和实例方法。
6、类方法不能被覆盖,实例方法可以被覆盖。

在这里插入图片描述
在这里插入图片描述



12.
在这里插入图片描述
RandomAccessFile 详解

RandomAccessFile类它不属于流类,但是具有读写文件数据的功能,可以随机从文件中的任何位置开始读写。
同时,RandomAccessFile可以将文件以指定的操作权限(只读、可读写)的方式打开。

本质上说,RandomAccessFile的工作方式类似于把DataInputStream和DataOutputStream结合起来,还添加了一些方法,其中方法getFilePointer( )用来查找当前所处的文件位置,seek( )用来在文件内移至新的位置,length( )用来 判断文件大小 。此外,它的构造方法还需要一个参数来表示打开模式(只读方式 r 读写方式 rw),它不支持只写文件。

model参数:

“r” 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
“rw” 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
“rws” 打开以便读取和写入,对于 “rw”,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
“rwd” 打开以便读取和写入,对于 “rw”,还要求对文件内容的每个更新都同步写入到底层存储设备。 JDK 1.6上面写的

import java.io.RandomAccessFile;
public class randomAccessFile {
    public static void main(String[] args) throws Exception{

        // 创建对象,并以读写模式打开文本文档
        RandomAccessFile raf = new RandomAccessFile("src/RandomAccessFile/time.txt","rw");

        String a = raf.readLine();
        //System.out.println(a);

        // 读取还可以使用的次数
        int times = Integer.parseInt(a)-1;

        // 判断剩余的次数
        if (times>0){
            // 每执行一次代表试用一次,次数就减少一次
            System.out.println("你还可以试用"+times+"次!");
            // 将记录指针重新指向文件开头‘
            raf.seek(0);
            // 将剩余次数写入文件
            raf.write((times+"").getBytes());
        }else{
            System.out.println("您的试用次数已使用完!");
        }
        // 关闭流
        raf.close();
    }
}


13.
在这里插入图片描述
Java.异常
在这里插入图片描述



14.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



15.
在这里插入图片描述
在这里插入图片描述


15.
在这里插入图片描述


16.
在这里插入图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

骑着蜗牛ひ追导弹'

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

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

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

打赏作者

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

抵扣说明:

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

余额充值