1. 语言特性
1.1 跨平台
**用Java开发出来的应用程序不受底层平台的限制。** 这里所谓的“平台“指的是**操作系统**,这个功能由**JVM虚拟机**实现.JVM的三部分:秘书+保镖+翻译
- 秘书:类加载器(Class Loader),计算机加载读取一个类的.class(字节码)文件。
- 保镖:字节码校验器(Bytecode Verifier),对每一个字节进行校验,看它是否存在问题(语法问题、错误),出现错误编译过程就会中断,无法生成.class文件。
- 翻译:解释执行器(Interpreter),具有翻译的功能,将源文件(给人看的英语单词)编译为计算机可以看懂的.class文件。(文件内容是乱码,给计算机看的)
- 总结为:
.java文件 -> 通过JDK环境相关指令执行编译 -> .class文件
JVM初始化之后,如果有类的执行、调用等相关操作,JVM就会将.class文件加载到内存中,到运行阶段(类加载器查找载入.class文件、生成并装载该.class类对象,字节码校验器校验链接,解释执行器执行)。
JVM的地位(由计算机的层级关系看)
- 计算机1:
硬件环境:586机的CPU —> 操作系统:Windows —> JVM For Windows - 计算机2:
硬件环境:Core i7的CPU —> 操作系统:Solaris(Sun公司开发的一个操作系统)—> JVM For Solaris
比较可见
- 如果使用C++开发,需要开发两个版本,且版本源码大致相同,直接运行在操作系统上。
- 如果使用Java开发,只需要在两个计算机操作系统上安装不同版本的JVM,即可一套代码,两处运行,代码运行在JVM上。
一个Java程序的运行流程
- 编译阶段
将.java(源文件)文件编译为.class文件,把代码进行解释翻译,字节码校验器检查无错同时生成一个.class文件。 - 运行阶段
类加载器:编译无错后生成了.class文件后,加载读取一个类的.class文件。
1.2 安全/健壮
-
安全性:
- 没有“指针”概念 ,堵住了黑客利用指针篡改访问权限等因使用指针而造成的漏洞。
- 增加垃圾(无用的对象引用)自动回收机制,好比有助教帮忙擦黑板,可以一直写不必担心需要擦黑板。 这功能通过GC线程(一个低优先级的守护线程)实现,监测回收无用的对象引用 ,防止由于未释放的垃圾堆积导致内存溢出,使程序运行越来越慢直至死机。
- 增加Exception(异常)概念,使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅。
-
健壮性: 指一个计算机系统在执行过程中处理错误,以及算法在遭遇输入、运算等异常时继续正常运行的能力。
1.3 开源
1.4 简单 ★
- 语法简单: 被称为“C++的–”,意为取其精华,去其糟粕* 。
- 思想简单:面向对象的思想*。
// *糟粕: 指针、手动的垃圾回收、运算符重载 * 。
// *运算符重载:程序员可以以自己的意愿让运算符表示其含义。
// *面向对象的思想:使用代码模拟现实生活,灵活,以人为本。 (OO: Object oriented)
//附:面向过程的思想:需要人以计算机的角度去思考问题,以"机"为本,注重流程,比较死板。
由此引申出面向对象与过程的对比
//需求:求一个长10宽8的长方形面积与周长
//面向过程
public class Rect{
public static void main(String args[]){
System.out.println(10*8);
System.out.println((10+8)*2);
}
}
//面向对象(有类(模板))
//长方形类(实体类)
Class Rect{
//类体里面定义属性和方法
//属性:对象有什么
//变量赋值就是写死在类中的,不灵活
int length;
int width;
//方法:对象会什么(方法的定义:修饰符*+返回类型*+方法签名(方法名 参数))
//求面积方法
public void area(){
System.out.println(length * width);
}
//求周长
public void perimeter(){
System.out.println((length + width) * 2);
}
}
//测试类
public class Test{
public static void main(String args[]){
//1.创建对象:
//类名 对象名 = new 类名();
Rect rect = new Rect();
//new:新建一个对象并赋一个内存空间
//2.对属性赋值:对象.属性 = 值;
rect.length = 10;
rect.width = 8;
//3.求面积
rect.area();
//4.求周长
rect.perimeter();
}
}
//对比可见:面向过程的代码可复用性太低,维护难,错一个改多次,耦合度太高。
//高内聚:一个方法完成一个工作。 低耦合:代码之间相互依赖程度低,出错改的次数少。
// *修饰符:访问权限(如public:公共访问;private:私有)
// *返回类型:方法执行结束之后返回的数据类型,空就写void。
面向对象的名词解释与实践
-
类:以class修饰,一组类型相同事物高度抽象之后的集合概念,是用来创建对象的模板(猪狗猫抽象为动物类,猪狗猫也就是对象。类是泛指,对象是特指。又想到了柏拉图说的的“理型世界”,类是这个世界中的“理型”)。
-
对象:类的一个具体实例。
-
引用:对象的名字,猪狗猫,对象放在内存空间中,调用时要使用到的代号。Java中的对象在创建的时候需要起名字,但是一个对象如果一个名字都没有的话,会被gc回收掉,此时是零引用内存回收。
-
属性:对象有什么
-
方法(函数):对象会什么
//练习:
//需求:张三同学今年十八,喜欢画画和游泳。
//测试类
class Test{
public static void main(String args[]){
//创建对象
Student stu = new Student();
stu.name = "张三";
stu.age = 18;
Sout(stu.name + " " + stu.age);
stu.drawing();
stu.swimming();
}
}
//抽象出来的学生(实体)类
class Student{
//有什么
String name;
int age;
//会什么
public void drawing(){
Sout("会画画");
}
public void swimming(){
Sout("会游泳");
}
}
需要注意的是
- 一个程序在运行时才会找main方法,之前编译时里面有没有main方法是无所谓的,只有在运行时报错。
- 主类的类名要.java文件名一致,这个错误也只有在运行时才会出现,就算不一致编译也会通过。
- 公共public修饰符修饰的类,应使用此类名作为这个.java文件的文件名
- 有几个class编译出几个.class文件。
- 对象是对程序员不可见的,程序员只能调用其引用。
1.5 动态更新
对于Sun提供的一些核心方法只保留一个指向的关系。当若干年后核心类库升级了,我们的程序还是可以正常执行。
2 JDK/JRE/JVM的简介
2.1 安装JDK
类比“SDK = Software Development Kits (软件开发工具包)”。
JDK = Java Development Kits (Java开发工具包),包含类似于"System.out"这样的**基础工具类*,需要注意的是,JDK1.5之后版本号由1.X.0改为了X.0。在大版本号下划线后面标注的是这个版本的第多少次迭代。
JDK的下载地址
选择“Java SE Development Kit”,如果是32位操作系统选择x86,64位选择x64,其他操作系统根据情况自选,并选中“Accept License Agreement”,选择download列中的链接下载。下载后直接安装到默认的目录即可。
2.2 三者之间的关系
- JRE = Java Runtime Environment(Java运行环境)**。包含 JVM(Java虚拟机) 和 API(核心类库和编程接口)。所以,编译好的.class文件可以说运行在JVM,也可以说运行在JRE上。
- JDK包含JRE和bin(常用工具命令,像javac、java类似的)**。早期程序员需要分别安装JDK编写环境、JRE运行环境;现在,JRE自动导入到了JDK中,只需要装JDK即可。
2.3 面试题
问:JDK和JRE和JVM之间的区别
- 分别表示的含义是不一样的:JDK表示Java软件开发工具包,JRE是Java运行环境、JVM是Java虚拟机。
- 作用不同,JDK即可以编写代码又可以运行代码,JRE只能运行代码,所有的程序最终跑在JVM上面。因此,用户的电脑上只需要安装JRE,只用运行。