Copyright©Stonee
最近在学习Java,老师是一位工程经历丰富的工程师。想通过这个笔记把能想到的记下来,当然随着对Java理解的逐步加深,我会不断更新修正这篇文章:
Java语言概述
众所周知,因为C语言难以满足日益增加的复杂性应用程序的需求,所以诞生了面向对象的语言。Java正是一门面向对象的语言,面向对象语言具有良好的:
- 封装性
通过类封装起来实现模块化
- 多态
实现了可扩展性
- 继承
可以复用
在刚开始接触Java的一个星期,我一直弄不明白Java究竟和C有哪些区别,虽然列出了这些特点,但是因为对这些特点的不了解,所以并不能真正搞懂他们之间的区别。
所谓面向过程,就是在解决问题的时候,针对于某个过程,逐步分解成小问题。面向对象则是自底向上逐步抽象(解释的确实很笼统,我现在只是大概理解,以后会更:))
学习一门语言眼界一定要放开,千万不能揪着语法本身不放,这门语言的特点才是真正核心的东西。
Java的设计初衷就是为了使程序员更加方便,所以编译器和JVM会帮程序员干好多C语言所不能干事情,譬如垃圾回收,数组越界判断等等。
另外,Java具有跨操作系统和CPU的优势,原因请看下面的编译过程:
Java编译过程
- 程序员通过集成环境写出了**.java**文件
- 经过编译器文件变为**.class**字节码 编译器会优化代码
- 之后交给JVM执行 JVM在编译的过程中会私自添加一点东西,如类等
- 再交给操作系统变为二进制
- 最后交给CPU运行
- 将结果打印到控制台
现在回答上面的问题,因为Java有了个中间层JVM,当把代码交给JVM的时候,JVM会自动判断OS和CPU的接口和指令集,进而去适应不同版本的OS和CPU。
Java代码是如何在JVM中工作的
用一种不正确的说法来说就是,需要2个区块:
- 栈:由操作系统分配,储存形参和局部变量
- 堆:
1. Java堆:存放着实例对象(实例字段)
2. 方法区:存储类对象(包括静态字段,静态和实例方法),常量池等
当JVM在代码中遇到类的时候,就会在方法区中加载这个类并对里面的静态字段初始化,之后在新建实例的过程中,在栈中引入变量名称并指向Java堆中的实例,实例中会存有实例字段,然后再指向方法区中的类
二更:这里可以解释一下为什么同样在方法区的类中,静态方法可以直接通过类来调用而实例方法却必须要new一个对象之后才能使用:原因是实例方法中会自动加入一个this的形参,必须要先建立对象然后才能把参数穿进去;而静态方法则没有this形参,(PS:总感觉这样解释也不太对,希望大家指正,以后会继续更:))
- 举个栗子:
int [] a;
a = new int [10];
- 第一步现在类里建立int;
- 第二步在栈中给变量名a分配字节并指向实例堆;
- 第三步在指向的实例堆中分配空间并标明10个字节(防止数组越界)之后指向类;