Java小题精炼训练营(篇二)(1)

重载:方法的重载(overload):重载构成的条件:方法的名称相同,但参数类型或参数个数不同,才能构成方法的重载。

2 当一个类中没有定义任何构造方法,Java将自动提供一个缺省构造方法;

3 子类通过super关键字调用父类的一个构造方法;

4 当子类的某个构造方法没有通过super关键字调用父类的构造方法,通过这个构造方法创建子类对象时,会自动先调用父类的缺省构造方法

5 构造方法不能被static、final、synchronized、abstract、native修饰,但可以被public、private、protected修饰;

6 构造方法不是类的成员方法;

7 构造方法不能被继承。

E

6、指出下来程序运行的结果是

good and abc

good and gbc

tst ok and abc

tst ok and gbc

实参和形参的问题。"ex.change(ex.str, ex.ch)"语句调用"change"方法时,将ex.str变量(实参)的赋给了"change"方法中的str变量(形参),而将ex.ch(实参)的地址赋给了"change"方法中的ch(形参)。"change"方法运行时,第一条语句改变的是方法中形参的值,对实参没影响,第二条语句由于是直接改变的ch所指地址的值,所以把实参也进行了改变。

由于栈帧1的ex局部变量指向的对象内的成员str指向的对象没有任何变化,因此

System.out.println(ex.str+“and”); 依然打印结果为:good and

而成员ch指向的对象内容有所变化,因此

System.out.println(ex.ch);打印结果为:gbc

B

7、在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为()

this.A(x)

this(x)

super(x)

A(x)

this的作用其中一个就是在一个构造方法中调用另一个构造方法,格式为this(参数);

super是调用父类的方法;

A(a)这种形式是在new一个类时使用

B

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();

}

}

能编译通过,并正确运行

因为使用了未初始化的变量,所以不能编译通过

以错误的方式访问了静态方法

能编译通过,但因变量为null,不能正常运行

因为Test类的hello方法是静态的,所以是属于类的,当实例化该类的时候,静态会被优先加载而且只加载一次,所以不受实例化new Test();影响,只要是使用到了Test类,都会加载静态hello方法

在其他类的静态方法中也是可以调用公开的静态方法,此题hello方法是使用public修饰的所以在MyApplication中调用hello也是可以的。

即使Test test=null;这里也会加载静态方法,所以test数据中包含Test类的初始化数据。(静态的,构造的,成员属性)因此test.hello是会调用到hello方法的

A

9,下面有关java classloader说法正确的是()?

ClassLoader就是用来动态加载class文件到内存当中用的

JVM在判定两个class是否相同时,只用判断类名相同即可,和类加载器无关

ClassLoader使用的是双亲委托模型来搜索类的

Java默认提供的三个ClassLoader是Boostrap ClassLoader,Extension ClassLoader,App ClassLoader

JDK中提供了三个ClassLoader,根据层级从高到低为:

  1. Bootstrap ClassLoader,主要加载JVM自身工作需要的类。
  1. Extension ClassLoader,主要加载%JAVA_HOME%\lib\ext目录下的库类。
  1. Application ClassLoader,主要加载Classpath指定的库类,一般情况下这是程序中的默认类加载器一般情况下这是程序中的默认类加载器,也是ClassLoader.getSystemClassLoader() 的返回值。

JVM加载类的实现方式,我们称为 双亲委托模型

如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委托给自己的父加载器,每一层的类加载器都是如此,因此所有的类加载请求最终都应该传送到顶层的Bootstrap ClassLoader中,只有当父加载器反馈自己无法完成加载请求时,子加载器才会尝试自己加载。

双亲委托模型的重要用途是为了解决类载入过程中的安全性问题。

假设有一个开发者自己编写了一个名为**Java.lang.Object的类,想借此欺骗JVM。现在他要使用自定义ClassLoader来加载自己编写的java.lang.Object类。然而幸运的是,双亲委托模型不会让他成功。因为JVM会优先在Bootstrap ClassLoader的路径下找到java.lang.Object**类,并载入它

ACD

10、tring s=null;下面哪个代码片段可能会抛出NullPointerException?

if((s!=null)&(s.length()>0))

if((s!=null)&&(s.length()>0))

if((s==null)|(s.length()==0))

if((s==null)||(s.length()==0))

s为null,因此只要调用了s.length()都会抛出空指针异常。因此这个题目就是考察if语句的后半部分会不会执行。

A,单个与操作的符号& 用在整数上是按位与,用在布尔型变量上跟&&功能类似,但是区别是无论前面是否为真,后面必定执行,因此抛出异常

B,与操作,前半部分判断为假,后面不再执行

C,这里跟 & 和&& 的区别类似,后面必定执行,因此抛出异常

D,或语句,前面为真,整个结果必定为真,后面不执行

AC

11、关于OutOfMemoryError,下面说法正确的是()?

java.lang.OutOfMemoryError: PermGen space 增加-XX:MaxPermSize这个参数的值的话,这个问题通常会得到解决。

java.lang.OutOfMemoryError: Requested array size exceeds VM limit当你正准备创建一个超过虚拟机允许的大小的数组时,这条错误将会出现

java.lang.OutOfMemoryError: Java heap space 一般情况下解决这个问题最快的方法就是通过-Xmx参数来增加堆的大小

java.lang.OutOfMemoryError: nativeGetNewTLA这个异常只有在jRockit虚拟机时才会碰到

关于此题,《深入理解java虚拟机》有关于OOM(OutOfMemory)问题的解释

A:属于运行时常量池导致的溢出,设置-XX:MaxPermSize可以解决这个问题,

B:属于堆空间不足导致的错误,问题比较少见,解决方式和C相同,

C:属于java堆内存问题,一般的手段是通过内存映像分析工具,对Dump出来的堆转储存快照进行分析,重点是确认内存中的对象是否是有必要的,也就是要判断是出现了内存泄漏,还是出现了内存溢出,如果是内存列楼,通过工具检查泄露对象打GC Roots的引用链信息,可以准确的确定出泄露代码的位置,不存在泄露,就应该检查虚拟机的堆参数,如果可以继续调大,可以设置-Xmx解决问题

D:java.lang.OutOfMemoryError: nativeGetNewTLA指当虚拟机不能分配新的线程本地空间(Thread Local Area)的时候错误信息,此错误是线程申请一个新的TLA时产生的,这个异常一般只会发生在jRockit虚拟机,只有过于绝对。

ABC

12、针对以下代码,哪些选项执行后是true的:()

class CompareReference{

public static void main(String [] args){

float f=42.0f;

float f1[]=new float[2];

float f2[]=new float[2];

float[] f3=f1;

long x=42;

f1[0]=42.0f;

}

}

f1==f2

x==f1[0]

f1==f3

f2==f1[1]

如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型。否则,如果其中一个操作数是float类型,另一个将会转换为float类型。否则,如果其中一个操作数是long类型,另一个会转换为long类型。否则,两个操作数都转换为int类型。故,x==f1[0]中,x将会转换为float类型。基本类型之间的比较,应该会将低精度类型自动转为高精度类型再比较。

byte ,  short ,  int ,  long ,  fload ,  double

作比较的时候会自动向上转型, 向下转型的时候则需要强转

BC

13、关于equals和hashCode描述正确的是    ()

两个obj,如果equals()相等,hashCode()一定相等(符合代码规范的情况下)

两个obj,如果hashCode()相等,equals()不一定相等

两个不同的obj, hashCode()可能相等

其他都不对

“==”:作用是判断两个对象的地址是否相等,即,判断两个对象是不是同一个对象,如果是基本数据类型,则比较的是值是否相等。

“equal”:作用是判断两个对象是否相等,但一般有两种使用情况

1.类没有覆盖equals()方法,则相当于通过“==”比较

2.类覆盖equals()方法,一般,我们都通过equals()方法来比较两个对象的内容是否相等,相等则返回true,如String

hashCode()的存在是为了查找的快捷性,用于在散列存储结构中确定对象的存储地址

如果两个对象 equals相等,则 hashCode()也一定相等

如果 equals方法被重写,则 hashCode()也应该被重写

如果两个对象的 hashCode()相等, equals()方法不一定相等

equals方法没有重写,比较的就是应用类型的变量所指向的对象的地址

ABC

14、下面关于面向对象的一些理解哪些是错误的(    )

面向对象的最重要的特性是支持继承、封装和多态

系统设计应该遵循开闭原则,系统应该稳定不不可修改,但应支持通过继承、组合等方式进行扩展

函数式的语言必然是面向对象的语言

面向对象设计时,每个类的职责应该单一,不要再一个类中引入过多的接口

过程式语言和面向对象的语言各有其优势,过程式语言更加灵活,面向对象语言更加强调抽象和封装

Java和C++都是静态类型的面向对象编程语言

典型的函数式语言haskell

C

15、下面正确的2项是?

public class NameList

{

private List names = new ArrayList();

public synchronized void add(String name)

{

names.add(name);

}

public synchronized void printAll() {

for (int i = 0; i < names.size(); i++)

{

System.out.print(names.get(i) + “”);

}

}

public static void main(String[]args)

{

final NameList sl = new NameList();

for (int i = 0; i < 2; i++)

{

new Thread()

{

public void run()

{

sl.add(“A”);

sl.add(“B”);

sl.add(“C”);

sl.printAll();

}

} .start();

}

}

}

运行的时候可能抛异常

运行的时候可能没有输出,也没有正常退出

代码运行的时候可能没有输出,但是正常退出

代码输出"A B A B C C "

代码输出"A B C A B C A B C "

代码输出"A A A B C A B C C "

代码输出"A B C A A B C A B C "

在每个线程中都是顺序执行的,所以sl.printAll();必须在前三句执行之后执行,也就是输出的内容必有(连续或非连续的)ABC。

而线程之间是穿插执行的,所以一个线程执行 sl.printAll();之前可能有另一个线程执行了前三句的前几句。

E答案相当于线程1顺序执行完然后线程2顺序执行完。

G答案则是线程1执行完前三句add之后线程2插一脚执行了一句add然后线程1再执行 sl.printAll();输出ABCA。接着线程2顺序执行完输出ABCABC

输出加起来即为ABCAABCABC。

EG

16、有关线程的叙述正确的是()

可以获得对任何对象的互斥锁定

通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定

线程通过使用synchronized关键字可获得对象的互斥锁定

线程调度算法是平台独立的

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

可以获得对任何对象的互斥锁定

通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定

线程通过使用synchronized关键字可获得对象的互斥锁定

线程调度算法是平台独立的

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-4De5Np4D-1715734354122)]

[外链图片转存中…(img-djEWMOka-1715734354123)]

[外链图片转存中…(img-cSbsuSTS-1715734354123)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值