Java基础知识及面试题.docx

上传人:b****4 文档编号:4590934 上传时间:2022-12-07 格式:DOCX 页数:26 大小:348.52KB
下载 相关 举报
Java基础知识及面试题.docx_第1页
第1页 / 共26页
Java基础知识及面试题.docx_第2页
第2页 / 共26页
Java基础知识及面试题.docx_第3页
第3页 / 共26页
Java基础知识及面试题.docx_第4页
第4页 / 共26页
Java基础知识及面试题.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

Java基础知识及面试题.docx

《Java基础知识及面试题.docx》由会员分享,可在线阅读,更多相关《Java基础知识及面试题.docx(26页珍藏版)》请在冰豆网上搜索。

Java基础知识及面试题.docx

Java基础知识及面试题

Java基础

1.什么是类?

类是某一种事物的一般性的集合体,是相同的或相似的各个事物共同特性的一种抽象。

2.什么是对象?

在面向对象概念中,对象是类的实例。

对象与类的关系就像变量与数据类型的关系一样。

3.类的核心特性

封装性:

类的封装性为类的成员提供公有的、缺省的、保护的、私有的等多级访问权限。

目的是隐藏类中的私有变量和类中方法的实现细节。

继承性:

类的继承性提供从已存在的类创建新类的机制,继承使一个新类自动拥有被继承类的全部可继承的成员。

多态性:

类的多态性提供类中方法执行的多样性,有两种表现形式:

重载和覆盖。

4.方法:

对象中方法表达了对象所具有的行为。

5.属性:

一个对象的属性是能够被外界或对象所处的环境所感知或操纵的数据或状态。

6.什么是Java?

Java是一门易于编程的跨平台编程语言,同时又是一个开发、应用、执行和部署的平台。

7.为什么要有Java?

Java与平台无关、一次编译处处运行、以及他的易于编程的特性。

8.Java开发程序的步骤?

编写源代码

(2)编译(3)执行

9.Java的环境变量

1)JAVA–HOMEjdk的安装路径

2)CLASSPATHjvm转载class字节码文件时的搜索路径

3)PATH是系统的环境变量、命令的搜索路径

10.JVM:

JavaVirtualMachine是一个逻辑的操作系统、它屏蔽了硬件和平台的信息、jvm能将字节码文件解释并执行、正是这种独立执行的方式是Java具有与平台无关的特性。

11.类的加载过程:

类加载器加载字节码文件到内存、jvm内存数据区将对象状态放置在堆区、各线程使用的变量放在栈区、类的特征放在方法区、然后进行字节码验证再执行。

12.常用的Java命令:

Javac、java、javadoc、jar

13.类的语法与规范

一个源文件只能有一个public的类

Public源文件可以有多个类定义

源文件名必须与public类名保持一致

包名必须放在第一行

包名可以有0个或1个但不能有多个

源文件如果带包的话最好存放在包结构对应的目录下

标识符程序语言用于标识变量名类名方法名的字符串就是标识符。

标识符必须字母下划线美元符开头大小写敏感。

类名要求首字母大写

方法名首字母小写每个单词首字母大写

常量名所有字母大写如果有两个或几个字母的联合用下划线连接

关键字:

程序语言中、程序已经所有用户不能再使用的单词一般关键字都是小写

14.数据类型:

基本数据类型:

整型(byte、short、int、long)默认是int

浮点型(float、double)、默认是double

布尔型(boolean)、

字符型(char)

引用类型:

类、接口、数组

15.main()方法执行过程

1)先到方法区搜索student、如果搜索不到则去加载student的字节码文件

2)通过classpath查找对应的student字节码文件找不到就返回错误(ClassNotFound)

3)将字节码文件的二进制数据转换为class对象放置于方法区(class对象描述了student类的方法特征及静态成员等)加载完成

4)验证字节码文件

5)在堆区中划分空间放置student对象

6)在栈区放置应用类型变量stu、stu指向student对象的地址

7)student对象存放了class对象的地址

8)通过studentstu引用类型变量的值找到student对象、通过student对象

存放class对象的地址找到对应的study()方法然后执行。

9)释放资源jvm运行结束

16.基本类型和引用类型的区别

引用类型存放的是对象的地址、基本类型存放的是变量的实际值

引用类型变量可用指向复杂的数据结构

引用类型变量可使用“.”操作来访问它所指向的方法或属性

17.表达式

运算符和操作数按照一定的规则组成的语句.

赋值运算符“=”

比较运算符“<”“>”“<=”“>=”

相等运算符“==”

位运算符~:

取反、^:

异或、|:

或、&:

逻辑运算符“&&”“||”

条件运算符a?

b:

c

18.变量的作用域

(1)类的成员变量:

静态成员变量:

生命周期从类加载开始到类被卸载结束初始化后被放在方法区

实例成员变量:

变量初始化放在堆区、生命周期从生成对象开始到对象被回收时结束

(2)局部变量:

方法或代码块中定义的变量、局部变量从栈区弹出结束、局部变量在使用前必须初始化

(3)方法的参数

(4)异常的参数

19.数组:

是相同类型元素的线性集合是一个指向数组的引用对象

20.集合框架

Iterator是一个迭代器接口

ListIterator继承自Iterator是子接口只能用于list接口

Collection是集合框架的顶层接口

List有序可重复

ArrayList实现了可变数组的数据结构

LinkedList实现了双向链表的数据结构

Set无序不可重复

HashSet实现了无序不可重复

LinkedHashSet有序不可重复(插入的顺序)

TreeSet升序不可重复

Map是一个key、value对映射

HashMap按照key无序

LinkedHashMap按照key有序

TreeMap按照key升序

Collections是集合框架的辅助类(工具类)里边的所有方法都是static的

Arrays是对数组的工具类

Comparable、Comparator是做比较排序的

21.Vector和ArrayList的区别:

1)Vector是线程安全的(同步的)ArrayList不是ArrayList的效率高一些

2)当初始容量满的时候Vector增加原来的一倍、ArrayList增加原来的一半

22.HashTable和HashMap的区别:

1)HashTable是线程安全HashMap不是HashMap的效率会高一些

2)HashMap允许null的key存在HashTable不允许

23.Setset=Map.keySet();

Iteratorit=set.iterator();

While(it.hasnext()){

}

24.类的结构

类名、属性名(静态属性、实例属性)、方法(静态方法、实例方法)、构造器(缺省构造器、带参构造器)

静态代码块static、实例代码块this.

25.参数传递

对于基本类型将实际的变量的值原样的赋值以便传值

对于引用类型将引用类型变量的地址赋值给实参

26.this关键字都在什么地方使用

1)实例变量与局部变量同名用this区分实例变量名与局部变量名

2)在构造器重载时、用this调用其它构造器

3)在实例方法中用来当作当前对象的引用传给其它方法

27.方法的重载

方法名要相同、在同一类中多个方法有不同的方法签名方法签名具有参数类型参数个数和参数顺序、返回类型不做要求

28.类的初始化过程

1)在堆区分配空间new的过程

2)给对象属性赋默认值

3)调用构造方法进一步赋值

29.构造器

类中提供的用于初始化对象的特殊的方法、这个方法于类同名无返回值、类中没有提供构造器jvm会提供一个不带参的缺省构造器、类中有带参的构造器jvm就不提供了

30.详细说明封装、继承、和多态

封装:

将类的实现细节隐藏起来、对外提供一致的接口、提高系统的维护性

继承:

定义:

一个类自动获得另一个类的属性或者方法的过程

使用方面:

extends关键字、单根继承、所有类都是Object类的子类、构造器不能被继承、子类初始化时会默认情况下调用父类缺省的构造器、子类调用父类带参的构造器则父类可以不提供缺省的构造器否则一定要有个缺省的构造器

如何使用继承?

1)区分has-a和is-a

2)子类要扩充父类的功能

3)子类需要大量置换父类的功能时不能使用继承

4)不要从工具类中继承

优缺点:

优点:

继承是最容易复用代码的形式、修改父类的功能时子类可以自动获得新的功能

缺点:

打破了封装、只是类型复用

多态:

编译时编译器检查声明类型和方法信息

运行时jvm对实例方法和引用变量和实际引用对象动态绑定,对静态方法和引用变量声明的类型静态绑定

类的属性在编译阶段绑定

31.instanceof:

判断实例是否为某个类型或子类型

(1)只能在父子类进行比较

(2)Null可以进行比较结果为false

(3)判断实例类型时,一般从子类开始,然后父类

32.override:

方法覆盖。

子类重写父类中的方法

子类重写父类中的方法的条件:

(1)方法名相同

(2)方法签名相同(参数)

(3)返回值相同

(4)子类的修饰符要大于等于父类的修饰符

(5)子类抛出的异常要小于等于父类抛出的异常

33.依赖关系

(1)一个类中的方法,其局部变量类型是另一个类,则这两个类具有依赖关系

(2)一个类中的方法调用另一个类中的静态方法,则这两个类具有依赖关系

(3)一个类中的方法中参数是另一个类的静态方法,则这两个类具有依赖关系

34.多态的运行机制

(1)在类编译阶段,编译器会检查类型是否匹配

(2)在运行阶段,jvm会调用实例的对应方法,先检查父类方法,然后检查子类方法,然后会检查实例声明的类型

35.Super

调用父类的属性和方法、子类和父类有同名的方法时,子类可用super区分是父类的方法

36.final

(1)final修饰的类不能被继承

(2)final修饰的方法不能被覆盖

(3)final修饰的变量是常量,常量不可修改但有例外

实例常量:

若定义时没有赋值,则可以在构造器或实例代码块中赋值,构造器或者代码块赋值只能有一个

静态常量:

若定义时没有赋值,则可以在静态代码块中赋值,

37.抽象类

具有部分实现的类。

使用时的注意事项:

(1)不能实例化

(2)可有0到多个抽象方法

(3)可有构造器

(4)具体类继承抽象类时必须实现所有的抽象方法

(5)抽象类可以间接的被子类调用其构造器,并在内存中分配空间,间接实例化

(6)抽象类可以有静态方法,可以返回其子类的实例

怎样使用抽象类?

(1)把各个类中可以共用的方法和逻辑放到抽象的父类中,越多越好

(2)属性应尽可能放到子类中

38.接口

定义:

从宏观角度说是一个规范,从面向对象角度说,接口是一种抽象类型

(1)属性是常量,一定要赋值

(2)方法是抽象方法

(3)没有构造器

(4)接口支持casting(强制类型转换)

(5)接口可以继承自多个接口

(6)实现接口的类必须要实现所有的方法,如果是抽象类可以选择实现部分的方法

为什么要使用接口?

(1)可插拔性的保证,可以随意更换接口的实现类

(2)接口可以解决多继承的问题

(3)接口使规范的制定者、实现者、使用者分开

39.接口和抽象类的区别

(1)接口没有任何实现,而抽象类可以有部分实现也可以没有

(2)如果需要复用或者共享代码,应该用抽象类而不是接口

(3)继承无法解决的类型转换问题,接口是为解决这问题而产生的

40.访问控制

作用域当前类同一package子孙类其他package

public√√√√

protected√√√×

default√√××

private√×××

41.static修饰符

(1)可以修饰属性,称为静态属性,全类公有常叫做类变量,和具体对象无关,无多态,类名去访问,类加载的时候初始化

(2)修饰方法,静态方法中只能访问静态成员,非静态方法可以访问静态成员,工具类的对象都是static的

(3)修饰代码块,初始代码块是在类中,而不在任何方法之内的代码块,被static修饰的代码块称为静态代码块,静态代码块在类加载的时候运行一次

42.异常

定义:

jvm将程序运行中的不正常情况的现场信息打包成一个对象,这个对象就是异常类对象。

并且将此对象抛出,交由相应的方法或对象处理。

异常信息记录了错误的原因,指出了错误的位置,打印错误的栈信息。

异常处理机制是责任链机制即子类取默认值不处理,交由父类处理直到追究到jvm然后抛给用户

43.为什么处理异常?

最本质的原因是让程序执行完毕

44.异常类的层次结构

Throwable:

Error:

是错误,程序运行中发生的系统异常,此种异常当前程序一般无法解决

Exeption:

checked()编译器强迫必须捕获并处理的异常

Unchecked(RuntimeExeption、)

对于此种异常编译器不要求捕获

原因是:

低级错误(low-grademistake)、程序员可以避免的错误

当错误发生时、捕获异常也无济于事

45.如何处理异常

(1)交给自己处理、交由当前方法处理

(2)交给别人处理、由调用该方法的方法来处理

(3)自己处理一部分、然后调用系统的异常方法

方法

(2)的步骤:

(1)在方法后声明可能发生的异常类型(throwsExceptiontype)

(2)该方法不用在做其它异常处理

(3)调用方法必须处理被调用方法的异常

46.throw的注意事项

(1)throw可以抛另一种类型的异常

(2)throw语句后不能再有其它代码、throw后的代码永远不会被执行

47.异常的捕获

try{

}catch(Exceptiontype1){

methodbody1

}catch(Exceptiontype2){

methodbody2

}

(1)在try{}catch{}语句中可能抛出不止一个异常、但是每个时刻只能抛出一个异常

(2)对可能抛出的每一种异常分别用catch{}来处理

(3)Catch语句处理多重异常应遵从从子类到父类的顺序

48.finally

用于资源的释放、在异常处理中finally一定会被执行到、Finally语句中如果有return语句、正常运行先执行finally再执行return语句返回当发生异常时、先执行catch语句捕获异常、如果没有catch语句、则执行finally语句及其后语句

49.自定义异常

为什么要自定义异常?

Java程序员可定义更多的方法来处理异常、自定义异常能够提供更复杂更详细的方法、这样能极大的加强软件的健壮性、代码更加清楚

怎样自定义异常

(1)继承Exeption使你的自定义异常变成checked异常

(2)继承RuntimeExeption使你的自定义异常变成unchecked异常

50.IO:

流是数据输入输出的通道、流中的数据是有序的

流的分类:

按数据流动方向:

输入流、输出流

输入流:

只能从中读取字节数据、而不能向其写出数据

输出流:

只能从中写出字节数据、而不能向其读取数据

按流所处理的数据类型:

字节流:

处理字节数据

字符流:

处理字符数据

按流所处理的源:

节点流:

从一个特定的IO设备读写数据的流

处理流:

对已存在的流进行连接和封装的流

intread():

读取一个字节,并将它返回。

intread(byte[]buffer):

将数据读入一个字节数组,同时返回读取的字节数。

voidclose():

关闭流。

51.线程

线程和进程的区别:

(1)每个进程都有独立的代码和数据空间、进程间的切换会有较大的开销

(2)线程可以看成是轻量级的进程、同一类线程共享代码和数据空间、每个线程有独立的运行栈和程序计数器、线程切换的开销小。

(3)多线程是在同一应用程序中有多个顺序流同时执行。

(4)多进程是在操作系统中能同时运行多个任务。

52.创建线程的两种方式:

(1)定义一个线程类它继承Thread并重写其中的run()方法,方法run()称为线程体

(2)提供一个实现接口runable的类作为线程的目标对象、在初始化一个thread类或者thread子类的线程对象时把目标对象传递给这个线程实例、由该目标对象提供线程体

53.比较创建线程的两种方式:

使用runable接口可以

(1)将cpu、代码、数据分开、形成清晰的模型

(2)可以从其它类继承

(3)保持程序风格一致性

直接继承Thread类不能从其它类继承、编写简单可以直接操纵线程

54.线程状态

New:

创建状态。

当创建一个新的线程时、它就处于创建状态、此时它仅仅是一个空的线程对象、系统不为它分配资源

Runnable:

可运行状态。

当线程处于创建状态时、可调用start()方法来启用它、产生运行这个线程所需的系统资源、安排其运行

Dead:

死亡状态。

线程终止

(1)自然撤销。

线程的run()正常退出

(2)强制停止。

调用线程实例的stop()可以强制停止当前线程

Blocked:

停滞状态。

(1)通过sleep()让线程进入休眠状态

(2)通过wait()暂停线程

(3)线程正等待某个IO设备动作完成

(4)线程试着调用另一个对象的synchronized函数、而且尚未取到对象的机锁

55.守护线程(daemon Thread)

是为其它线程提供服务的线程、一般应是一个独立的线程、它的run()是一个无限循环

56.守护线程与其它线程的区别

如果守护线程是唯一运行着的线程、程序会自动退出。

57.互斥锁(对象锁)

保证共享数据的完整性

每个对象都对应于一个可称为互斥锁的标记、这个标记用于保证在任意时候只能有一个线程访问该对象

58.使用synchronized的时机

(1)这个函数是否修改对象内关键变量的状态、(关键变量是能被其它线程读取或修改的变量)

(2)这个函数是否和关键变量的状态有依存关系

(3)基类的方法为synchronized时、synchronized不能被继承、复写时重新采用synchronized

59.释放锁

如果一个线程一个占用一个对象的锁、则其它线程将永远无法访问该对象、因此需要在适当的时候将对象的锁归还

(1)当线程执行到synchronized的块结束时、释放对象锁

(2)当在synchronized块中遇到break、return或抛出异常、则自动释放对象锁

(3)当一个线程调用wait()时、它放弃拥有的对象锁并进入等待队列

60.死锁

是指两个线程都互相等待对方释放锁、是不可预知或避开的、应采取措施避免死锁的出现。

61.sleep()和wait()的区别

(1)Sleep()是Thread类的方法、wait()是Object类的方法

(2)Sleep()可以在非synchronized函数中被调用、wait()只能在synchronized函数或同步块中被调用

(3)Sleep()不会释放对象机锁、wait()会释放对象锁

(4)使用场景不同、sleep()方法同一个线程内间隔多长时间后再次执行此任务、wait()是多个线程之间

JDBC

1.JDBC连接数据库的基本步骤:

(1)注册驱动程序

(2)建立连接

(3)发送和执行sql语句

(4)处理结果

(5)释放资源

2.常用对象

(1)connection建立与数据库的连接DriverManager类的getConnection()将建立数据库的连接

(2)statement将sql语句发送到数据库中存在三种statement对象

Statement

PreparedStatement

CallableStatement

(3)Result包含符号sql语句执行结果集、并且通过一套get方法提供了对这些行中的数据的访问

3.事务的基本概念及如何在JDBC中实现事务

事务是一些事件的集合、执行一条sql语句可以理解成一个事务、事务中包含多个事件、如果每一个事件都能执行成功的时候、事务才执行、如果任何一个事务不能成功执行、事务的其它事件也不能被执行。

JDBC处理事务的代码:

booleandefaultCommit=conn.getAutoCommit();

conn.setAutoCommit(false);

try{stmt.executeUpdate(strSQL1);

stmt.executeUpdate(strSQL2);

mit();

}catch(Exceptione){

conn.rollback();

e.printStackTrace();

}finally{

if(stmt!

=null){

stmt.close();

}

if(conn!

=null){

conn.close();}

}

conn.setAutoCommit(defaultCommit);

Servlet和JSP

1.servlet和JSP的关系

JSP是以另外一种方式实现了servlet、servlet是JSP的早期版本、在JSP中更加注重页面的表现、而在servlet中更加注重业务逻辑的实现。

因此当编写的页面显示效果比较复杂时、首选JSP、或者在开发过程中、html代码经常发生变化而Java代码相对比较固定时可以选择JSP、而我们在处理业务逻辑时首选则是servlet、同时JSP只能处理浏览器的请求、而servlet可以处理一个客户端的应用程序请求、因此servlet加强了web服务器的功能

2.servlet的生命周期

(1)服务器加载servlet

(2)创建servlet实例

(3)调用servlet实例的init()

(4)收到请求

(5)调用service()

(6)service()处理请求并将输出结果返回客户端

(7)servlet等待下一个请求、转到(4)继续向下执行

(8)servlet在服务器调用destory()然后卸载

3.init()调用时机

(1)服务器第一次访问servlet的时候被调用

(2)在web.xml中设置load-on-startup>=0情况下、服务器启动的时候调用

4.Destroy()调用时机

(1)servlet在被卸载前

(2)servlet很长时间没有被使用

5.HttpSession接口的功能和使用方法

这是一个java.servelt.http包中的接口、它封装了会话的概念它的定义为publicinterfaceHttpSession可以使用HttpSessionsession=request.getSession();

来这种类型的对象、语法为HttpSessionsession=request.getSession();

6.什么是组件、使用组件有什么优点

现代件开发都已转向基于组件的开发、目前代表性的组件技术有微软的com和com+、有sun的javabean和EJB、另外还有CORBA(CommonObjectRequestBrokerArchitecture,公共对象代理结构)、javabean规范将

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1