Java基础面试题学习记录(一)

Java面试题学习记录2020/4/17~

1,面向对象的特征有哪些?
2,访问修饰符 public,private,protected,以及不写(默认)时的区 别?
3,String 是最基本的数据类型吗?
4,float f=3.4;是否正确?
5,short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;
有错吗?
6、Java 有没有 goto?
7、int 和 Integer 有什么区别?
8、&和&&的区别?
9、解释内存中的栈(stack)、堆(heap)和方法区(method area)
的用法。
10、Math.round(11.5) 等于多少?Math.round(-11.5)等于
多少?
11、switch 是否能作用在 byte 上,是否能作用在 long 上,
是否能作用在 String 上?
12、用最有效率的方法计算 2 乘以 8?
13、数组有没有 length()方法?String 有没有 length()方法?
14、在 Java 中,如何跳出当前的多重嵌套循环?
15、构造器(constructor)是否可被重写(override)?
16、两个对象值相同(x.equals(y) == true),但却可有不同的
hash code,这句话对不对?
17、是否可以继承 String 类?
18、当一个对象被当作参数传递到一个方法后,此方法可改变
这个对象的属性,并可返回变化后的结果,那么这里到底是值传
递还是引用传递?
19、String 和 StringBuilder、StringBuffer 的区别?
20、重载(Overload)和重写(Override)的区别。重载的
方法能否根据返回类型进行区分?
21、描述一下 JVM 加载 class 文件的原理机制?
22、char 型变量中能不能存贮一个中文汉字,为什么?
23、抽象类(abstract class)和接口(interface)有什么异
同?
24,静态嵌套类(Static Nested Class)和内部类(Inner Class)
的不同?
25、Java 中会存在内存泄漏吗,请简单描述。
26、抽象的(abstract)方法是否可同时是静态的(static),
是否可同时是本地方法(native),是否可同时被 synchronized
修饰?
27、阐述静态变量和实例变量的区别。
28、是否可以从一个静态(static)方法内部发出对非静态
(non-static)方法的调用?
29、如何实现对象克隆?
30、GC 是什么?为什么要有 GC?
31、String s = new String(“xyz”);创建了几个字符串对象?
32、接口是否可继承(extends)接口?抽象类是否可实现
(implements)接口?抽象类是否可继承具体类(concrete
class)?
33、一个”.java”源文件中是否可以包含多个类(不是内部类)?
有什么限制?
34、Anonymous Inner Class(匿名内部类)是否可以继承其它
类?是否可以实现接口?
35、内部类可以引用它的包含类(外部类)的成员吗?有没有
什么限制?

1,面向对象的特征有哪些?
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两个方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类,基类),得到继承信息的类被称为子类(派生类)。
封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。封装就是隐藏一切可以隐藏的东西,指向外界提供最简单的编程接口。
多态:多态就是允许不同子类型的对象对统一消息做出不同的反应。简单的说就是用同样的对象引用调用相同的方法,但是做了不同的事情。

2,访问修饰符 public,private,protected,以及不写(默认)时的区 别?

修饰符当前类同包子包其他包
public
protected×
default××
private×××

类的成员不写修饰符时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护的类(protected)对子类相当于公开,对不是同一个包中的没有父子关系的类相当于私有(private)。Java中,外部类的修饰符只能是public和默认,类的成员的修饰符可以是以上四种。

3,String 是最基本的数据类型吗?
不是,基本数据类型:
整型:byte(1字节), short(2字节), int(4字节), long(8字节)
字符型:char(2字节)
浮点型:float(4字节),double(8字节)
布尔型:boolean(1字节)

4,float f=3.4;是否正确?
不正确,3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型(down-casting ,窄化)会造成精度损失,因此需要强制类型转换 float f = (float) 3.4;或者写成float f = 3.4F

5,short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;
有错吗?

对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达zd式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需内要强制转换类型的错误。
对于short s1 = 1; s1 += 1; += 是复合赋值操作符,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。

6、Java 有没有 goto?
,goto是java语言中的保留字,在目前版本的 Java 中没有使用。

7、int 和 Integer 有什么区别?
(1)Integer是int的包装类,int则是java的一种基本数据类型
(2)Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 。
(3)Integer的默认值是null,int的默认值是0

8、&和&&的区别?
&运算符有两种用法:(1)按位与;(2)逻辑与。
&&运算符是短路与运算。
逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。
&&之所以称为短路运算是因为,如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。
注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

9、解释内存中的栈(stack)、堆(heap)和方法区(method area)
的用法。

通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用 JVM 中的栈空间;而通过 new 关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,再具体一点可以分为 Eden、Survivor(又可分为 From Survivor 和 To Survivor)、Tenured;方法区和堆都是各个线程共享的内存区域,用于存储已经被 JVM 加载的类信息、常量、静态变量、JIT 编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的 100、”hello”和常量都是放在常量池中,常量池是方法区的一部分,。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都可以通过 JVM的启动参数来进行调整,栈空间用光了会引发 StackOverflowError,而堆和常量
池空间不足则会引发 OutOfMemoryError。

10、Math.round(11.5) 等于多少?Math.round(-11.5)等于
多少?

Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五
入的原理是在参数上加 0.5 然后进行下取整。

11、switch 是否能作用在 byte 上,是否能作用在 long 上,
是否能作用在 String 上?

在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。
从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,
从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

12、用最有效率的方法计算 2 乘以 8?
2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)。

13、数组有没有 length()方法?String 有没有 length()方法?
数组没有length()方法,有 length 的属性。
String有length()方法。

14、在 Java 中,如何跳出当前的多重嵌套循环?
在最外层循环前加一个标记如 A,然后用 break A;可以跳出多重循环。

15、构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载。

16、两个对象值相同(x.equals(y) == true),但却可有不同的
hash code,这句话对不对?

不对,如果两个对象 x 和 y 满足 x.equals(y) == true,它们的哈希码(hash code)应当相同。
Java 对于 eqauls 方法和 hashCode 方法是这样规定的:(1)如果两个对象相同(equals 方法返回 true),那么它们的 hashCode 值一定要相同;(2)如果两个对象的 hashCode 相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在 Set 集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)

17、是否可以继承 String 类?
String 类是 final 类,不可以被继承。

18、当一个对象被当作参数传递到一个方法后,此方法可改变
这个对象的属性,并可返回变化后的结果,那么这里到底是值传
递还是引用传递?

是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

19、String 和 StringBuilder、StringBuffer 的区别?
Java 平台提供了两种类型的字符串:String 和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中 String 是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的。而 StringBuffer/StringBuilder 类表示的字符串对象可以直接进行修改。StringBuilder 是 Java 5 中引入的,它和 StringBuffer 的方
法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized 修饰,因此它的效率也比 StringBuffer 要高。

20、重载(Overload)和重写(Override)的区别。重载的
方法能否根据返回类型进行区分?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返
回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。
重载的方法不能根据返回类型来区分。

21、描述一下 JVM 加载 class 文件的原理机制?
JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。
由于 Java 的跨平台性,经过编译的 Java 源程序并不是一个可执行程序,而是一个或多个类文件。当 Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class 文件中的数据读入到内存中,通常是创建一个字节数组读入.class 文件,然后产生与所加载类对应的 Class 对象。加载完成后,Class 对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。
最后 JVM 对类进行初始化,包括:
(1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;
(2)如果类中存在初始化语句,就依次执行这些初始化语句。
类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader 的子类)。
从 Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM 更好的保证了 Java 平台的安全性,在该机制
中,JVM 自带的 Bootstrap 是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM 不会向 Java 程序提供对 Bootstrap 的引用。
下面是关于几个类加载器的说明:
Bootstrap:一般用本地代码实现,负责加载 JVM 基础核心类库(rt.jar);
Extension:从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap;
System:又叫应用类加载器,其父类是 Extension。它是应用最广泛的类加载器。它从环境变量 classpath 或者系统属性 java.class.path 所指定的目录中记载类,是用户自定义加载器的默认父加载器。

22、char 型变量中能不能存贮一个中文汉字,为什么?
char 类型可以存储一个中文汉字,因为 Java 中使用的编码是 Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法) unicode编码字符集中包含了汉字,所以,char型变量中可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。

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

不同:
(1),抽象类中可以定义构造器,可以有抽象方法和具体方法
接口中不能定义构造器,方法全部都是抽象方法(接口中方法默认的是public abstract修饰的)
(3),抽象类中的成员可以是 private、默认、protected、public
接口中的成员全都是 public 的
(4),抽象类中可以定义成员变量
接口中定义的成员变量实际上都是常量(接口中的成员变量默认 是public static final 修饰的 )
(7),一个类只能继承一个抽象类
一个类可以实现多个接口
相同:
1.不能够实例化
2.可以将抽象类和接口类型作为引用类型
3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。

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

Static Nested Class 是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。
而通常的内部类需要在外部类实例化后才能实例化。

25、Java 中会存在内存泄漏吗,请简单描述。
理论上 Java 因为有垃圾回收机制( GC)不会存在内存泄露问题(这也是 Java 被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被 GC 回收 ,因此也会导致内存泄露的发生 。例 如Hibernate 的 Session( 一级缓存 )中的对象属于持久态,垃圾回收器是不会回收
这些对象的,然而这些对象中可能存在无用的垃圾对象 ,如果不及时关闭(close)或清空( flush)一级缓存就可能导致内存泄露。

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

都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如 C 代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized 和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

27、阐述静态变量和实例变量的区别。
静态变量是被 static 修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。

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

不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。

29、如何实现对象克隆?
(1),实现 Cloneable 接口并重写 Object 类中的 clone()方法;
(2),实现 Serializable 接口,通过对象的序列化和反序列化实现克隆。

30、GC 是什么?为什么要有 GC?
GC 是垃圾收集的意思 ,内存处理是编程人员容易出现问题的地方 ,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃, Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。

31、String s = new String(“xyz”);创建了几个字符串对象?
两个对象,一个是静态区的 ” xyz” ,一个是用 new 创建在堆上的对象。

32、接口是否可继承(extends)接口?抽象类是否可实现
(implements)接口?抽象类是否可继承具体类(concrete
class)?

接口可以继承接口,而且支持多重继承。抽象类可以实现 (implements)接口,抽象类可继承具体类也可以继承抽象类。

33、一个”.java”源文件中是否可以包含多个类(不是内部类)?
有什么限制?

可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。

34、Anonymous Inner Class(匿名内部类)是否可以继承其它
类?是否可以实现接口?

可以继承其他类或实现其他接口,在 Swing 编程和 Android 开发中常用此方式来实现事件监听和回调。

35、内部类可以引用它的包含类(外部类)的成员吗?有没有
什么限制?

一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值