Java笔试题12道基础部分简答

492 阅读8分钟

1.接口和抽象类的区别

抽象的概念,包含一个抽象方法的类就叫做抽象类;抽象方法,只声明而未实现的方法叫做抽象方法,抽象方法必须使用abstract关键字声明,抽象类不能直接实例化,必须有子类,子类必须复写抽象类中的所有抽象方法。

abstract class 抽象类名称{
    // Increments modCount!!
    public void A(B b){//普通方法
        return null;
    }
    public abstract  void A(B b){//抽象方法
        //抽象方法是没有方法体的
    } 
}


接口:一个类中完全是全局常量(static final)声明和抽象方法组成,可以将其定义成一个数组

interface A{
}

一个子类可以同时继承抽象类和实现接口,格式:

class 子类 extends 抽象类 implements 接口A,接口B {}


2.Ajax同步和异步的区别

同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。

用户填写所有信息后,提交给服务器,等待服务器的回应(检验数据),是一次性的。

异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

当用户填写完一条信息后,该信息会自动向服务器提交,然后服务器响应客户端,在此过程中,用户依然在填写表格的信息,即向服务器请求多次,提高了用户的体验。

3.==和equals的区别

==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==比较的是2个对象的地址,而equals比较的是2个对象的内容,显然,当equals为true时,==不一定为true。

4.String,StringBuffer和StringBuilder的区别

String,StringBuffer,StringBuilder,都是final类,不允许被继承,在本质上都是字符数组,不同的是,String的长度是不可变的而后两者长度可变,在进行连接操作时,String每次返回一个新的String实例,而StringBuffer和StringBuilder的append方法直接返回this,所以当进行大量的字符串连接操作时,不推荐使用String,因为它会产生大量的中间String对象。


StringBuffer和StringBuilder的一个区别是,StringBuffer在append方法前增加了一个synchronized修饰符,以起到同步的作用,为此也降低了执行效率;若要在toString方法中使用循环,使用StringBuilder。

5.说说你对面向对象、封装、继承、多态的理解?

  • 封装:隐藏实现细节,明确标识出允许外部使用的所有成员函数和数据项。 防止代码或数据被破坏。

  • 继承:子类继承父类,拥有父类的所有功能,并且可以在父类基础上进行扩展。实现了代码重用。子类和父类是兼容的,外部调用者无需关注两者的区别。

  • 多态:一个接口有多个子类或实现类,在运行期间(而非编译期间)才决定所引用的对象的实际类型,再根据其实际的类型调用其对应的方法,也就是“动态绑定”。

6.Java反射是什么?为什么要用反射,有什么好处,哪些地方用到了反射?

反射:允许任意一个类在运行时获取自身的类信息,并且可以操作这个类的方法和属性。这种动态获取类信息和动态调用对象方法的功能称为Java的反射机制。

反射的核心是JVM在运行时才动态加载类或调用方法/访问属性。它不需要事先(写代码的时候或编译期)知道运行对象是谁,如 Class.ForName()根本就没有指定某个特定的类,完全由你传入的类全限定名决定,而通过new的方式你是知道运行时对象是哪个类的。 反射避免了将程序“写死”。

反射可以降低程序耦合性,提高程序的灵活性。new是造成紧耦合的一大原因。比如下面的工厂方法中,根据水果类型决定返回哪一个类。

public calss FruitFactory{
    public Fruit getFruit(String type){
        Fruit fruit = null;
        if("Apple".equals(type)){
            fruit = new Apple();
        }else if("Banana".equals(type)){
            fruit = new Banana();
        }else if("Orange".equals(type)){
            fruit = new Orange();
        }
        return fruit;
    }
}

class Fruit{}
class Banana extends Fruit{}
class Orange extends Fruit{}
class Apple extends Fruit{}

但是我们事先并不知道之后会有哪些类,比如新增了Mango,就需要在if-else中新增;如果以后不需要Banana了就需要从if-else中删除。这就是说只要子类变动了,我们必须在工厂类进行修改,然后再编译。如果用反射呢?

public class FruitFacotry{
    public Fruit getFruit(String type){
        Fruit fruit = null;
        try{
            fruit = (Fruit) Class.forName(type).newInstance();
        }catch(Exception e){
              e.printStackTrace();
        }
        return fruit;
    }
}
class Fruit{}
class Banana extends Fruit{}
class Orange extends Fruit{}
class Apple extends Fruit{}

如果再将子类的全限定名存放在配置文件中。

class-type=com.fruit.Apple

那么不管新增多少子类,根据不同的场景只需修改文件就好了,上面的代码无需修改代码、重新编译,就能正确运行。

哪些地方用到了反射?举几个例子

  • 加载数据库驱动时

  • Spring的IOC容器,根据XML配置文件中的类全限定名动态加载类

  • 工厂方法模式中(如上)

7.重载(Overload)和重写(Override)的区别

开发中最常使用的是重写(Override) , 子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

8.int和Integer的自动装箱/拆箱的问题

自动装箱:自动装箱简单来说就是将数据类型封装成对象类型。自动拆箱: 将对象类型转化成基本数据类型 。

9.一个http请求/相应包含哪些内容?

服务器接收到的请求:

GET /App/index.html HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Afent: Mozilla/4.0
Host: localhost:8080
Connection: keep-Alive
username=admin&password=123456


服务器返回的响应:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges:bytes
Last-Modified:Fri. 19 Apr 2013 01:53:17 GMT
Content-Type: text/html
Content-Length: 65
Date:Fri, 19 Apr 2013 01:53:17 GMT
Waring:w1
Waring:w2
<a href="ainde.html">click</a>
<img src="1.jpg"/>


10.cookie和session的区别和联系

  • Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;

  • Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

  • session的运行依赖session id,而session id是存在cookie中的,也就是说,如果浏览器禁用了cookie ,同时session也会失效(但是可以通过url重写,即在url中传递session_id)


11.为何使用session?session的原理?

比如网上购物,每个用户有自己的购物车,当点击下单时,由于HTTP协议无状态,并不知道是哪个用户操作的,所以服务端要为特定的用户创建特定的Session,用于标识这个用户,并且跟踪用户。

Session原理:浏览器第一次访问服务器时,服务器会响应一个cookie给浏览器。这个cookie记录的就是sessionId,之后每次访问携带着这个sessionId,服务器里查询该sessionId,便可以识别并跟踪特定的用户了。

Cookie原理:第一次访问服务器,服务器响应时,要求浏览器记住一个信息。之后浏览器每次访问服务器时候,携带第一次记住的信息访问。相当于服务器识别客户端的一个通行证。Cookie不可跨域,浏览览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie,换句话说Google只能操作Google的Cookie。

12.GET和POST的区别

  • GET用于获取数据,POST用于提交数据;

  • GET的参数长度有限制(不同的浏览器和服务器限制不同),POST没有限制

  • GET把参数包含在URL中,POST通过封装参数到请求体中发送;

  • GET请求只能进行url编码,而POST支持多种编码方式。

  • GET可以发送的参数只能是ASCII类型,POST没有限制,甚至可以传输二进制。

  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息;

  • GET刷新无害,而POST会再次提交数据

  • 还有GET请求会被保存浏览器历史记录,可以被收藏为书签,而POST请求不能等等


GET和POST本质都是TCP连接。不过GET产生一个TCP数据包;POST产生两个TCP数据包。

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200 OK(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 OK(返回数据)。

作者:junxia

如果您认为阅读这篇博客让您有些收获,欢迎扫描下方二维码关注我们,与我们交流互动。

本公众号专注Java面试题目的收集和解析以及【Web小项目】源码的分享,