纪念一次被问崩的面试 ——— 前后端| 面向对象 | Servlet | Java与Python的区别

文章目录

    • 面试问题总览
      • 如何理解前端和服务端
          • 客户端和服务端
          • 前端和后端
      • 如何理解面向对象
      • servlet是啥?
      • Java和Python的区别
    • 写在最后

面试问题总览

  • 如何理解前端和服务端

  • 如何理解面向对象

  • servlet是啥?

  • Java和Python的区别

写在开头:这次面试说实话还是给我上了一课。我不想用"紧张”来当作这次面试被当作沙口一样在十个面试官面前坐牢的原因。只是觉得自己真的还有特别多的知识需要去完善,需要去学习。也让我真正体会到了“只学会课本上的知识你连计算机入门都算不上”这句话。这篇博客就用来缓解一下自己面试破防的郁闷心情,并将面试碰到的问题进行复盘。

如何理解前端和服务端

这道面试题被问的时候愣了一下,因为很少有听说把前端和服务端放在一起比较的。听到的比较多的说法是:前端-后端客户端-服务端。这里简单在这里用自己的话阐述一下这四个概念,先贴一张图
纪念一次被问崩的面试 ——— 前后端| 面向对象 | Servlet | Java与Python的区别_第1张图片

客户端和服务端

首先介绍客户端和服务端,拿一个平常生活中的小例子来说明这两个概念:首先拿起手机,点开知乎。这时候你手机上的知乎APP就是一个客户端,启动知乎后,你的知乎APP就会去请求服务器,请求它返回信息。服务端接收到客户端的请求后,会去访问数据库,做一些类似于用户身份验证等等,并从数据库中取出你请求的资源。准备返回页面来响应你的请求。数据库访问完毕,并准备好返回给客户端的数据后,服务端就会响应客户端的请求,并给你返回那些从数据库中取出的内容(如热榜,推荐内容等等)。
以上介绍的是C/S的模式,还有一种特殊的客户端/服务器的方式是B/S,即浏览器/服务器方式(Browser/server)。我们平时浏览网页就是用这种方式来与目标网页的服务器通信的。
客户端的请求和服务端的响应还涉及了很多知识,如请求方式和返回的数据类型。
get和post
这是两种客户端请求服务端的方式,从字面意思很容易理解,get是从客户端拿到资源,post是从客户端发出信息,等待服务端的响应。

  • get方法请求到的界面是静态页面,是可以存入cache缓存的,使用这种方法如果想要从客户端这边传送参数的话一般会使用QueryString参数进行传送。在url中会体现出这种QueryString。如果接触过爬虫一定对QueryString不陌生,控制目标网页翻页就是调整QueryString的参数。
  • 而Post方法是动态请求服务器,Post方法会向服务端提交一个form表单。表单中存放着请求的参数,因为是动态请求,每次的参数都可能不相同,因此无法对服务端返回的数据进行缓存。这种方法请求非常安全,其中一个很重要的原因就是你的请求参数不会暴露在url中。

返回的数据除了html还有json数据,当然这两个方面的问题面试的时候并没有提问。

前端和后端

前端和后端我把它们理解成了在客户端和服务端所实现的方法。因此常常听人谈论前端和后端的时候后面都会带上"开发"

  • 前端 : 在客户端与用户进行直接交互的网页或者界面的实现。
  • 后端: 在服务端的功能,能够对数据库进行管理,这些功能对用户透明。

如何理解面向对象

这个是在奥卡姆的面试中碰到的一个问题,当时并没有能够很好的回答,这里做一下笔记:
面向对象是相对于面向过程来说的,面向对象是一个很抽象的概念,它是基于继承和多态来实现的模块,在面向对象中所有的概念都是用类来表达的。一个很简单的例子就能区分开这两个概念:
假设现在有两个程序员,一个采用面向过程编程(记为程序员A),一个采用面向对象编程(记为程序员B),现在要编写一个可以做菜的家庭机器人的程序。

  • 面向过程的程序员A会这么思考:首先家庭机器人要将菜从篮子里拿出来,然后洗三分钟,切碎,下油,放菜,翻炒,等待10分钟,取出,装盘。这一个个过程它都会分别使用不同的函数来实现,最后组合在一起实现这个机器人。
  • 而面向对象的程序员B会这么思考:首先搭起一个框架,食材预处理,食材烹饪,食材装盘。然后再慢慢来实现这些功能,最后机器人只需要去调用这些模块的接口即可。

综上,最后用一段话来描述一下面向对象和面向过程:

面向过程——步骤化
面向过程就是分析出实现需求所需要的步骤,通过函数一步一步实现这些步骤,接着依次调用即可

面向对象——行为化
面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为

servlet是啥?

servlet是啥?这个问题真的特别有意思,想要搞懂他也特别容易。再讲这个概念之前让我想到了我第一个Java程序并没有使用任何Javaweb的知识,但是因为助教学长的参考代码中有servlet我的项目目录中中就也加了servlet,但我并不知道这是个啥意思。我还把我实现的代码发出来了,现在想想真的还蛮丢人的。

那么言归正传,Servlet到底是个啥呢?Servlet的本质是Java中的一个接口,在IDEA中搜索servlet,就可以看到是一个只有5个方法的interface。
纪念一次被问崩的面试 ——— 前后端| 面向对象 | Servlet | Java与Python的区别_第2张图片
那么我们谈Servlet之前,就要先知道接口是干什么的。
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口中的方法必须是抽象的,即你只需要定义这个方法的名字,并不需要实现这个方法 。下面是一个接口的例子:

interface Animal {
     
   public void eat();
   public void travel();
}

接口的作用通过上述内容想必大家已经知道了,它的作用就是规范。那么Servlet是一个接口,它的作用是用来规范什么呢?

在文章的开头我介绍了客户端和服务器的请求与响应,那么这些网络请求必须有一套规范标准(类似于网络通讯中的协议)。所有实现Servlet的类都要实现接口中的五个方法,意思就是所有想要处理网络请求的类都需要回答下面几个问题

  • 你初始化时要做什么 init()
  • 你销毁时要做什么 destroy()
  • 你接受到请求时要做什么 service()

那么所有实现了Servlet的类就可以处理网络请求了吗?答案是不行,servlet是不会直接和客户端打交道的。Servlet必须要放入一个容器,由这个容器和客户端直接打交道。
Java WEB应用服务器Tomcat(举个例子)才是与客户端直接打交道的家伙,他监听了端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法再去数据库执行一系列操作,然后返回一个response对象,tomcat再把这个response返回给客户端。
如何找到每个请求对应的servlet呢?在JavaWeb项目中通常会有一个配置文件叫web.xml,这个文件里面定义了许多映射mapping,会告诉tomcat如何根据不同的请求去找不同的servlet来处理。
贴上一张图方便大家理解:
纪念一次被问崩的面试 ——— 前后端| 面向对象 | Servlet | Java与Python的区别_第3张图片

Java和Python的区别

这个问题其实蛮可惜的!我知道它们是有什么区别的,但是因为前面问的好多问题都不会,所以这个问题也没表述好。我面试的时候说的是“python是弱类型化的编程语言,在定义一个变量的时候并不用定义它的类型”,然后直接被一个师兄反驳了。现在回来冷静下来复盘才知道我们都没有理解对方的意思。
师兄反驳的理由是Python的底层是非常强的类型定义的,这点我最近阅读了一本特别好的书:《流畅的Python》,我在博客里要简单展开来说。Python的解释器叫CPython,从名字可以看出来是一个用C语言写的解释器,那么它的底层毋庸置疑既然是C语言当然有很强的结构定义。但是Python的弱类型化指的是:Python在解释阶段会进行自动的类型转换。就是说你虽然没有定义变量的类型,在解释阶段他会自动转化为基本数据类型。

Python和Java的最显著区别是一个是解释型语言,一个是编译型语言,这也在一定程度上决定了python的弱类型化特点。解释和编译的区别如下:

  • 解释:执行一句,解释器解释一句并执行
  • 编译:所有代码全部编译完毕后才执行

这两种方式各有优缺点,比如解释的执行效率很慢,但是它的解释器编写起来特别容易,而且调试很方便。而编译器虽然编写难度很大,但是它的执行效率特别高。

写在最后

  • 首先给阅读到这里的读者推荐一本书《流畅的python》,(如果你和我一样也想深度挖掘python的工作原理,并真的想精通一门语言的话。
  • 如果不参加这次面试我真的发现不了自己这方面的问题,只是一味觉得自己技术还不够强,要多多学习。但是并不知道还有这么多知识点还没有学会和掌握。所以不管识意团队最终的面试结果如何,这次面试对我来说都是一次不错的收获。
  • 真的不能拘泥于自己课本上学到的东西,不要因为考试考了很高的分就沾沾自喜自以为自己已经算很牛掰了。我个人觉得应付考试考试涉及到的更多是技巧和运气,对个人的思维真的一点帮助都没有。
  • 学完编译原理和汇编语言后,我变得更想要去了解高级编程语言更加底层的实现思维。不得不说读了python的书以后真的能够感觉到python的优美并不仅仅在于它的简单,其中很多数据类型和类的内置方法都是可以深度挖掘的东西,很多思想在编写代码的过程中是可以借鉴并且学习的。这也是为什么我在刚开始读这本书的时候发了一条朋友圈感叹我觉得自己没有学过python。
  • 谢谢你可以看完我的复盘。如果有什么不对的地方欢迎指出,我们共同进步!

你可能感兴趣的:(Note,java,python,面试,web,development)