Java基础知识

本文深入探讨了面向对象编程的三大特性:封装、继承和多态,解析了多态的实现机制及其优势,对比了接口与抽象类的区别,讨论了不可变对象、静态变量与实例变量、对象创建方式等Java核心概念,以及Servlet、JSP、RMI等Web开发技术的关键知识点。

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

转载自https://blog.youkuaiyun.com/linzhiqiang0316/article/details/80473906

1.面向对象的三个特征?

封装、继承、多态

2.多态的好处?

允许不同类对象对同一消息做出回应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式。

优点:

  1. 可替代性:多态对已存在的代码具有可替代性。
  2. 可扩充性:增加新的子类不影响已经存在的类结构
  3. 接口性:多态是超类通过方法签名。像一个子类提供一个公共接口,由子类来完善或者重写它来实现的。
  4. 灵活性
  5. 简化性

实现多态的方法:

1.接口实现

2.继承父类重写方法

3.同一类中进行方法重载。

虚拟机是如何实现多态的?

动态绑定技术,执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法。

3.接口和抽象的区别

接口的意义

规范、扩展、回调

抽象类的意义

抽象类的意义可以用三句话概括:

  1. 为其他子类提供一个公共的类型
  2. 封装子类中重复定义的内容。
  3. 定义抽象方法,子类虽然有不同的实现,但是定义时一致的。

接口和抽象类的区别

比较

抽象类接口
默认方法抽象类可以有默认的方法实现Java 8之前,接口中不存在方法的实现
实现方法子类使用extends关键字来继承抽象类。如何子类不是抽象类,子类需要提供抽象类中所声明方法的实现。子类使用iimplements来实现接口,需要提供接口中所有声明的实现。
构造器抽象类中可以有构造器接口中不能
和正常类的区别抽象类不能被实例化接口则是完全不同的类型
访问修饰类抽象方法可以有public、protected、deffault等修饰接口默认是public,不能使用其他修饰符
多继承一个子类只能存在一个父类一个子类可以存在多个接口
添加新方法想抽象类中添加新方法,可以提供默认的实现,因此可以不修改子类现有的代码。如果往接口添加新方法,则子类中需要实现该方法。

4.父类的静态方法能否被子类重写

不能,重写只适合实例方法,不能用于静态方法。而子类当中含有和父类相同签名的静态方法,我们一般称之为隐藏。

5.什么是不可变对象

不可变对象是指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象。如String、Integer及其他包装类。

6.静态变量和实例变量的区别

静态变量是存储在方法区,属于类所有,实例变量存储在堆当中,其引用存在当前线程栈。

7.能否创建一个包含可变对象的不可变对象

当然可以创建一个包含可变对象的不可变对象,你只需要谨慎一点,不要共享可变对象的引用就可以了。如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用。

8.java创建对象的几种方式

  1. 采用new
  2. 通过反射
  3. 采用clone
  4. 通过序列化机制

前两者都需要显式地调用构造方法。造成耦合性最高的恰好是第一种,因此你发现无论什么框架,只要涉及到解耦必先减少new的使用。

9.switch中能否使用string做参数?

在jdk1.7之前,swith只能支持byte、short、char、int或者其对应的封装类以及Enum类型。从jdk 1.7之后swith开始支持String。

ArrayList list=new ArrayList();   这种是默认创建大小为10的数组,每次扩容大小为1.5倍
ArrayList list=new ArrayList(20);  这种是指定数组大小的创建,没有扩充

10在J2EE中,使用Servlet过滤器,需要在web.xml中配置(<filter>、<filter-mapping>

)元素

Servlet过滤器的配置包括两部分:
第一部分是过滤器在Web应用中的定义,由<filter>元素表示,包括<filter-name>和<filter-class>两个必需的子元素
第二部分是过滤器映射的定义,由<filter-mapping>元素表示,可以将一个过滤器映射到一个或者多个Servlet或JSP文件,也可以采用url-pattern将过滤器映射到任意特征的URL。

11.Frame类继承了Window类,他定义了一个可以有菜单栏的主应用窗口。

12.事件监听器接口(event-listener interface)和事件适配器(event-adapter)有什么关系?

事件监听器接口定义了对特定的事件,事件处理器必须要实现的方法。接
事件适配器给事件监听器接口提供了默认的实现。如果实现事件监听器接口,就需要重新写接口中的所有方法,会造成不必要的代码浪费。适配器是一种设计模式,用抽象类实现接口所有方法,可以没有语句,只需要重写关注的方法。所有的适配器抽象类都采用了接口的适配器模式来实现。

https://www.nowcoder.com/questionTerminal/53480833b42d4fd8a74c68e68c1363ab

13.GUI组件如何处理他自己的事件?

只要它实现相对应的事件监听器接口,并且把自己作为事件监听器。

14.Java的布局管理器比传统的窗口系统有哪些优势?

ava使用布局管理器以一种一致的方式在所有的窗口平台上摆放组件。因为布局管理器不会和组件的绝对大小和位置相绑定,所以他们能够适应跨窗口系统的特定平台的不同。

15.Java的Swing组件使用了MVC(模型-视图-控制器)设计模式?

16.JDBC:JDBC是允许用户在不同数据库之间做选择的一个抽象层。JDBC允许开发者用JAVA写数据库应用程序,而不需要关心底层特定数据库的细节。

17.解释下驱动(Driver)在JDBC中的角色。

JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql包下面这些类的实现:Connection, Statement, PreparedStatement,CallableStatement, ResultSet和Driver。

在使用jdbc前,应该保证相应的Driver类已经被加载到jvm中,并且完成了类的初始化工作就行了.

详解:https://www.nowcoder.com/questionTerminal/5d5a79136e644be59951c8f135d0af3f

18.Class.forName()方法有什么作用?

初始化参数指定的类,并且返回此类对应的Class 对象.

JVM规定了几种必须对类执行初始化的场景,class.forName就是其中一种,它会让jvm对指定的类执行加载、连接、初始化操作,其结果是会在方法区中为该类生成一个class对象作为访问类型信息的入口,还会为类的类变量分配空间并赋值

详解;https://blog.youkuaiyun.com/jiudihanbing/article/details/50740533

19.PreparedStatement比Statement有什么优势?

PreparedStatements是预编译的,因此,性能会更好。同时,不同的查询参数值,PreparedStatement可以重用。

20.什么时候使用CallableStatement?用来准备CallableStatement的方法是什么?

CallableStatement用来执行存储过程。存储过程是由数据库存储和提供的。存储过程可以接受输入参数,也可以有返回结果。非常鼓励使用存储过程,因为它提供了安全性和模块化。准备一个CallableStatement的方法是:
CallableStatement Connection.prepareCall();

21.数据库连接池是什么意思?

数据库连接的建立、关闭资源消耗巨大。 传统数据库访问方式:一次数据访问对应一个物理连接,每次操作数据库都要打开关闭该物理连接,系统性能严重受损。 解决方案:数据库连接池。系统初始运行时,主动建立足够足够的连接,组成一个池,每次应用程序请求数据库连接时,无需重新打开连接,而是从池中取出已有的连接,使用完后,不再关闭,而是归还。

22.Java RMI(Remote Method Invocation)--Java的远程方法调用

是Java所特有的分布式计算技术,它允许运行在一个Java虚拟机上的对象调用运行在另一个Java虚拟机上的对象的方法,从而使Java编程人员可以方便地在网络环境中作分布式计算。面向对象设计要求每个任务由最适合该任务的对象执行,RMI将这个概念更深入了一步,使任务可以在最适合该任务的机器上完成。

RMI定义了一组远程接口,可以用于生成远程对象。客户机可以象调用本地对象的方法一样用相同的语法调用远程对象。RMI API提供的类和方法可以处理所有访问远程方法的基础通信和参数引用要求的串行化。

使用RMI开发步骤:

1、定义一个远程接口(远程接口必须继承接口,每个方法必须抛出远程异常,方法参数和方法返回值都必须是可序列化的)

2、实现远程接口

3、定义使用远程对象的客户程序

4、产生远程访问对象的桩和框

5、注册远程对象

6、运行服务器和客户程序

RMI体系结构的基本原则:

RMI体系结构是基于一个非常重要的行为定义和行为实现相分离的原则。RMI允许定义行为的代码和实现行为的代码相分离,并且运行在不同的JVM上。

23.Naming类的bind()和rebind()方法有什么区别?

bind()方法负责把指定的名称绑定给远程对象。

rebind()方法负责把指定名称重新绑定到一个新的远程对象。如果那个名称已经绑定过了,先前的绑定会被替换掉。

24.让RMI程序能正常运行的步骤?

  1. 编译所有的源程序
  2. 使用rmic生成stub
  3. 启动rmiregistry。
  4. 启动rmi服务器
  5. 运行客户端

stub:扮演了远程对象的代表或者代理的角色。调用者在本地stub上调用方法,它负责在远程对象上执行方法。

步骤:
初始化到包含了远程对象的JVM的连接。
序列化参数到远程的JVM。
等待方法调用和执行的结果。
反序列化返回的值或者是方法没有执行成功情况下的异常。
把值返回给调用者。

25.分布式垃圾回收(DGC):。

RMI使用DGC来做自动垃圾回收。因为RMI包含了跨虚拟机的远程对象的引用,垃圾回收是很困难的。DGC使用引用计数算法来给远程对象提供自动内存管理。

26.解释下Serialization和Deserialization。

Java提供了一种叫做对象序列化的机制,他把对象表示成一连串的字节,里面包含了对象的数据,对象的类型信息,对象内部的数据的类型信息等等。

实现序列化和反序列化的对象必须实现serializable接口,序列化是将对象变成字节流,存储到磁盘或网络。反序列化是序列化的反过程。

27.什么是servlet?

:用来处理客户端请求并产生动态网页内容的Java类。Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。

28.Servlet的体系结构?

所有的Servlet都必须要实现的核心的接口javax.servlet.Servlet.每一个Servlet都必须要直接或者间接的实现这个接口。或者是继承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。

Servlet使用多线程可以并行的为多个请求服务。

GenericServlet类:

实现了Servlet和ServletConfig接口。实现了除了service()之外的其他方法,在创建Servlet对象时,可以继承GenericServlet类来简化程序的代码,但需要实现service()方法。

HttpServlet类

继承了GeneriServlet类,为实际开发中大多数用Servlet处理 HTTP请求的应用灵活的方法。

https://www.nowcoder.com/questionTerminal/2fc9acca029348e1adb2306653e67378

29.Applet和Servlet有什么区别?

Applet是运行在客户端主机的浏览器上的客户端Java程序。而Servlet是运行在web服务器上的服务端的组件。applet可以使用用户界面类,而Servlet没有用户界面,相反,Servlet是等待客户端的HTTP请求,然后为请求产生响应。

Servlet周期:

对每一个客户端的请求,Servlet引擎载入Servlet,调用它的init()方法,完成Servlet的初始化。然后,Servlet对象通过为每一个请求单独调用service()方法来处理所有随后来自客户端的请求,最后,调用Servlet(译者注:这里应该是Servlet而不是server)的destroy()方法把Servlet删除掉。

1.加载实例化 2.初始化 3.处理请求 4.销毁

30.doGet()方法和doPost()方法有什么区别?


1. get是从服务器上获取数据,post是向服务器传送数据。

2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式; 2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

31.什么是服务端包含(Server Side Include)?

服务端包含(SSI)是一种简单的解释型服务端脚本语言,大多数时候仅用在Web上,用servlet标签嵌入进来。SSI最常用的场景把一个或多个文件包含到Web服务器的一个Web页面中。当浏览器访问Web页面的时候,Web服务器会用对应的servlet产生的文本来替换Web页面中的servlet标签。

32.Servlet链(Servlet Chaining):

Servlet链是把一个Servlet的输出发送给另一个Servlet的方法。第二个Servlet的输出可以发送给第三个Servlet,依次类推。链条上最后一个Servlet负责把响应发送给客户端。

33.如何知道是哪一个客户端的机器正在请求你的Servlet?

ServletRequest类可以找出客户端机器的IP地址或者是主机名。getRemoteAddr()方法获取客户端主机的IP地址,getRemoteHost()可以获取主机名。

34.HTTP响应的结构是怎么样的?

http响应有三部分组成: 状态码、HTTP头部、主体(Body).

状态码(Status Code):描述了响应的状态。可以用来检查是否成功的完成了请求。请求失败的情况下,状态码可用来找出失败的原因。如果Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.SC_OK。
HTTP头部(HTTP Header):它们包含了更多关于响应的信息。比如:头部可以指定认为响应过期的过期日期,或者是指定用来给用户安全的传输实体内容的编码格式。如何在Serlet中检索HTTP的头部看这里。
主体(Body):它包含了响应的内容。它可以包含HTML代码,图片,等等。主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成的。

35.cookies和session区别


cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户的状态,就使用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。当浏览器再次请求该网站时,浏览器就会把请求地址和cookie一同给服务器。服务器检查该cookie,从而判断用户的状态。服务器还可以根据需要修改cookie的内容。

session是另一种记录客户状态的机制。不同的是cookie保存在客户端浏览器中,而session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session。客户端浏览器再次访问时只需要从该session中查找该客户的状态就可以了。 如果说cookie机制是通过检查客户身上的“通信证”,那么session机制就是通过检查服务器上的“客户明细表”来确认客户身份。

区别:

1.    无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用cookie,但是,session仍然是能够工作的,因为客户端无法禁用服务端的session。
2.   在存储的数据量方面session和cookies也是不一样的。session能够存储任意的Java对象,cookie只能存储String类型的对象。

36.浏览器和Servlet通信使用的HTTP协议。

37.HTTP隧道:

HTTP隧道是一种利用HTTP或者是HTTPS把多种网络协议封装起来进行通信的技术。因此,HTTP协议扮演了一个打通用于通信的网络协议的管道的包装器的角色。把其他协议的请求掩盖成HTTP的请求就是HTTP隧道。

38.永久性重定向的sendRedirect()和临时重定向的forward()方法有什么区别?

sendRedirect()方法会创建一个新的请求。重定向(redirect)以后,之前请求作用域范围以内的对象就失效了,因为会产生一个新的请求,

forward()方法只是把请求转发到一个新的目标上。转发(forwarding)以后,之前请求作用域范围以内的对象还是能访问的。

一般认为sendRedirect()比forward()要慢。

39.URL编码:

负责把URL里面的空格和其他的特殊字符替换成对应的十六进制表示。
 

URL编码指的是对网址上的不安全的字符,例如中文,进行编码,编码后的中文方便在网络上传输。

可以使用URLEncoder.encoder(String url,String encoder)方法进行url编码;

使用URLDecoder.decode(String url,String encoder)方法是进行URL解码。

40.什么是JSP页面?

JSP页面是一种包含了静态数据和JSP元素两种类型的文本的文本文档。静态数据可以用任何基于文本的格式来表示,比如:HTML或者XML。

解释1

JSP 全称是 Java Server Pages ,它和 servle 技术一样,都是 SUN 公司定义的一种用于开发动态 web 资源的技术。 JSP 实际上就是 Servlet 。(jsp = html + java)

html: 静态内容

servlet :服务器端的小应用程序。适合编写 java 逻辑代码,如果编写网页内容 -- 苦逼。

jsp: 适合编写输出动态内容,但不适合编写 java 逻辑

解释2
jsp是java开发的专门用于动态显示页面的技术。jsp编译时,会首先编译成servlet文件,然后编译成class文件。包含9大内置对象:response、request、exception、out、application、pagecontext、config、session、page。有四个域对象:request、pagecontext、session、application.

41.JSP请求是如何被处理的?

客户端通过浏览器发送jsp请求,服务器端接受到请求后,判断是否是第一次请求该页面,或者该页面是否改变,若是,服务器将jsp页面翻译为servlet,jvm将servlet编译为.class文件,字节码文件加载到服务器内存上执行,服务器将处理结果以.html页面的形式返回给客户端,若该页面不是第一次请求,则省略翻译和编译的步骤,直接执行。

42.JSP有什么优点?

1.JSP代码跨平台, 即一次编写,处处运行 
众所周知,由于微软的垄断性,它的产品可移植性做得十分差,ASP也不例外, 
2.JSP组件跨平台 
JSP组件(企业JavaBeans,JavaBeans或定制的JSP标签)都是跨平台可重用的.企业JavaBeans组件可以访问传统的数据库,并能以分布式系统模式工作于Solaris,Linux,UNIX和Windows平台. 
3.支持多种网页格式 
目前, JSP技术支持的网页格式还没有一个明确的标准.一般来说,JSP技术既可以支持HTML/DHTML的传统浏览器文件格式,又可以支持应用于无线通信设备如移动电话,PDA等设备进行网页预览的WML文件格式,还可以支持其他一些B2B电子商务网站应用的XML格式. 
4.JSP标签可扩充性 
尽管ASP和JSP都使用标签与脚本技术来制作动态Web网页,JSP技术允许开发者扩展JSP标签,定制JSP标签库,所以网页制作者充分利用与XML兼容的标签技术强大的功能,大大减少对脚本语言的依赖.由于定制标签技术,使网页制作者降低了制作网页的复杂度. 
5.健壮性与安全性 
由于JSP页面使用的脚本语言是java语言, 因此,它就具有java技术的所有好处, 包括健壮的存储管理和安全性。

43.什么是JSP指令(Directive)?JSP中有哪些不同类型的指令?

Directive是当JSP页面被编译成Servlet的时候,JSP引擎要处理的指令。Directive用来设置页面级别的指令,从外部文件插入数据,指定自定义的标签库。Directive是定义在 <%@ 和 %>之间的。

同类型的Directive:
包含指令(Include directive):用来包含文件和合并文件内容到当前的页面。
页面指令(Page directive):用来定义JSP页面中特定的属性,比如错误页面和缓冲区。
Taglib指令: 用来声明页面中使用的自定义的标签库。

44.什么是JSP动作(JSP action)?

JSP动作以XML语法的结构来控制Servlet引擎的行为。当JSP页面被请求的时候,JSP动作会被执行。它们可以被动态的插入到文件中,重用JavaBean组件,转发用户到其他的页面,或者是给Java插件产生HTML代码。下面列出了可用的动作:
jsp:include-当JSP页面被请求的时候包含一个文件。
jsp:useBean-找出或者是初始化Javabean。
jsp:setProperty-设置JavaBean的属性。
jsp:getProperty-获取JavaBean的属性。
jsp:forward-把请求转发到新的页面。
jsp:plugin-产生特定浏览器的代码。

45.什么是Scriptlets?

JSP技术中,scriptlet是嵌入在JSP页面中的一段Java代码。scriptlet是位于标签内部的所有的东西,在标签与标签之间,用户可以添加任意有效的scriplet。

46.声明(Decalaration)在哪里?

声明跟Java中的变量声明很相似,它用来声明随后要被表达式或者scriptlet使用的变量。添加的声明必须要用开始和结束标签包起来。

47.隐含对象是什么意思?有哪些隐含对象?

JSP隐含对象是页面中的一些Java对象,JSP容器让这些Java对象可以为开发者所使用。开发者不用明确的声明就可以直接使用他们。JSP隐含对象也叫做预定义变量。下面列出了JSP页面中的隐含对象:
application
page
request
response
session
exception
out
config
pageContext

47.面向对象软件开发的优点有哪些?

1.代码开发模块化,更易维护和修改。
2.代码复用。
3.增强代码的可靠性和灵活性。
5.增加代码的可理解性。
6.面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象。

48.抽象的定义?抽象和封装的不同点?

抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。
抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对象行为的细节。一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值