1.JVM(Java Virtual Machine)即Java虚拟机
Java虚拟机是一个抽象的计算机,和实际的计算机一样,它具有一个指令集并使用不同的存储区域。
它负责执行指令,管理数据、内存和寄存器。
Java解释器负责将字节代码翻译成特定机器的机器代码。
两个机器如果都装了JVM,则可以实现分布式计算,异步远程调用
JVM的目的是通过一个标准的虚拟计算机提供了统一的程序运行环境。
其本质就是在应用软件和OS之间加了一个中间层,消除了应用对OS的依赖性。
Java并不是第一个使用虚拟机技术的,但Java虚拟机却是最成功的。
未来的发展趋势可能是一个机器中装载多个不同的虚拟机,且运行不同的程序.
2.JVM组成
类装载器子系统 class loader subsystem
运行时数据区 runtime data areas(可分为: heap,java stacks,method area,pc registers,native method stacks)(相当与内存)
执行引擎 execution engine(相当于cpu)
本地方法接口 native method interface
3.Java是面向对象(object-oriented)的语言
面向过程思维的主体是逻辑,以及承载逻辑的集合——函数,强调算法。
面向对象思维的主体则是组件,把逻辑和数据封装成类和对象,强调设计。
(算法可以参考计算机编程的艺术)
4.类是什么?
物理上,是硬盘上的class文件,是Java虚拟机指令的集合。
逻辑上,是方法和属性的编译时集合,是静态的。
5.对象是什么?
物理上,是内存中的一块空间,是Java虚拟机用来存放数据和执行代码的内存区域。
逻辑上,是类的实例instance,是属性和方法的运行时集合,是动态的。
6.类和对象的关系
类是构建对象的模板
对象是类的实例,对象==实例
由类生成对象的过程叫实例化
类的实例化过程实际上就是类由硬盘上的文件变成内存中的数据的过程
7.Java类从编写到执行的步骤
编译(只需一次)
运行
装载
链接和检验
解释执行
java.exe只是一个执行的外壳,它调用的jvm.dll(竟然是用C++写的)才是JVM,在linux和solaris下为libjvm.so(也是C++写的)
类的装载工作由类装载器(Class Loader)完成
实现从本地机或远程装载当前应用的类和所继承的类
8.类装载器使Java程序可以自动地装载和运行所需的类,包括从网络上不同结点处装载运行,所属惰性装载,节省空间.在Eclipse中可以修改VM的自变量,以查看虚拟机的运行时所装在的类为 :-verbose:class
这样做会产生什么问题?
1.安全问题(沙箱模型解决该问题:把破坏行为限制在特定的沙箱里).
9.运行时数据区
方法区:存放类.类变量.静态变量
堆:存储对象(线程的公共区)
Java栈:包括局部变量 、执行环境 、操作栈,基本数据类型 ,(每个线程单独)
寄存器:用来存放当前系统状态
本地方法栈
栈(stack)与堆(heap)都是Java用来在内存中存放运行时数据的地方,Java自动管理栈和堆,程序员不能直接地设置栈或堆
10.栈的特点
存取速度比堆要快,仅次于直接CPU的寄存器。
存在栈中的数据大小与生存期必须是确定的,缺乏灵活性
栈数据不可以共享
11.堆的特点
可以动态地分配内存大小
生存期也不必事先告诉编译器,Java的垃圾收集器自动回收不再使用的数据
由于要在运行时动态分配内存,存取速度较慢。
栈中存放基本数据类型和引用数据类型数据
堆中存放对象(类的实例)
堆中数据可以共享
12.对象的生命周期
实例化
程序运行
程序结束
回收
回收原理:引用计数,统计,分代
垃圾回收机制好.最简单的有两种算法:引用计数法.分代,
13.引用例子:User u=new User();
u是新对象的引用,其中保存对象在堆中的地址
通过u可以访问堆中的新对象
被称为引用变量
结果:堆中增加了一个User对象,Java栈中增加了一个引用变量u,u指向User对象
引用变量放在栈里因为地址本身也是固定长度且确定的变量
String name="z"; 创建了2个对象,一个数组,一个是字符串对象本身.name是引用变量.
14.方法重载:
例一:toString();
例二:equals(Object o);重载;
public class User {
private String userName = null;
private String passWord = null;
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String toString() {
return "userName=" + this.getPassWord() + "/n" + "passWord="
+ this.getUserName();
}
public boolean equals(Object oo) {
boolean isEquals = false;
if(oo==null){
throw new NullPointerException("比较的对象不能为空!");
}
if(!(oo instanceof User)){
throw new ClassCastException("比较的对象不是User类的实例!");
}
User u=(User)oo;
if(userName.equals(u.getUserName())&&passWord.equals(u.getPassWord())){
isEquals=true;
}
return isEquals;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
User user=new User();
user.setPassWord("1");
user.setUserName("2");
System.out.println(user);
if(user.equals(new Array())){
System.out.println("一致");
}
}
}
运行结果:
userName=1
passWord=2
Exception in thread "main" java.lang.ClassCastException: 比较的对象不是User类的实例!
at User.equals(User.java:34)
at User.main(User.java:52)
15. Class.forName("User");
是类的装载器,可以把类装在到JVM中
Class.forName("User").newInstance();
是对这个类实例化;可以通过下面方式赋值。注意异常处理!
User u=(User)Class("User").newInstance();
16.工场设计模式
public class UserFactory{
public static User getInstace(){
User u=new User();
return u;
}
}
所以上面的User类实例化可以这么写:
User u=UserFactory.getInstace();
实际上相当与委托,类User将实例化的功能委托给UserFactory工场,因此,该工场可以负责给任何类实例化,方便管理。
17.单太
<1>.恶汉式单例
public class User{
private static User u=new User();
private User(){
}
public static User getInstace(){
return u;
}
}
<2>.懒汉式单例
public class User{
private static User u=null;
private User(){
}
public static User getInstace(){
if(u==null){
u=new User();
}
return u;
}
}
这样能确保该类只实力化一次。必考题,推荐使用懒汉式。可以看java与模式。