小曾带你刷牛客03(Java版本)

继续刷题,砥砺前行!
同时刷完后,自己也要再开始复习一下Java基础,刷题不是目的,查漏补缺才是王道!

题目1

要在session对象中保存属性,可以使用以下哪个语句( )
A:session.getAttribute(“key”,”value”)
B:session.setAttribute(“key”,”value”)
C:session.setAttribute(“key”)
D:session.getAttribute(“key”)

解析:这个题目主要考察get和set的用法 大家主要记住:获取属性用getAttribute 保存属性用setAttribute
题目中说要保存属性,属性是一个键值对,要把键值对内容都传递进去。

题目2

关于抽象类和接口叙述正确的是? ( )
A:抽象类和接口都能实例化的
B:抽象类不能实现接口
C:抽象类方法的访问权限默认都是public
D:接口方法的访问权限默认都是public

解析:主要考察抽象类和接口的一些特性 下面来带大家一起来熟悉一下内容
抽象类
1.抽象类中可以构造方法
2.抽象类中可以存在普通属性,方法,静态属性和方法。
3.抽象类中可以存在抽象方法。
4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
6,抽象类不能被实例化,抽象类和抽象方法必须被abstract修饰
关键字使用注意: 抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。

接口
1.在接口中只有方法的声明,没有方法体。
2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上public static final
3.在接口中的方法,永远都被public来修饰。
4.接口中没有构造方法,也不能实例化接口的对象。(所以接口不能继承类)
5.接口可以实现多继承
6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类。
7.接口可以继承接口,用extends

抽象类和接口的区别
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public、abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。

题目3

关于AOP错误的是?
A:AOP将散落在系统中的“方面”代码集中实现
B:AOP有助于提高系统可维护性
C:AOP已经表现出将要替代面向对象的趋势
D:AOP是一种设计模式,Spring提供了一种实现

解析:相信一开始大家看到AOP,或许还有一些蚌埠住了,其实AOP也叫面向方面编程,AOP是OOP(面向对象编程)的延续,使用AOP可以实现很多OOP不容易实现的功能,并不是取代,而是相辅相成。

AOP与OOP是面向不同领域的两种设计思想。
OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
AOP(面向方面编程)是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果

题目4

下面有关java final的基本规则,描述错误的是?
A:final修饰的类不能被继承
B:final修饰的成员变量只允许赋值一次,且只能在类方法赋值
C:final修饰的局部变量即为常量,只能赋值一次。
D:final修饰的方法不允许被子类覆盖

解析:还是考察java中关键字final的特点
1、final修饰的方法,不允许被子类覆盖。
2、final修饰的类,不能被继承。
3、final修饰的成员变量为基本数据类型,在赋值之后无法改变。。
4、final修饰的成员变量为基本数据类型是,在赋值之后无法改变。当final修饰的成员变量为引用数据类型时,在赋值后其指向地址无法改变,但是对象内容还是可以改变的。
5、final修饰的成员变量在赋值时可以有三种方式。(1)在声明时直接赋值(2)在构造器中赋值(3)在初始代码块中进行赋值。
6、对于static final修饰的变量,其定义可以有两处:变量申明处;静态构造代码块

题目5

下面代码运行结果是?

public class Test
{
    static boolean foo(char c)
    {
        System.out.print(c);
        return true;
    }
    public static void main( String[] argv )
    {
        int i = 0;
        for ( foo('A'); foo('B') && (i < 2); foo('C'))
        {
            i++ ;
            foo('D');
        }
    }
}

A:ABDCBDCB
B:ABCDABCD
C:Compilation fails.
D:An exception is thrown at runtime.

解析:主要考察for循环的执行顺序:
for(条件1;条件2;条件3) { //语句 }
执行顺序是条件1->条件2->语句->条件3->条件2->语句->条件3->条件2…
如果条件2为true,则一直执行。如果条件2为false,则for循环结束

for(a;b;c)
执行顺序
先执行a
在判断b是否为真,若为真
执行循环体,
执行c
然后再次判断b是否为真,若为真
执行循环体
执行c
。。。
直到b为假,跳出循环

题目6

下面哪个Set类是排序的?
A:LinkedHashSet
B:TreeSet
C:HashSet
D:AbstractSet

解析:TreeSet自然排序,LinkedHashSet按添加顺序排序 LinkedHashSet
继承于HashSet、又基于LinkedHashMap 来实现
TreeSet
使用二叉树的原理对新add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。
HashSet
存储元素的顺序并不是按照存入时的顺序(和 List 显然不同) 而是按照哈希值来存的所以取数据也是按照哈希值取得

题目7

在java的一个异常处理中,可以包含多个的语句块是 ( )
A:try
B:finally
C:throws
D:catch

解析: 异常处理一般格式:
捕获异常: try{
//代码块
}catch(异常类型,例如:Exception e){
//需要抛出的异常,例如:e.printStackTrace();
}catch(异常类型){
//需要抛出的异常
}finally{
//必定执行的代码块 }
所以说在一个异常处理中catch语句块是可以多个的,也就是可以抛出多个异常!

题目8

阅读如下代码。 请问,对语句行 test.hello(). 描述正确的有()

package NowCoder;
class Test {
    public static void hello() {
        System.out.println("hello");
    }
}
public class MyApplication {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test test=null;
        test.hello();
    }
}

A:能编译通过,并正确运行
B:因为使用了未初始化的变量,所以不能编译通过
C:以错误的方式访问了静态方法
D:能编译通过,但因变量为null,不能正常运行

解析:static关键字修饰方法的用法 被static修饰的方法叫做静态方法 如题中hello就是一个静态方法 静态方法的访问有两种:
1.直接使用“类名.”调用 Test.hello(); (一般都用第一种方法,让人一下就明白这是静态方法)
2.new 一个对象 ,“引用.” 的方式调用 使用这种方法,其实底层会转化为 "类名."调用的方式 本题中就用了第二种方法,虽然Test test = null 但是test.hello();------>Test.hello();
所以正常编译运行

题目9

判断一块内存空间是否符合垃圾收集器收集的标准有哪些?
A:给对象赋予了空值null,以下再没有调用过
B:对象重新分配了内存空间
C:给对象赋予了空值null
D:给对象赋予了新值

解析: 在java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:
1.给对象赋值为null,以下没有调用过。
2.给对象赋了新的值,重新分配了内存空间。

题目10

下列哪些操作会使线程释放锁资源?
A:sleep()
B:wait()
C:join()

D:yield()

解析:
1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。 sleep()使当前线程进入阻塞状态,在指定时间内不会执行。
2.wait()方法 在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。
当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。
唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。
waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。
3.yield方法 暂停当前正在执行的线程对象。 yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
yield()只能使同优先级或更高优先级的线程有执行的机会。
4.join方法 join()等待该线程终止。 等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测

猜你喜欢

转载自blog.csdn.net/qq_36317312/article/details/120274129