java面试题基础篇

static特点

随着类的加载而加载;优先于对象存在;被所有对象所共享;可以直接被类名调用。
静态方法只能访问静态成员,非静态方法既可以访问静态也可以访问非静态。
静态方法中不可以定义this super关键字,因为静态优先于对象存在,所以静态方法中不可以出现this。

多态

多态可以理解为事物存在的多种体现形式,父类的引用指向了自己的子类对象;父类的引用也可以接收自己子类的对象
好处:提高了代码的扩展性。
弊端:父类的引用只能访问父类中有的成员(父类引用无法调用子类中特有的方法)。

数组和集合的区别

数组可以存储基本数据类型和对象,它是一个线性队列,可以快速访问其中的元素,数组创建之后,长度固定,不可改变。

容器只用于存储对象,集合的长度是可变的,集合可以存储不同类型的对象,集合的长度并不是固定的,可以便捷的添加删除,功能更加强大。

Java垃圾回收机制

Java程序内存主要分两部分,堆和非堆。一般new的对象和数组都是在堆中的,而GC主要回收的内存也是这块堆内存。

堆内存模型

堆内存由垃圾回收器的自动内存管理系统回收。

堆内存分为两大部分:新生代和老年代。比例为1:2。

老年代主要存放应用程序中生命周期长的存活对象。

新生代又分为三个部分:一个Eden区和两个Survivor区,比例为8:1:1。

Eden区存放新生的对象。

可回收对象的判定

1. 引用计数算法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。

优点是简单,高效

缺点是很难处理循环引用,比如相互引用的两个对象则无法释放。

2. 可达性分析算法(根搜索算法)

为了解决上面的循环引用问题,Java采用了一种新的算法:可达性分析算法。

从GC Roots(每种具体实现对GC Roots有不同的定义)作为起点,向下搜索它们引用的对象,可以生成一棵引用树,树的节点视为可达对象,反之视为不可达。

什么是事务?事务有那些特点?

事务:

单个逻辑单元执行的一系列操作,要么全部执行,要么全部不执行。

特点:

原子性(Atomicity):事务中各元素不可分割,全部执行成功或者撤销所有的操作

一致性(Consistency):事务完成后数据保持一致的状态

隔离性(Isolation):事务是相对独立的,对某数据进行修改时,其他事务不变

持久性(Durability):事务完成后对系统的影响是永久性的。

事务的使用场景在什么地方?

当一个业务逻辑包括多个数据库操作的时候,而且需要保证每个数据表操作都执行的成功进行下一个操作,这个时候可以使用事务

Overload 和 Override 的区别。

Overload 是重载的意思,Override 是覆盖的意思,也就是重写。

重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写 Override 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是 private 类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

面向对象的特征有哪些?

​ 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象.抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

​ 继承:继承是从已有类得到继承信息创建新类的过程.提供继承信息的类叫父类(超类,基类),得到信息的类叫子类(派生类)。

​ 封装:通常认为封装是把数据和操作数据的方法绑定在一起,对数据的访问只能通过已经定义的接口.面向对象的本质就是将现实世界描绘成一系列完全自治封闭的对象.我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装.可以说,封装就是隐藏一切可以隐藏的东西,只向外界提供最简单的编程接口。

​ 多态性:多态性是指孕育不同子类型的对象对同一消息作出不同的响应.简单来说就是用同样的对象向外界调用同样的方法但是做了不同的事情.多态分为编译时多态和运行时多态.如果将对象的方法视为对象向外界提供的服务,那么运行时多态可以理解为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的.方法重载(overload)实现的是编译时的多态,而方法重写(override)实现的是运行时的多态.运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1)方法重写(子类继承父类并重写父类中已有的或抽象的方法),2)对象造型(用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)

abstract class 和 interface 有什么区别?

含有 abstract 修饰符的 class 即为抽象类,abstract 类不能创建的实例对象。含有 abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为 abstract类型。

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。

下面比较一下两者的语法区别:

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量。

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是 public,protected 和(默认类型,虽然eclipse 下不报错,但应该也不行),但接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法。
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是 public static final 类型,并且默认即为 public static final 类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。

面向对象

面向对象是基于面向过程的,在开发过程中,要完成特定的功能就去找对应的对象,如果找不到就创建相应的对象,使用对象,维护完善对象。

面向过程是一件事"该怎么做",面向对象是一件事"该让谁来做",把一个对象抽象成类,具体上就是把一个对象的静态特征和动态特征抽象成属性和方法,也就是把一类事物的算法和数据结构封装在一个类之中,程序也就是多个对象和互相之间的通信组成的。

面向对象具有封装性,继承性,多态性,封装隐藏了对象内部不需要暴露的细节,使得内部细节的变动跟外界脱离,只依靠接口进行通信,封装性降低了编程的复杂性,通过继承,使得新建一个类变得容易,一个类从派生类那里获得其非私有的方法和公有属性。

总之,面向对象的特性提高了大型程序的重用性和可维护性

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

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

Error和Exception有什么区别?

Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但是很困难的情况下的一种严重问题,比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,他表示如果程序正常运行,从不会发生的情况.

断言(assert)

断言是在软件开发中的一种调试方法,在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true,如果为false,说明程序已经处以不正确的状态,assert将给出警告或退出.assertion检查通常在开发和测试中开启,为了提高性能,在软件发布后,assertion检查通常是关闭的.

String和StringBuilder StringBuffer的区别?

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

怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?

String s1 = “你好”;

String s2 = new String (s1.getBytes(“GB2312”),”ISO-8859-1”);

JVM的内存区域划分

1.程序计数器

指CPU中的寄存器,它保存的是程序当前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令。

2.Java栈

存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中。

3.堆(heap)

存放所有new出来的对象。

4.本地方法栈

本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。

5.方法区

方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

猜你喜欢

转载自blog.csdn.net/qq_42306104/article/details/85680687
今日推荐