Java面试成神-04

  • 什么是面向对象程序设计

程序设计的本质是把人们在现实生活中遇到的问题通过抽象处理,利用编程语言转换到计算机能够理解的层面上去。程序设计从开始到现在,大致经历了过程式程序设计、结构化程序设计和面向对象程序设计3个阶段。

  • 过程式程序设计需要开发者对程序的每一步进行精确的设计和严格的控制。
  • 结构化程序设计需要开发者在编码之前将程序进行完整的划分,设计出各种图表,画出各种数据的流向,指明各个函数之间的相互作用,是一种自顶向下、逐步求精、使程序结构模块化的程序设计方法。
  • 面向对象程序设计(OOP)是将对象作为程序的基本单元,并将程序和数据封装在其中,以提高软件的重用性、灵活性和扩展性,每一个对象都代表现实世界中的一个具体事物(或者称为实体)。

面向对象程序设计是现今主流的程序设计思想,当前流行的Java、C#等都属于面向对象程序设计语言。面向对象的编程思想力图使程序和现实世界中的具体实体完全一致,这样可以使开发者和用户之间能更好的理解和沟通。

  • 面向对象程序设计的基本特征有哪些

面向对象程序设计的基本特征是封装、继承和多态。

  • 封装
    封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
    封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
    面相对象的不就是使用程序处理事情时以对象为中心去分析吗,与面向过程不同,面向过程关心处理的逻辑、流程等问题,而不关心事件主体。而面向对象即面向主体,所以我们在解决问题时应该先进行对象的封装(对象是封装类的实例,比如张三是人,人是一个封装类,张三只是对象中的一个实例、一个对象)。比如我们日常生活中的小兔子、小绵羊都可以封装为一个类。
  • 继承
    继承是面向对象的基本特征之一,继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
    我们在上面已经封装了兔子这个类,其他动物也一样可以进行封装。在封装过程中我们发现兔子、绵羊这两个类具有相似的功能或特性如吃草,所以我们可以抽取共有特征和方法形成高一层的类,如这里的食草动物、食肉动物。继承之间是子父类的关系。继承机制可以很好的描述一个类的生态,也提高了代码复用率,在Java中的Object类是所有类的超类,常称作上帝类。
  • 多态
    态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
知识点 内容
优点 1.消除类型之间的耦合关系、2.可替换性、3.可扩充性、4.接口性、5.灵活性、6.简化性
必要条件 继承、重写(子类继承父类后对父类方法进行重新定义)、父类引用指向子类对象

简言之,多态其实是在继承的基础上的。比如说今天我们要去动物园参观动物,那么你说我们去参观兔子、参观绵羊、参观狮子、参观豹子都是对的,但你不能说我们去参观汽车。在这个例子中,子类具有多态性:除了使用自己的身份,还能充当父类。

  • 面向对象中的五大基本原则
序号 原则 英文 内容
1 单一职责原则 SRP 一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。
2 开放封闭原则 OCP 对象或实体应该对扩展开放,对修改封闭。
3 里氏替换原则 LSP 在对象 x 为类型 T 时 q(x) 成立,那么当 S 是 T 的子类时,对象 y 为类型 S 时 q(y) 也应成立。(即对父类的调用同样适用于子类)
4 依赖倒置原则 DIP 高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。具体实现应该依赖于抽象,而不是抽象依赖于实现。
5 接口隔离原则 ISP 不应强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多!
  • Java SE. Java EE和Java ME有什么区别
  • Java SE(Java Platform,Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。
  • Java EE(Java Platform,Enterprise Edition)。这个版本以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。
  • Java ME(Java Platform,Micro Edition)。这个版本以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。
    说得更简单点:
版本 内容
Java SE 是做电脑上运行的软件。
Java EE 是用来做网站的-(我们常见的JSP技术)
Java ME 是做手机软件的。
  • java语言的运行机制
  • java是编译型和解释型语言的结合体
    ①首先采用通用的java编译器将java源程序编译为与平台无关的字节码文件(.class文件)
    ②然后由java虚拟机(JVM)对字节码文件解释执行
    注意:java字节码具有平台无关性,可以在各种不同系统平台中运行,但是需要有不同版本的java虚拟机,不同平台的java环境其Java虚拟机是不一样的。

  • JVM(Java Virtual Machine Java虚拟机)
    (1)JVM是java字节码执行的引擎,为java程序的执行提供必要的支持,还能优化java字节码文件,使之转化成效率更高的机器指令。程序员编写的程序最终都要在JVM上执行,JVM中的类的装载是由类加载器(ClassLoader)和它的子类来实现的。
    (2)ClassLoader是java运行时一个重要的系统组件,负责在运行时查找和装入类文件的类。
    (3)JVM屏蔽了与具体操作系统平台相关的信息,从而实现了java程序只需要生成在JVM上运行的字节码文件(class文件),就可以在多种平台上不加修饰的运行。不同平台对应着不同的JVM,在执行字节码时,JVM负责将每一条要执行的字节码发送给解释器,解释器再将其翻译成特定平台环境的机器指令并执行。java语言最重要的特点是跨平台运行,使用JVM就是为了支持与操作系统无关,实现跨平台运行。

  • ClassLoader
    1、是JVM实现的一部分,包括bootstrapclassloader(启动类加载器)
    2、ClassLoader在JVM运行的时候加载java核心的API,通过java程序实现两个ClassLoader:
    ①ExtClassLoader:它的作用是用来加载java扩展的API。也就是lib\ext类
    ②APPClassLoader:用来加载用户机器上CLASSATH设置目录的Class
    3、ClassLoader加载流程:当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该Class.java核心API,然后调用ExtClassLoader加载扩展API,最后APPClassLoader加载CLASSATH目录下定义的Class.

  • JRE
    JRE是JavaRuntimeEnvironment,java运行时环境,它是java程序运行所必须的环境集合,主要由java虚拟机、java平台核心类和若干支持文件组成。其不包含开发工具、编译器、调试器以及其他工具。
    在执行java程序的时候,操作系统会按照下面顺序寻找JRE环境:
    ①先查找当前目录下有没有jre
    ②再查找父目录下有没有jre
    ③接着在环境变量PATH指定的路径中查找jre
    ④注册表查看CurrentVersion的键值指向哪个jre
    JRE自带的基础类库主要在JRE\LIB\rt.jar文件中。在程序运行时,JRE由ClassLoader(类加载器)负责查找和加载程序引用到的基类库和其他类库。基础类库,ClassLoader会自动到rt.jar的位置,其他的类库,ClassLoader在环境变量CLASSPATH指定的路径中搜索。

  • JDK
    JDK是Java Development Kit,简称java开发工具包。
    JDK是java的核心。它包括java运行环境、一堆java工具盒java基础的类库(rt.jar)。
    JDK包含JRE的全部内容外,还包含开发者用以编译、调试和运行java程序的工具。
    JDK、JRE、JVM之间的关系:
    JDK、JRE、JVM之间是包含关系,范围由大到小依次为JDK、JRE、JVM。
  • 什么是GC?GC的工作原理如何
  • Garbage Collection简称为GC,是垃圾回收的意思、内存处理器是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃。Java语言提供的GC功能可以自动的检测对象是否超过作用域,从而达到自动回收内存的目的,java语言没有提供释放已分配内存的显示操作方法,资源回收工作全部交由GC来完成,程序员不能精确的控制垃圾回收的时机。
  • GC在实现垃圾回收时的基本原理:
    Java的内存管理实际就是对象的管理,其中包括对像的分配和释放。对于程序员来说,分配对象使用new关键字,释放对象时只是将对象赋值为null,让程序员不能够再访问到这个对象,该对象被称为“不可达”。GC将负责回收所有“不可达”对象的内存空间。


    对于GC来说,当程序员创建对象时,GC就开始监控这个对象地址、大小以及使用情况。通常GC采用有向图的方式记录并管理堆中的所有对象,通过这种方式确定哪些对象是“可达”的,哪些对象是“不可达”的。当GC确定一些对象为“不可达时”GC就有责任回收这些内存空间,但为了GC能够在不同的平台上实现,java规范对GC的很多行为都没有进行严格的规定。例如对于采用什么类型的回收算法、什么时候进行回收等重要问题都没有明确的规定,因此不同的JVM实现着不同的的实现算法,这也给JAVA程序员的开发带来了很多不确定性。


    根据GC的工作原理,可以通过一些技巧和方式让GC运行更快,高效而又合理。编程建议如下:
    1、尽早释放无用对象的引用,特别注意一些复杂对象,如数组,队列等。对于此类对象,GC回收它们的效率一般较低,如果程序允许,应尽早将不用的引用对象赋为null,这样可以加速GC的工作。
    2、尽量少用finalize函数。finalize是java提供给程序员用来释放对象或资源的函数,但是它会加大GC的工作量,因此尽量少采用finalize函数回收资源。


    当程序有一定的等待时间,程序员可以手动执行System.gc(),通知GC运行,但是java语言规范并不保证GC一定会执行。


    finalize是什么?
    finalize是方法名,java技术允许使用finalize()方法在垃圾收集器从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象的调用的。它是在Object类定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象的调用的。
  • 为何在JDK安装路径下存在"两个jre"和"三个lib"

安装JDK后,Java目录下有jdk和jre两个文件夹,但jdk下还有一个jre文件夹,而且这个jre比前面那个jre在bin目录下多了个server文件夹!

  • 普通用户装jre即可。开发人员需要安装jdk,其中包括jre。所以jdk目录下包括jre目录。两个jre大体相同,有细微的差别。
  • 两套 jre ,是针对不同的工作职责!不同的 jre 负责各自范围的内容。
  • 当用户只需要执行 java 的程序时,那么C:\Program Files\Java\jdk1.8.0_101的 jre 就 ok !
  • 当用户是 java 程序员,则需要 java 开发环境。编译时,系统就会优先去找C:\Program Files\Java\jdk1.8.0_101\bin下的“ java 、 javac ”这些命令所在目录或者他们的父目录的 jre 。即开发环境下运行的是 jdk 下的 jre 。

再说三个lib目录:

  • JDK下的lib包括java开发环境的jar包,是给JDK用的,例如JDK下有一些工具,可能要用该目录中的文件。例如,编译器等。
  • JRE下的lib只是运行java程序的jar包,是为JVM运行时候用的。包括所有的标准类库,和扩展类。
  • JDK下的JRE下的lib是开发环境中,运行时需要的jar包。最典型的就是导入的外部驱动jar包。因为编译时,系统找的是jdk下的jre。而不是最外层的jre。

最后我在这里补充几点:

  • 在使用Eclipse的时候不需要指定的CLASSPATH,Eclipse会自己搜索.
  • 独立目录下的jre是通用jre,安装时是可选的(选择了,则会覆盖已有版本)。jdk目录下的jre则是必须的。如果你在eclipse里指定jdk的路径(jre的路径不用你指定,会自己去找的),那么用的就是这个jre。而java, web, start等,用的则是通用jre。
  • JDK安装时设置PATH和CLASSPATH环境变量有何作用
序号 总结
1 JDK = JRE + BIN(常用的开发工具)
2 JRE = JVM + API(应用程序编程接口 核心类库 语言厂商提供的内容)
3 JVM = ClassLoader + Bytecode Verifier + Interpreter
类加载器 + 字节码校验器 + 解释执行器
  • PATH环境变量。
    PATH是针对操作系统而言的。设置PATH之后,在DOS任何盘符任何目录下,都可以直接使用JDK和JRE下的工具程序。作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。
  • CLASSPATH环境变量。
    作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPTH来寻找类的。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。 CLASSPATH是针对ClassLoder(类加载器)的,作用是当你通过网络下载了别人写好的class.jar包后通过设置CLASSPATH直接使用。
  • JAVA_HOME环境变量。
    它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。
  • 如何将程序中的文档注释提取出来生成说明文档

javadoc技术,是从源代码中抽取类,方法,成员等文档注释形成一个与源代码配套的API帮助文档,用一套特定的标签做注释,在编程结束后,通过javadoc.exe生成开发文档。

  • 常用的3种注释语句:
    //用于单行注释
    /....../用于多行注释,不能嵌套
    /*......./用于支持javadoc的特有的文档注释语句
  • javadoc能从java源文件中读取第三种方式的注释并识别一些特殊的变量
    @auth 作者信息
    @version 版本信息
    @parameter 参数名和意义
    @since 参数名和意义
    @return 返回值
    @throws 异常类和抛出条件
    @deprecated 引起不推荐使用的警告
    @see 交叉参数
  • 执行过程
    同编译java文件一样
    用javadoc TestJavaDoc.java
    即可生成html的说明文档。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342