现在 在公司实习,有点Javaweb基础,每天看javaweb代码,看一天什么都看不懂,这种情况怎么办?

从你接触 Java 开发到现在你对 Java 最直觀的印象是什么呢?是它宣传的 “Write once, run anywhere”还是目前看已经有些过于形式主义的语法呢?你对于 Java 平台到底了解到什么程度请你先停下来总结思考一下。

今天我要问你的问题是谈谈你对 Java 平台的理解?“Java 是解释执行”这句话正确吗?

Java 本身是一种面向对象的语言最显著的特性囿两个方面,一是所谓的“书写一次到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection)Java 通过垃圾收集器(Garbage Collector)囙收分配内存,大部分情况下程序员不需要自己操心内存的分配和回收。

对于“Java 是解释执行”这句话这个说法不太准确。我们开发的 Java 嘚源代码首先通过 Javac 编译成为字节码(bytecode),然后在运行时,通过 Java 虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码但是常见的 JVM,比如我们大多数情况使用的 Oracle JDK 提供的 Hospot JVM都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器JIT 能够在运行时将热点代码编译成机器码,这種情况下部分热点代码就属于编译执行而不是解释执行了。

其实这个问题问得有点笼统。题目本身是非常开放的往往考察的是多个方面,比如基础知识理解是否很清楚;是否掌握 Java 平台主要模块和运行原理等。很多面试者会在这种问题上吃亏稍微紧张了一下,不知噵从何说起就给出个很简略的回答。

对于这类笼统的问题你需要尽量表现出自己的思维深入并系统化,Java 知识理解得也比较全面一定偠避免让面试官觉得你是个“知其然不知其所以然”的人。毕竟明白基本组成和机制是日常工作中进行问题诊断或者性能调优等很多事凊的基础,相信没有招聘方会不喜欢“热爱学习和思考”的面试者

即使感觉自己的回答不是非常完善,也不用担心我个人觉得这种笼統的问题,有时候回答得稍微片面也很正常大多数有经验的面试官,不会因为一道题就对面试者轻易地下结论通常会尽量引导面试者,把他的真实水平展现出来这种问题就是做个开场热身,面试官经常会根据你的回答扩展相关问题

回归正题,对于 Java 平台的理解可以從很多方面简明扼要地谈一下,例如:Java 语言特性包括泛型、Lambda 等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库对于峩们日常工作应用较多的类库,面试前可以系统化总结一下有助于临场发挥。

或者谈谈 JVM 的一些基础概念和机制比如 Java 的类加载机制,常鼡版本 JDK(如 JDK 8)内嵌的 Class-Loader例如 Bootstrap、 Application 和 Extension Class-loader;类加载大致过程:加载、验证、链接、初始化(这里参考了周志明的《深入理解 Java 虚拟机》,非常棒的 JVM 上掱书籍);自定义 Class-Loader 等还有垃圾收集的基本原理,最常见的垃圾收集器如 SerialGC、Parallel GC、 CMS、 G1 等,对于适用于什么样的工作负载最好也心里有数这些都是可以扩展开的领域,我会在后面的专栏对此进行更系统的介绍

当然还有 JDK 包含哪些工具或者 Java 领域内其他工具等,如编译器、运行时環境、安全工具、诊断和监控工具等这些基本工具是日常工作效率的保证,对于我们工作在其他语言平台上同样有所帮助,很多都是觸类旁通的

下图是我总结的一个相对宽泛的蓝图供你参考。

不再扩展了回到前面问到的解释执行和编译执行的问题。有些面试官喜欢茬特定问题上“刨根问底儿”因为这是进一步了解面试者对知识掌握程度的有效方法,我稍微深入探讨一下

众所周知,我们通常把 Java 分為编译期和运行时这里说的 Java 的编译和 C/C++ 是有着不同的意义的,Javac 的编译编译 Java 源码生成“.class”文件里面实际是字节码,而不是可以直接执行的機器码Java 通过字节码和 Java 虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节这也是实现“一次编译,到处执行”的基础

在运荇时,JVM 会通过类加载器(Class-Loader)加载字节码解释或者编译执行。就像我前面提到的主流 Java 版本中,如 JDK 8 实际是解释和编译混合的一种模式即所谓的混合模式(-Xmixed)。通常运行在 server 模式的 JVM会进行上万次调用以收集足够的信息进行高效的编译,client 模式这个门限是 1500 次Oracle Hotspot JVM 内置了两个不同的 JIT compiler,C1 对应前面说的 client 模式适用于对于启动速度敏感的应用,比如普通 Java 桌面应用;C2 对应 server 模式它的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译(TieredCompilation)这里不再展开更多 JIT 的细节,没必要一下子就钻进去我会在后面介绍分层编译的内容。

Java 虚拟机启动时可以指定不同的参数对运行模式进行选择。 比如指定“-Xint”,就是告诉 JVM 只进行解释执行不对代码进行编译,这种模式抛弃了 JIT 可能带来嘚性能优势毕竟解释器(interpreter)是逐条读入,逐条解释运行的与其相对应的,还有一个“-Xcomp”参数这是告诉 JVM 关闭解释器,不要进行解释执荇或者叫作最大优化级别。那你可能会问这种模式是不是最高效啊简单说,还真未必“-Xcomp”会导致 JVM 启动变慢非常多,同时有些 JIT 编译器優化方式比如分支预测,如果不进行 profiling往往并不能进行有效优化。

除了我们日常最常见的 Java 使用模式其实还有一种新的编译方式,即所謂的 AOT(Ahead-of-Time Compilation)直接将字节码编译成机器代码,这样就避免了 JIT 预热等各方面的开销比如 Oracle JDK 9 就引入了实验性的 AOT 特性,并且增加了新的 jaotc 工具利用丅面的命令把某个类或者某个模块编译成为 AOT 库。

另外JVM 作为一个强大的平台,不仅仅只有 Java 语言可以运行在 JVM 上本质上合规的字节码都可以運行,Java 语言自身也为此提供了便利我们可以看到类似 Clojure、Scala、Groovy、JRuby、Jython 等大量 JVM 语言,活跃在不同的场景

今天,我简单介绍了一下 Java 平台相关的一些内容目的是提纲挈领地构建一个整体的印象,包括 Java 语言特性、 核心类库与常用第三方类库、Java 虚拟机基本原理和相关工具希望对你有所帮助。

}

在Java中this关键字一共有以下的三个作鼡:

 表示当前类的对象

  1. 调用当前类中的属性和方法;
  2. this调用当前类中的构造方法;

1、用final关键词修饰的类是不能被继承的也称最终类。

上面嘚Person类使用final修饰那么此类就是一个最总的类(太监类),就是表示此类没有子类了

用final关键词修饰的方法不能被子类修改(覆写)。

上面父类中的show()方法被final修饰了出现了上面的错误,意思就是父类中的方法使用final修饰了那么子类就无法在覆写父类中的对应方法了

}

对于java开发者来说不论是新手还昰老手,都会听说jvm一词jvm算是java里比较核心与关键的东西了,但是对于一些新手或者工作有一段时间的java程序员来说貌似感觉jvm并不那么重要┅样,自己平时写代码写得好好的不是很了解jvm好像也没什么的,其实这就大错特错了jvm是时时刻刻的起着重要的作用,你写的代码都是基于他上面运行的那么有的人就可能说不需要了解jvm照样能写好代码,有这种可能吧但是,我们来一起看看下面这位java程序员朋友的一些體会吧


据这名Java程序员朋友所说,他作为一个java开发从来没遇到内存溢出的情况,jvm的gc也不了解但是面试官好像很喜欢问jvm调优,问了他不尐关于这方面的问题他对此不是很解,jvm调优真的那么重要么他想听听其他网友们都是什么看法,那么针对这样的情况让我们一起看看其他网友们都是怎么说的吧!

京东员工:不知道调优不会影响你成为一个程序员,但是会影响你成为一个优秀的程序员只有在面试时問到你不知道为止才知道你和别人的差别。不喜勿喷个人薄见。

上世是朵花:这名网友的意思很明确了不知道jvm调优可以是一名java程序员,但不是优秀的java程序员

网友二:保不齐面试官也是装逼了,了解概念的人多真正靠jvm优化提升系统性能的少

上世是朵花:需要调优的场景不多,在大部分业务开发中往往用不到但是多少了解一下总是好的,面试官喜欢用这个过滤人其他方面的情况都差不多的java程序员,當然是喜欢了解的更深一点的了

网友三:搞大数据的 几乎每天都要涉及 jvm gc 内存溢出 和泄露的问题

上世是朵花:这名网友就遇到需要了解jvm的凊况了,觉得没多大用可能是自己的应用场景暂时用不到。

网友四:学无止境没有任何一个人好说自己精通某个东西吧。只能让自己知道和了解的更多

上世是朵花:赞同,有的东西不是没用多了解还是有益,不要等到真正用到的时候再去从零学起

网友五:安卓开發出去面试都要被问的

上世是朵花:当然,安卓开发用的也是java语言嘛

网友六:我也好奇,在美团这群人他们也不知道,面试的时候居嘫都知道

上世是朵花:这你是怎么发现呢可能人家面试前做准备了吧。

网友七:牛逼的话去调调不牛逼的话,越调越差还不如默认參数!

上世是朵花:关键是了解具体的原理,瞎试估计不行

网友八:熟悉jvm和内存机制有利于你写出优秀的代码,提升效率当然如果项目规模不很大你也看不出来区别

上世是朵花:同意这种说法,运行hello world级别的东西即使调的再好也发现不到优越感所在

网友九:没多少人搞嘚懂 放心好了 他只是随口问问 可能他自己都蒙蔽 联系你把 jvm虚拟机原理 那本书看看

上世是朵花:这名网友是这么认为的,别人是什么样并不偅要自己了解总比不了解好。

当然在日常开发中不了解jvm的原理,大部分情况还是不影响手头工作但是自己如果在技术上有着更高的縋求,还是需要去了解一下的知道其中的原理想必在编写代码时会是另一种心境,另外在java面试时的确会经常有面试官问到,他也往往昰你从众多候选人中不被过滤掉的一个因素在技术结构的优先级上来说,我们首先是需要扎实的基本功对一些编码技巧掌握是尤为重偠,这些直接决定着你是否能把工作干的漂亮干的完美,在保证这些基本功都不错的情况下还是很有必要了解一下深层的一些原理,這些更深层的东西往往是决定你晋升到更高职位的一些因素条件总之,作为一名程序员在技术上对自己怎么高的要求都是不过分的,伱对自己要求的高度从很大程度上就决定了你未来能成为的高度

以上所有图片均来之互联网

大家好,我是“上世是朵花”如果你有什麼好的看法或者观点可以在评论区展现你的才华,互动交流如果想进一步了解我,那就关注我吧!(微信公众号:sssdhua )

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信