java面试每日十题(三)

本文深入探讨Java中的关键概念,包括JVM加载class文件的机制、内存泄漏的原因、抽象类与接口的区别、静态嵌套类与内部类的不同、对象克隆的方法、字符串对象的创建过程等。通过详细的解释和示例,帮助读者理解Java编程的基础和高级特性。

21、描述一下JVM加载class文件的原理机制?

答:在java中,类加载器把一个类装入jvm中,要经过三个步骤:装载、连接和初始化,其中连接又可以分为检查、准备 、解析。

装载:查找和导入类或接口的二进制数据,即class文件;

连接:执行下面的三个步骤,其中解析是可以选择的;

检查:检查装载进来的class文件是否正确;

准备:为类的静态变量分配存储空间;

解析:将符号引用转换成直接引用;

初始化:初始化静态变量和静态代码块。

 

 

22、char 型变量中能不能存贮一个中文汉字,为什么?

答:可以。Java中是使用Unicode编码的,而Unicode编码字符集里面包含有汉字,所以char型变量可以存储一个中文汉字(char型变量占用两个字节,一个汉字也是)。不过,如果某个特殊汉字没有被包含在Unicode编码字符集中,那就不能存储这个特殊汉字了。

 


23、抽象类(abstract class)和接口(interface)有什么异同?

答:抽象类就是包含抽象方法的类,没有足够的信息来描绘一个具体的对象,抽象类是不能够被实例化的,只能通过子类进行实例化,含有抽象方法的类一定是抽象类,但抽象类不一定含有抽象方法;接口是一种特殊的抽象类,是抽象方法的集合,方法不包含方法体,接口中所有方法都是抽象的,接口也不可以被实例化。抽象类可以继承一个类或实现多个接口,子类只可以继承一个抽象类;接口只可以继承一个或多个接口,子类可以实现多个接口。抽象方法可以有public、protected、default这些访问修饰符,而接口方法只能是public。

 


24、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?

答:嵌套类是静态类的内部类,可以分为静态嵌套类和非静态嵌套类(即内部类)。静态嵌套类不可以直接调用它的外部类,但是可以通过外部类的引用来调用;内部类可以自由的也能用外部类的属性和方法,但是由于它与一个实例绑定在了一起,所以内部类不可以定义静态的属性、方法。

内部类对象的实例化:

 

静态嵌套类对象的实例化:

 

 


25、Java 中会存在内存泄漏吗,请简单描述。

答:存在。如果长生命周期对象持有短生命周期对象的引用,就很可能会出现内存泄漏。静态集合类如hashmap、vector等生命周期和应用程序一致,他们引用的对象Object也不能被释放;监听器的使用,在释放对象的时候忘记删除监听器;各种提供了close()方法的对象如数据库连接、网络连接和io连接,他们没有调用close()方法是不会被gc回收的;不正确使用单例模式,单例对象在被初始化后将会以静态变量的方式在JVM整个生命周期中存在,如果他持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,从而导致内存泄漏。

 

 

26、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?

答:都不能。Abstract是用来声明抽象方法的,抽象方法没有方法体,不能被直接调用,必须在子类重写后才可以使用。Static用来声明静态方法,静态方法无法被重写的,二者相矛盾;native是用来声明本地方法,由非java语言实现的,这与抽象方法没有方法体不能实现相矛盾;synchronized用于防止多个线程同时调用同一个对象,和方法的实现细节有关,即可以直接调用,而抽象方法是不涉及实现细节的,二者矛盾。

 


27、阐述静态变量和实例变量的区别。

答:静态变量需要用static关键字来修饰,从属于类,也叫类变量,只要程序加载了类的字节码就会被分配空间可以使用了,存储在静态存储区,类变量是所有对象共有的,可以通过类名来调用;实例变量是某个对象的属性,必须先实例化才会被分配空间,存储在堆中,属于对象私有,即一个对象改变其值不影响其他对象。

 

 


28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

答:不可以。因为非静态方法是要和对象关联在一起的,必须创建一个对象后才可以调用,而静态方法不需要创建对象就可以直接调用。即当静态方法被调用时可能还没有创建对象,如果从静态方法内部发出对非静态方法的调用,那非静态方法就关联不到对象,所以不可以。

 


29、如何实现对象克隆?

答:方法:实现cloneable接口并重写Object类中的clone()方法;

步骤:(1)实现cloneable接口

  1. 重载clone()方法,重载时要定义为public
  2. 在重载方法中调用super.clone()方法。

方法:实现serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

 


30、String s = new String("xyz");创建了几个字符串对象?

答:这个要先看前面的语句有没有创建String对象"xyz",即是先在JVM的字符串池中找,如果找到就不再创建对象,如果没找到就创建一个值为“xyz”的String对象;然后new运算符在堆内存上(与字符串池不同)创建另一个String对象"xyz",并将其返回给s。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值