牛客Java专项练习错题整理(1)

1.下列类在多重catch中同时出现时,哪一个异常类应最后一个列出()
ArithmeticException
NumberFormatException
Exception
ArrayIndexOutOfBoundException

解析:这是多重catch块的顺序问题,由于异常处理系统就近寻找匹配异常处理程序,应该先子类后父类
答案:C

2.java 中哪个关键字可以对对象加互斥锁?
transient
synchronized
serialize
static

解析:

互斥锁的概念
A lock protects sections of code ,allowing only one thread to execute the code at a time
A lock manages thread that are trying to enter a protected segment
A lock can have one or more associated condition objects
Each condition object manages thread that have entered a protected code section but that can not proceed

synchronized:用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码。
volatile:用来确保将变量的跟新操作通知到其他线程,当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。然而,在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比 synchronized关键字更轻量级的同步机制。
serialize:Java对象序列为二进制文件
答案:A

String str1 = “abc”,“abc”分配在内存哪个区域?


字符串常量区
寄存器

解析:
用new创建的对象在堆区
函数中的临时变量在栈区
java中的字符串在字符串常量区

答案:C

导出类调用基类的构造器必须用到的关键字: ( )
this
final
super
static

解析:
基类:父类、超类
导出类:子类、派生类
答案:C

已知如下类定义:如下哪句可以正确地加入子类中?
private void fun( int n ){ //...}
void fun ( int n ){ //... }
protected void fun ( int n ) { //... }
public void fun ( int n ) { //... }

class Base {  
 public Base (){ 
 //... 
 }  
 public Base ( int m ){ 
 //... 
 }  
 public void fun( int n ){ 
 //... 
 } 
}  
public class Child extends Base{  
 // member methods  
}  

解析:
如果要在子类中复现父类中定义的方法,需要对父类中的方法进行重写。
方法的重写(override)两同两小一大原则:
方法名相同,参数类型相同
子类返回类型小于等于父类返回类型
子类抛出异常小于等于父类方法抛出异常
子类访问权限大于等于父类访问权限
答案:D

以下类型为Final类型的为()
HashMap
StringBuffer
String
Hashtable

解析:
final修饰的成员变量为基本数据类型时,变量赋值后其变量值无法改变。
当final修饰引用变量时,在赋值后其引用地址值无法改变,但对象的内容可以改变
final的类不能被继承,但其对象的内容可以修改。
String和StringBuffer都是通过字符数组实现的,其中String的字符数组是final修饰的,所以字符数组不可以修改
StringBuffer的字符数组没有final修饰,所以字符数组可以修改
String,StringBuffer都是final修饰的,只是限制他们所储存的引用地址不可以修改。
地址中的内容可不可以修改取决于它们的字符数组可不可以修改。
其中StringBuffer的字符数组没有final修饰,所以可以修改。

下面的switch语句中,x可以是哪些类型的数据:()
long
char
float
byte
double
Object

switch(x)
{
default:
System.out.println("Hello");
}

解析:
Java8中,switch支持10种类型:
基本数据类型:byte,chart,short,int
包装类:Byte,Short,Character,Integer,String,Enum
Switch实际上只支持int类型
那其他类型的语句是怎么支持的?
基本类型byte char short 原因:这些基本数字类型可以向上转型为int,实际用的还是int,
基本包装类型:Byte,Short,Character,Integer:java的自动拆箱机制,可看这些对象自动转为基本类型

通过HttpServletRequest. getParameter获取的参数.
总是采用UTF-8编码
总是采用lS08859-1编码
由客户端浏览器和Web容器配置共同决定编码
由服务器所在的操作系统决定编码

解析:
编码格式是由浏览器决定的,浏览器根据HTML中指定的编码格式进行编码,tomcat根据指定的格式进行编码。
答案:C

装箱、拆箱操作发生在: ()
类与对象之间
对象与对象之间
引用类型与值类型之间
引用类型与引用类型之间

解析:
装箱和拆箱的概念:
装箱就是基本数据类型到包装类之间的转换
拆箱就是包装类到基本数据类型的转换
包装类就是引用类型,基本数据类型是值类型
答案:C

在一个基于分布式的游戏服务器系统中,不同的服务器之间,哪种通信方式是不可行的()?

管道
消息队列
高速缓存数据库
套接字

解析:
管道:

  1. 普通管道:PIPE,通常有两种限制,一种是单工,只能单向传输,二是血缘,常用于父子进程间,或有血缘关系的进程间。
  2. 流管道S_PIPE,去除了上述第一种限制,实现了双向传输
  3. 命名管道:去除了上述第二种限制,实现了无血缘关系的不同进程之间的通信

显然,要求对于不同服务器之间的通信,是要要求全双工形式的,而管道只能是半双工,虽然可以双向,但是同时只能有一个方向传输。

以下说法错误的是()
虚拟机中没有泛型,只有普通类和普通方法
所有泛型类的类型参数在编译时都会被擦除
创建泛型对象时请指明类型,让编译器尽早的做参数检查
泛型的类型擦除机制意味着不能在运行时动态获取List<T>中T的实际类型

解析:

JVM如何理解泛型概念——类型擦除,事实上JVM并不知道泛型,所有的泛型在编译阶段就被处理成了普通的类和方法。
答案:D

下列Java代码中的变量a、b、c分别在内存的____存储区存放。
堆区、堆区、堆区
堆区、栈区、堆区
堆区、栈区、栈区
堆区、堆区、栈区
静态区、栈区、堆区
静态区、栈区、栈区

class A {
    private String a = “aa”;
    public boolean methodB() {
        String b = “bb”;
        final String c = “cc”;
    }
}

解析:
堆区:存放类对象,线程共享
栈区:存放方法的局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;
答案:C

在Web应用程序中,( )负责将HTTP请求转换为HttpServletRequest对象
Servlet对象
HTTP服务器
Web容器
JSP网页

解析:
web容器是一种服务程序,在服务器的一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如JAVA中的Tomcat容器, ASP的IIS或PWS都是这样的容器。
一个服务器可以有多个容器。
答案:C

What is displayed when the following is executed;
Ceil d1=-0.0
floor d1=-1.0
Ceil d1=0.0
floor d1=-1.0
Ceil d1=-0.0
floor d1=-0.0
Ceil d1=0.0
floor d1=0.0
Ceil d1=0
floor d1=-1

double d1=-0.5;
System.out.println("Ceil d1="+Math.ceil(d1));
System.out.println("floor d1="+Math.floor(d1));

解析:
ceil 方法上有这么一段注释:If the argument value is less than zero but greater than -1.0, then the result is negative zero
如果参数小于0且大于-1.0,结果为 -0

ceil 和 floor 方法 上都有一句话:If the argument is NaN or an infinity or positive zero or negative zero, then the result is the same as the argument,意思为:如果参数是 NaN、无穷、正 0、负 0,那么结果与参数相同,
如果是 -0.0,那么其结果是 -0.0

答案:A

Java的体系结构包含( )。
Java编程语言
Java类文件格式
Java API
JVM

解析:
Java技术体系结构包含四个独立但相关的技术:
JAVA程序设计语言
JAVA.class文件格式
JAVA应用编程接口
Java虚拟机
四者的关系:
在编写JAVA程序的时候,使用JAVA程序设计语言进行代码的编写,把它编译成java.class文件格式,然后在java虚拟机中运行class文件。当程序运行的时候,它通过调用class文件实现了JAVA API中的方法来满足JAVA API调用。
答案:ABCD

Java类Demo中存在方法func1、func2、func3和func4,请问该方法中,哪些是不合法的定义?( )
func1
func2
func3
func4

public class Demo{
 
  float func1()
  {
    int i=1; 
    return; //return没有返回值,错误
  }
  float func2()
  {
    short i=2;
    return i;  // short - float 由小到大直接转换无序强制转换
  }
  float func3()
  {
    long i=3;
    return i;  //long - float 由小到大直接转换无序强制转换
  }
  float func4()
  {
    double i=4;
    return i;   //由大到小需要强制转换但没有,错误。
  }
}

解析:本题考察的是数据类型转换的问题:由大到小需要强制转换,由小到大不需要
数据类型大小排序:
byte < short < int < long < float < double < char < boolean (按字节数进行排序)

socket编程中,以下哪个socket的操作是不属于服务端操作的()?
accept
listen
connect
close

解析

答案C: connect属于TCP客户端的操作

关于访问权限说法正确 的是 ? ( )
外部类前面可以修饰public,protected和private
成员内部类前面可以修饰public,protected和private
局部内部类前面可以修饰public,protected和private
以上说法都不正确

解析:

  1. 对于外部类而言,它也可以使用访问控制符修饰,但外部类只能由两种访问控制级别:public,default,因为外部类没有处于任何内部类中,也就没有其所在类的内部、所在类的子类两个范围,使用private,protected两个访问控制符修饰外部类灭有意义
  2. 内部类的上一个程序单元是外部类,它具有4个作用域,同一个类(private),同一个包(protected),任何位置(default)
  3. 因为局部成员的作用域是所在方法,其他程序单元永远不可能访问另一个方法中的局部变量,所以所有局部成员都不能使用访问控制符修饰。

java中提供了哪两种用于多态的机制
通过子类对父类方法的覆盖实现多态
利用重载来实现多态.即在同一个类中定义多个同名的不同方法来实现多态。
利用覆盖来实现多态.即在同一个类中定义多个同名的不同方法来实现多态。
通过子类对父类方法的重载实现多态

解析:
Java通过方法的重写和方法的重载实现多态
方法重写:子类重写了父类中同名的方法
方法重载:在同一个类中,方法的名字相同但参数列表不同。
(重载是否为多态暂不讨论)

答案:AB

下列关于修饰符混用的说法,错误的是( )
abstract不能与final并列修饰同一个类
abstract类中不应该有private的成员
abstract方法必须在abstract类或接口中
static方法中能直接调用类里的非static的属性

解析:
A:正确,使用抽象类就是为了让类能够被继承,使用final关键字就是为了让类或方法或变量不能够被继承。一个类要么被继承要么不被继承。
B:正确,abstract类的存在就是为了让继承它的类能够使用和重写其内部方法,使用private不合理。
C: 有abstract方法的类其本身就是一个抽象类。
D:static方法存在静态区,静态区的方法不能调用非静态区的属性、

假定Base b = new Derived(); 调用执行b.methodOne()后,输出结果是什么?
public class Base
{
   public void methodOne()
   {
      System.out.print("A");//2.
      methodTwo(); //3.
   }
 
   public void methodTwo()
   {
      System.out.print("B"); //5.
   }
}
 
public class Derived extends Base
{
   public void methodOne()
   {
      super.methodOne();  //1.
      System.out.print("C"); //7.
   }
 
   public void methodTwo()
   {
      super.methodTwo(); //4.
      System.out.print("D"); //6.
   }
}

解析:
在被子类重写的方法中,不被super调用的方法都调用的是子类的方法。
父类只能调用父类方法或者子类覆写后的方法,而子类中的单独方法则是无法调用的。因此输出为ABDC

下面哪些是重载的基本条件()
参数的类型不同
参数类型的顺序不同(比如 int a , float b 与 float b , int a)
函数的返回值类型不同
参数的个数不同

解析:
重载的概念:
方法的名称相同,参数列表的个数、次序、类型不同
对返回值没有要求,可以相同也可以不同
如果其他都相同,仅返回值不同,则无法构成重载。

枚举(enum)属于原始数据类型(primitive type)。
正确
错误

枚举类是一种特殊对的类,既然是类。那他就不是原始数据类型了

以下哪个不属于JVM堆内存中的区域()?
survivor区
常量池
eden区
old区

解析:
jvm堆分为新生代(Eden区,两个Survivor区),老年代(old区)
常量池属于 PermGen(方法区)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容