java语言特性
- 简单性
一方面是语法简单,c++纯净版本,无指针伪指针
第二个方面是小能够在小型机器上独立运行 - 面向对象
两个基本概念:类和对象
三大特性:封装继承多态
Java多继承是接口实现,比c++多继承简单
纯粹面向对象舍弃了c中容易引起错误的指针 - 分布式计算
处理http和ftp之类的tcp、ip直接通过url打开
- 健壮性
Java采用指针模型能够避免重写内存,损坏数据的可能性 - 安全性
安全性能好,自带验证机制 - 体系结构中立
解释虚拟机指令比全速运行机器指令慢得多,但是把频繁使用的字节码序列转换为机器码,热点代码的执行不一定比c++慢,即时编译(Java编译器就是即时编译器) - 跨平台
Java程序可以在不同的系统平台上运行,一次编译到处运行 - 多线程
- 有大量的API拓展
- Java增加了垃圾回收功能GC
能自动回收但是也会出现内存泄露,内存溢出
GC是什么? 为什么要有GC
答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,
忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
java版本
- se:java语言的核心类
- me:包含javase的部分类,用于手机,机顶盒,导航的软件开发
- ee:在se的基础上拓展出用于企业开发的类
jdk/jre/jvm
- JDK是java开发包,包含jre(java运行时环境),jvm(虚拟机),监控和诊断
- java实现了一次编写到处执行,因为jvm向上提供相同的接口,向下提供不同的接口针对不同的操作系统
- jvm/jdk/jre的区别:
jre是java的运行时环境,jdk是java的开发工具包,java运行,jvm是java虚拟机,jdk包含了jre,javac编译,jar,调试工具,javadoc生成文档,分析工具,jre是java运行的最小单元,一般安装在服务器上,jdk (java development kit)linux安装选择 .tar.gz的文件
jre (java runtime enviroment)包含jvm但不包含编译器
javase 简单服务器应用的Java平台
javaee 复杂服务器应用的Java平台
附一张图方便理解:
java是解释执行吗?
java是半编译半解释,java的源码通过javac形成字节码文件(里面装的是十六进制的东西),然后在运行时通过jvm将字节码转换为机器码,但是对于常用的热点代码,是通过动态编译器JIT,将热点代码编译成机器码,这部分代码就是编译执行,不是解释执行了
栈(FILO):线程栈,主要是放的局部变量
程序计数器:记录下一条将要执行的指令的内存地址(指令指针)
多线程每一个都有自己的线程栈和程序计数器(意思说各自是各自的独立存在的的)
java执行过程
- .java文件编译成.class字节码文件
- 将.class放入jvm中
- java使用类加载器(class-loader)加载.class文件
- 类加载完毕后,进行字节码校验,通过校验后,通过jvm的解释器,将字节码转换为机器码,交给操作系统执行,java8采用的是半编译,半解释执行,HotSpot JVM内置了JIT complie(动态编译器),能够将热点代码转换为机器码,提高了效率
java相关的一些小问题
- System.out.println()和System.out.print()什么区别呢?
以下代码的运行效果是什么?
System.out.println();打印完后,会换行。
System.out.print();打印完后,不会换行。 - 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
答:可以。但最多只有一个类名声明为public,与文件名相同。 - Something类的文件名叫OtherThing.java
class Something {
public static void main(String[] something_to_do) {
System.out.println(“Do something …”);
}
}
答案: 正确。从来没有人说过Java的class名字必须和其文件名相同。但public class的名字必须和文件名相同 - 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收
答:对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。
当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。