Java学习总结

来源:互联网 发布:mac air换外壳 编辑:程序博客网 时间:2024/06/06 03:11

关于Java的学习总结(一)

为什么是Java?

之前一直习惯了使用python,脚本语言实在是过于自由,以至于有时候我甚至忘了还有语法这么一回事情。简单而自由的语法的确可以将关注点更加放在算法等一些基于数学原理的问题上,不过乍一想来,心里还是感觉不慎稳妥(其实是老板要求用Java写代码。果真是越学越求稳?或许读研相比于本科最大的区别就是这么一回事。这是我第一次开通技术博客,之前一直在知乎写些有的没的,以至于在面试扇贝网自然语言处理工程师时要我出具Github账号,我是一脸懵逼的。也谈不上对技术有多么热爱,仅仅时因为对外界事物的惊奇,才从通信一步步走来。本技术博客撰写初衷着重应对于相关岗位的笔试面试知识点。

为什么是Java?

当我正式回答这个问题时,Java的特性是应该在比较中才能看出特点来的。相对于C/C++,Java语言在以下两个方面的特性不容忽视:1、去掉(简化)了关于指针的操作。这使得Java语言可读性与简洁性稍稍提高。2、内存的动态分配以及垃圾回收机制(JVM),JVM内核的封闭性使得Java与C/C++之间筑起了一道高墙。3、Java是一门解释型语言,使得Java能够实现一次编写、处处执行的特点。但也带来了运行速度较慢、程序效率较低的特点。

Java的语法特性

什么是面向对象的编程?

科大讯飞问到我唯一一个技术问题:什么是面向对象的编程?这个问题在同面向过程的编程进行比较的同时,还要回答出Java面向对象语言的特性:继承、封装、多态。从而引申出递归的问题:什么是继承,什么是封装,什么是多态。关于继承,需要注意的是:1、子类可以继承父类的非私有的方法与变量(public与protected)2、Java仅仅支持单继承。多继承可以采取接口的方式。而关于关系问题,可以采取组合的编程方式。关于多态,需要注意是实现多态的机制:1、Java提供了两种多态机制,分别是编译时多态以及运行时候的多态,其中编译时多态可以通过方法的重载实现,而运行时的多态时通过方法的重写实现。即调用何种方法,与运行在对内存中的实例化对象所绑定。而需要注意的时,成员变量是无法实例化的,与**声明的变量类型**有关。2、重载与覆盖的区别:重载是根据**不同类型的参数**来决定。而覆盖是根据相同的参数与返回值选择**不同的方法体**。函数是**不通过返回值来区分**的,否则会出现编译错误。

内部类、抽象类与接口

关于接口:接口是由**局常量和**和**共有的抽象方法**`所组成的。接口中的方法只能用public和abstract来修饰变量都是static final(全局变量)。即使不写关键字,也默认如此。关于抽象类:只要有一个抽象方法的类就必须声明为抽象类,抽象类表示为一个实体,而接口表示为一个概念。     

JVM的内存模型以及在内存中的作用

我想这个方向以后随着我对《深入理解JVM》这本书的阅读会有大量的知识点要补充。但不同于书本的是,我认为最简化的模型是将Java分为对内存,栈内存以及方法区(运行时的常量池)。模型构造如下图:

JVM运行机制
其中对于栈而言,主要存放的是对于堆的引用,一个对象在未实例化之前一直存放在方法区中,一般不会被清除,是故方法区又称为永久代。而一旦一个对象被实例化(new)之后,就会调用至堆内存区域之中。这种也是JVM内存回收机制主要运作区域。
实例化为对象分配空间的任务,等同于把一块确定大小的内存从堆内存中划分出来,这里涉及到两种方法:
1、指针碰撞(空间连续)
2、空闲列表(空间零散)
因为JVM会在初始化之前对于变量都赋予零值,所以这也是为什么在对象中声明变量的时候只需要声明权限以及属性即可。在new方法后随后的init方法中,才会对变量进行预设的赋值操作。

package demo02;public class demo02 {    public static void main(String[] args) {        // TODO Auto-generated method stub        test t=new test();        System.out.println(t.i);    }}class test{    public int i;}>>>>>>>>>0
原创粉丝点击