java基础篇四学习记录

本文深入探讨Java中的字符串操作、异常处理、内存管理等核心概念。解析String与StringBuffer的区别、异常处理机制,并详解堆栈的不同用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java基础篇四学习记录


1.String s = new String(“xyz”);创建了几个StringObject?是否可以继承String类?

两个或一个都有可能, “xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量“xyz”不管出现多少遍,都是缓冲区中的那一个。newString每写一遍,就创建一个新的的对象,它使用常量"xyz"对象的内容来创建出一个新的String对象。如果以前就用过“xyz”,那么这里就不会创建“xyz”了,直接从缓冲区拿,这时创建了一个StringObject;但如果从前没有用过“xyz”,那么此时就会创建一个对象并放入缓冲区,这种情况它就创建了两个对象,至于String类是否继承,答案是否定的,因为String默认是final修饰,是不可继承的。


2.String与StringBuffer的区别?

java平台提供了两个类:String与StringBuffer, 它们可以存储和操作字符串,即包含多个字符的字符数据。这个String类提供了数组不可改变的字符串。而这个StringBuffer类提供的字符串可以进行修改,当你知道字符数据要改变的时候你就可以使用StringBuffer。典型的应用:使用StringBuffer来动态的构造字符数据。


3.下面这条语句一共创建了多少个对象: String s = "a"+"b"+"c"+"d"?

对于如下代码:

String s1 = "a";

String s2 = s1 + "b";

String s3 = "a" + "b";

System.out.println(s2 == "ab");

System.out.println(s3 == "ab");

第一条语句打印的结果为false,第二条语句打印的结果为true, 这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期在去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。

题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个"abcd"的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,

String s = "a" + "b" + "c" + "d";

System.out.println(s == "abcd");

打印的结果为true;


4.try{}里面有一个return语句,那么紧跟着在这个try后的finally{}里的code会不会被执行,什么时候被执行?

个人觉得,如果知道finally会执行就可以得出是,先执行finally再执行return的。因为,如果先执行return,那么整个函数都跳出了,那么还怎么执行finally?

另外,在java的语言规范有讲到,如果在try语句里有return语句,finally语句还是会执行。它会在把控制权转移到该方法的调用者或者构造器前执行finally语句。也就是说,使用return语句把控制权转移给其他的方法前会执行finally语句。

其实这里还有一点要注意的是,如果你在finally里也用了return语句,比如return +xx。那么y会是3。因为规范规定了,当try和finally里都有return时,会忽略try的return,而使用finally的return。


5.final,finally,finalize的区别?

final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。

finally是异常处理语句结构的一部分,表示总被执行。

finalize是Object类的一个方法,在垃圾回收集齐器执行的时候会调用被回收对象的次方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。但是jvm不保证此方法总被调用。


6.运行时异常与一般的异常有何不同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见的运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。



7.error和exception有什么区别?

error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序员能处理这样的情况。exception表示一种设计或实现上的问题。也就是说,它表示如果成行运行正常,从不会发生的情况。


8.简述java中的异常处理机制的简单原理及应用?

异常是指java程序运行时(非编译)所发生的非正常或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间,地点,人物,情节等信息。可以用一个对象来表示,java使用面向对象的方式来处理异常,它把程序中发生的每一种异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。

java对异常进行了分类,不同类型的异常分别用不同的java类来表示,所有异常的根类为java.lang.Throwable, Throwable下面又派生类两个子类:

Error和Exception,Error表示应用程序本身无法克服和恢复的一种严重问题,程序只有崩溃了,例如,说内存溢出和线程死锁等系统问题。

Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常。

系统异常时软件本身的缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件挂掉,例如,数组越界(ArrayIndexOutBoundsException),空指针异常(NullPointerException),类转换异常(ClassCastException)

普通异常时运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。

java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try...catch处理或用throws声明继续抛出给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可不处理,所以,编译器不强制用try..catch处理或用throws声明,所以系统异常也称为unchecked异常。


9.java中堆与栈有什么区别?

jvm中堆与栈属于不同的内存区域,使用的目的也不同,栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个jvm的所有的线程共享。

栈,在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另做为它用。

堆:堆内存用来存放由new创建的对象和数组,在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理。在堆中产生一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。

 


10.能将int强制转换为byte类型的变量吗?如果该值大于byte类型的范围,将会出现什么情况?

我们可以做强制转换,但是java中int是32位的,而byte是8位的,所以,如果强制转换,int类型的高24位将会被抛弃掉,因为byte类型的范围是从-128~127.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值