关键词: 读书笔记
java开发读书笔记(精选7篇)
篇1:java开发读书笔记
读书笔记
1、类和对象:类是用来定义一组对象共同具有的状态和行为的模版。而对象是现实世界中个体或事物的抽象表示,并且封装了它们的属性和行为。
2、为了防止命名冲突,Java采用了管理类文件的机制,即类包机制。(package)定义包名的语法格式:
“package包名;”
Java命名规则要求包的命名需要使用小写字母。
3、成员变量和成员方法:
1成员变量是在类体中定义的变量即全局变量,○成员变量一般用于定义对象的状态。成员变量是给对象使用的,每个对象被创建后都会有属于自己的属性,即成员变量。通过修改这些属性,从而改变对象的某个状态。
2成员方法是对象行为的描述。○
定义成员方法的语法格式:
“[修饰符] 返回值类型方法名([形参表]){
······//方法体
}”
修饰符:可以是:publicprivateprotactedstaticfinall等;
返回值类型:如果方法需要返回值,必须这里声明方法的返回值类型,可以是基
本数据类型(int short double booleanvoid等),也可以是对象
类型如:数组、字符串等。
形参表:(可选部分)说明方法被调用时应该向它传递的数据。形参表可以有一
个也可以有多个,当有多个形参时每个形参之间要用“,”隔开。
1创建对象:创建对象使用到new语句。
4、对象:○
声明并创建对象的语法格式如下:
“类名对象名=new 类构造方法()”
构造方法:构造方法是类创建对象是必须执行的方法,用于构造一个新的对象并
初始化对象属性。
2访问对象的属性: ○
语法格式:
“对象名.属性”
3执行对象的行为:○对象的行为就是对象的成员方法,通常说调用或执行对象的某个方法。
语法格式:
“对象名.成员方法名();”
4对象的销毁:Java提供了垃圾回收机制,对不再使用的对象会自动销毁,也可○
以在程序中显式的为某个对象赋null值,使对象不再被使用。
垃圾回收机制会找到并销毁它,释放该对象所占用的资源。
语法格式:
“对象名=null”
1创建类:Java中使用class关键字来创建类。
5、类:○
声明并创建类的语法格式:
“权限修饰符 class类名{
类体;
}”
权限修饰符:(可选项)可以使用public protected private 或者省略这3者。类体主要由成员变量和方法两部分组成。
2成员变量:在Java中对象的属性也称为成员变量。○
声明并创建成员变量的语法格式:
“权限修饰符数据类型成员变量名;”
(用static关键字定义的成员变量被称为静态成员变量即类变量。静态成员变量不是分配给每个对象的,而是属于累的变量。它在内存中是唯一的,可以直接使用“类名.成员变量名”的格式去访问,他在内存中的位置是固定的,是该类的所有实例对象所共享的存储单元。)
3成员方法:在Java语言中使用成员方法对应与类对象的行为。○
定义成员方法的语法格式:
“权限修饰符返回值类型方法名(参数类型参数名){
·······//方法体
}”
(同类变量一样,由static关键字定义的成员方法被称为类方法,类方法可以不必创建对象而由类直接访问,静态方法不可以直接调用非静态方法)4局部变量:○在方法体中声明的变量为局部变量,局部变量的有效范围为方法体结束。
5this关键字:在Java语言中用this关键字来代表类对象的引用,this关键字被○
隐式地用于引用对象的成员变量和方法。(在类方法中不可以使用this关键字。)this关键字和和对象都可以调用成员变量和方法,两者的区别:
事实上,this引用的就是本类的一个对象,在局部变量或方法参数覆盖了成员变量时,就要添加this关键字明确引用的是类成员还是局部变量的方法参数。6类的构造方法:构造方法与类同名。○
7类的主方法:主方法是类的入口点,它定义了程序从何处开始;主方法提供对○
程序流向的控制,Java编译器通过主方法来执行程序。
1)主方法是静态的,所以如果要直接在主方法体中
调用其他方法,则该方法必须也是静态的。
2)主方法没有返回值。
3)主方法的形参为数组。其中args[0]~args[n]分别
代表程序的第一个参数到第n个参数,可以使用
args.length获取参数的个数。
Java中完整的类声明格式:
“权限修饰符class类名{
权限修饰符数据类型成员变量名1;
权限修饰符数据类型成员变量名2;
·······
权限修饰符数据类型成员变量名n;
权限修饰符返回值类型成员方法名1(形参类型形参变量){ 方法体
}
权限修饰符返回值类型成员方法名2(形参类型形参变量){ 方法体
}
······
权限修饰符返回值类型成员方法名n(形参类型形参变量){ 方法体
} }”
6.由于类的主方法是静态方法所以不可以调用类中的非静态方法所以当需要调用非静态方法时必须创建对象来调用。在输入不同类型的数据时要使用不同的Scanner类对象,否则只能实现输入一种数据类型。
7.abstract关键字是定义抽象类的关键字。使用abstract定义的发放成为抽象方法。抽象方法没有方法体。抽象方法的唯一意义就是被重载。
篇2:java开发读书笔记
万物皆对象,抽取待求解问题的任何概念化构件,将其表示为程序中的对象
程序是对象的集合,他们通过发送消息来告知彼此所要做的
每个对象都有自己的由其他对象所构成的存储,创建包含所有对象的包的方式来创建新类型的对象
每个对象都拥有其类型
某一特定类型的所有对象都可以接收同样的消息
1。java还有个“缺省”的访问权限,如果你没用public、protected、private的话,那就是指它了。通常把它称为package访问权限。因为同属这个package的类可以访问这个package中其它类的“缺省”权限的成员,但是出了这个package,它们就都是private的了。
2。多态性,处理类系的时候,通常你不用把它当作某个具体的类型,只要把它当作基类对象就可以了,即把泛型的基类当作派生类来用。非oop的编译器的做法是前绑定,即编译器会产生那个名字的函数调用,而连接器负责将这个调用解析成须执行的代码的绝对地址。oop的编译器用了后绑定,即当你向某个对象送了一个消息后,不到运行时,系统不能确定到底调用哪段代码。java用存储在对象中的信息来计算方法的地址,因此每个对象的运行都会不同。后绑定是java的缺省行为,c++中必须用virtual声明。
3。abstract关键词声明类为抽象类,编译器会阻止任何人创建abstract类的对象,而只是把其派生类的对象上传给它。abstract也可以声明方法,表示这个类所派生的所有类都有这个方法,但是它的实现不在这里。abstract方法只能存在于abstract类中。
4。interface关键词是对abstract类的概念的深化,它不允许你实现任何方法,只作为接口使用.可以继承多个接口,java中无类多重继承。
5。c++支持的变量有自动、静态、寄存器和堆,java只支持堆变量,每次创建对象的时候都要用new来动态分配堆内存。
6。容器和迭代器:容器:c++标准模板类库stl = java标准类库的容器类,迭代器:将基于不同数据结构的容器抽象为一个简单线性序列的类。
7。java是单根继承体系,object作为最终基类使所有对象都具有某些基本操作。单根继承和系统通过reference操控对象,使垃圾回收器可以释放堆内存。
8。java容器只持有object对象,单根继承使它能持有任何对象上传只要把对象的reference直接放入即可,取对象时,必须知道它原有的类型,从容器中取出对象的reference然后强制转换为原因类型(下传:由基类到其派生类)。
9。参数化类型:能够根据需要由编译器自动指派类型的类,c++的模板template即参数化类型。java暂不支持
10。异常是一种能从错误发生的地方被抛出的对象,并被能解决这类问题的异常处理程序所捕获,异常肯定能得到处理,并且能够从错误状态下恢复。java的异常处理是从底层开始的,而且还不能不用,否则就不能编译通过。
11。java语音内置了多线程支持,线程被表示为对象,java还有一定的资源锁定功能,可以通过synchronized关键字锁定对象内存。
12。持久性:java可以通过对象的序列化或java数据对象来实现把对象从磁盘中存储和提取。
13。传统w/s:浏览器上送web服务器的数据由web服务器上的通用网关接口程序CGI处理,常用语言perl、python、C++等。
14。客户端编程:插件:可以为浏览器添加新的功能,甚至创造新的客户端编程语言。脚本语言:把客户端的源代码直接嵌入到html页面中,html页面显示的时候自动激活插件解释这些程序。常用脚本语言javascript、vbscript、tcl/tk等。java:可以通过applet和java web start进行客户端编,applet是一个只能运行在web浏览器里的小程序,applet是被编译过的代码,作为web页面的一部分自动下载,在被激活的时候开始运行。java web start分发在web浏览器外运行的独立程序。Activex操作上不受限制。
篇3:Java开发目录同步程序
Java语言是一种十分流行的程序开发语言。由SUN公司推出, 具有简易性、健壮性、安全性、可移值性等许多特性。可以用它开发各种应用程序, 是目前主流的开发语言。这里使用Java语言开发一个实用的目录同步程序, 通过实例讲解基本的Java程序开发技术。
2 开发思路
在网络环境中, 往往存在这样的需求。网络中的一台或几台计算机需要和网络中的某一台计算机中的目录文件保持一致。也就要同步的目录名和文件名以及文件内容要完全一样。如果文件发生变化, 变化后的文件将被实时更新。要实现这样的功能, 可以设置有目录同步要求的计算机为服务器, 要进行同步的计算机设置为客户端。双方通过套接字传递数据, 完成同步的功能。
服务器端设置要进行同步的目录名, 然后扫描该目录下的文件, 将要同步的文件名、文件校验码、文件时间、文件大小信息传给客户端;客户端检查要同步的文件, 如发现文件不一致, 就进行文件同步, 如果一致, 就确认同步完成。
3 程序代码
程序中有如下类, 用于搜索目录, 并将搜索到的文件放到一个Array List中:
服务端和客户端按以下规则传递数据, 如表1所示。
使用如下类, 用于读写服务端套接字:
使用如下类, 用于读写客户端套接字:
使用如下类, 用于进行文件校验, 以保证文件可靠传输:
4 结语
程序经过测试, 完成了目录同步的功能, 可以在实际环境中使用。希望本开发实例对从事Java语言开发的读者有所帮助。
参考文献
篇4:浅谈Java桌面应用程序开发
【摘 要】Java对于服务器,个人电脑和移动设备来说是一项伟大的技术。由于需要java的跨平台的特性,因此java在服务器和移动设备方面的应用是非常成功的。Java开发的桌面程序既有友好易用的图形用户界面,也能够实现相应的功能。【关键词】桌面开发
AWT
Swing SWT Java与桌面端现在流行的桌面平台要数Windows、Mac和 Linux。但它们不是十全十美的,Windows主宰着桌面操作系统的市场,其上有巨大的应用和开发群体,但它昂贵且有许多安全漏洞。Linux有着稳固的基础,它是开源的软件,比Windows更可靠。Mac非常容易操作且不是黑客的目标,但与Windows和Linux比起来,Mac的硬件和软件可选的余地非常的有限。Windows、Linux和Mac 在桌面的流行创造了多样性,这种多样性正是Java需要的,这就使得Java在桌面有举足轻重的地位。跨平台的支持Java 运行于所有相关的操作系统,包括Windows、Mac和Linux。也就是说把现有的应用从一个操作系统移植到另一个操作系统而不用做太多的改动,所以Java是首选的桌面开发平台。或许用微软的可视化工具很容易构建.NET应用,但是这将使软件被绑定在了Windows平台上。也许有人想用Linux 代替Windows 从而避免由微软操作系统的漏洞带来的问题,但是用户不能容忍的问题之一是当从Windows移植到Linux时所带来的巨大的费用。如果应用程序用Java构建,就没有了这些问题,Java的图形用户界面看上去会跟使用的操作系统一样,而并不需要做什么改动。丰富的特征最初,Java只有非常有限的一些特征去构建图形用户界面,思想就是用与平台无关的Java应用程序接口打包不同的操作系统的本地图形用户界面,称之为抽象的窗口工具。它仅有普通的部件如文件域、文本区、选择框、单选按钮、列表框和按钮被AWT支持,图形和图像的特性支持非常有限,也就是说,只能够构建简单的applet程序。认识到需要更高级的图形用户界面组件和图形能力,Sun公司开发了Swing,Java 2D,Java 3D,图像的输入/输出,Java高级图像(JAI)和很多其它的组件。这些中的一些窗体组件现在已经是Java 2标准版(J2SE)里的一部分。例如Swing、Java 2D、图像的输入/输出都是Java的核心API,它们随着Java开发工具包(JDK)和Java运行环境一起被提供给用户。Java图形界面工具Java有三个主要的图形界面工具:AWT,Swing和SWT。Swing 是构建java图形界面标准的API(应用程序接口),一些AWT类由Swing继承而来。SWT是一个非常有前途的新的窗体工具,由IBM资助。但是事实上,这三者相互补充,它们满足不同的需求。AWT抽象窗口工具包(Abstract Windowing Toolkit)(AWT)是Java的平台独立的窗口系统,图形和用户界面器件工具包。AWT是Java基础类(JFC)的一部分,为Java程序提供图形用户界面(GUI)的标准API。AWT提供了JavaApplet和Java Application中可用的用户图形界面GUI中的基本组件(components)。由于Java是一种独立于平台的程序设计语言,但GUI却往往是依赖于特定平台的,Java采用了相应的技术使得AWT能提供给应用程序独立于机器平台的接口,这保证了同一程序的GUI在不同机器上运行具有类似的外观(不一定完全一致)。SwingSwing是一个用于开发Java应用程序用户界面的开发工具包。它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。工具包中所有的包都是以swing作为名称。SWTSWT是IBM为它的Eclipse集成开发环境而开发的图形用户界面工具。SWT可以在Eclipse环境外使用,而且提供对操作系统本地图形用户界面的直接访问。因此,基于SWT的Java应用程序拥有本地的图形用户界面并且可以和本地别的应用程序和部件集成在一起。SWT社区现在正在设计浏览器API,这些API可以产生基于IE或者Mozilla的HTML窗口。SWT现在可以在AIX,HPUX,Linux,QNX,Solaris,和Windows下面运行。误解与Bug对于java/Swing一直有着误解,诸如:Java/Swing太慢了,或者是Java/Swing需要更多的内存。也许老式的奔腾运行JDK1。2确实很慢,但是PIII级别的CPU运行JDK1。4环境是足够快的。一个应用程序中鼠标在1毫秒和在10毫秒的反映的差异,从使用者方面来说是没什么区别的。Java不但在企业级的上千人同时在线的服务器中表现良好,而且在仅有有限资源的移动设备上的表现也是很出色的。总结Java作为一种网络技术,是为了在浏览器中能够运行小应用程序而发布,但是它从开始就有运行独立的桌面应用程序的能力。不幸的是,AWT没有提供足够的桌面端的程序所需的特性。Swing着手于解决这些问题,但是它有不少的bug。今天,Java有构建大型桌面端应用程序的能力并修复了bug。Java独有的优点是“只写一次,到处运行”——在Windows,Linux,Mac和其它操作系统上运行Java代码的能力。【参考文献】[1]Eric,Java编程思想[M],第4版,机械工业出版社,2007年4月[2]Metsker S J,Java设计模式[M],第2版,电子工业出版社,2012年09 月[3]毕建信,基于MVC设计模式的Web应用研究与实现[D],武汉理工大学出版社,2006年5月
篇5:java开发读书笔记
HttpServletRequest方法总结
getScheme()方法返回请求的计划,比如http,https或者ftp.getServerName()方法返回被发送请求的服务器的主机名 getServerPort()方法返回被发送请求的端口号。
getContextPath()返回请求地址的根目录,以“/”开关,但不是以“/”结尾。
一个常用的获得服务器地址的连接字符串是: String path = request.getContextPath();String basePath = request.getScheme()+“://”+request.getServerName()+“:”+request.getServerPort()+path+“/”;getCookies()取得cookie
getMethod()取得请求方法,如get,post或put getRequestURL()取得请求URL(统一资源定位符)getRequestURI()取得请求URI(统一资源标识符)getSession()取得对应session getHeaderNames()返回请求包含的所有头名称的一个enumeration(遍历器)使用方法如下:
Enumeration en = request.getHeaderNames();while(en.hasMoreElements()){
out.print(en.nextElement());
} 输出如下结果:
accept accept-language accept-encoding user-agent host connection cookie 具体含义是:
Accept:浏览器可接受的MIME类型。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。Host:初始URL中的主机和端口。
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
Cookie:这是最重要的请求头信息之一
getHeader(name)返回指定名称的特定请求的值。使用方法如下:
篇6:java开发读书笔记
(首先这里澄清两个概念:JVM实例和JVM执行引擎实例,JVM实例对应了一个独立运行的java程序,而JVM执行引擎实例则对应了属于用户运行程序的线程;也就是JVM实例是进程级别,而执行引擎是线程级别的。)
一、JVM的生命周期
JVM实例的诞生:当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点,既然如此,那么JVM如何知道是运行class A的main而不是运行class B的main呢?这就需要显式的告诉JVM类名,也就是我们平时运行java程序命令的由来,如java classA hello world,这里java是告诉os运行Sun java 2 SDK的java虚拟机,而classA则指出了运行JVM所需要的类名。
JVM实例的运行:main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程。
JVM实例的消亡:当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。
二、JVM的体系结构
粗略分来,JVM的内部体系结构分为三部分,分别是:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。
下面将先介绍类装载器,然后是执行引擎,最后是运行时数据区
1,类装载器,顾名思义,就是用来装载.class文件的。JVM的两种类装载器包括:启动类装载器和用户自定义类装载器,启动类装载器是JVM实现的一部分,用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。(下面所述情况是针对Sun JDK1.2)
动类装载器:只在系统类(java API的类文件)的安装路径查找要装入的类
用户自定义类装载器:
系统类装载器:在JVM启动时创建,用来在CLASSPATH目录下查找要装入的类
其他用户自定义类装载器:这里有必要先说一下ClassLoader类的几个方法,了解它们对于了解自定义类装载器如何装载.class文件至关重要。
protected final Class defineClass(String name, byte data[], int offset, int length)
protected final Class defineClass(String name, byte data[], int offset, int length, ProtectionDomain protectionDomain);
protected final Class findSystemClass(String name)
protected final void resolveClass(Class c)
defineClass用来将二进制class文件(新类型)导入到方法区,也就是这里指的类是用户自定义的类(也
就是负责装载类)
findSystemClass通过类型的全限定名,先通过系统类装载器或者启动类装载器来装载,并返回
Class对象。
ResolveClass: 让类装载器进行连接动作(包括验证,分配内存初始化,将类型中的符号引用解析为
直接引用),这里涉及到java命名空间的问题,JVM保证被一个类装载器装载的类所引用的所有类都被这个类装载器装载,同一个类装载器装载的类之间可以相互访问,但是不同类装载器装载的类看不见对方,从而实现了有效的屏蔽。
2,执行引擎:它或者在执行字节码,或者执行本地方法
要说执行引擎,就不得不的指令集,每一条指令包含一个单字节的操作码,后面跟0个或者多个
操作数。
(一)指令集以栈为设计中心,而非以寄存器为中心
这种指令集设计如何满足Java体系的要求:
平台无关性:以栈为中心使得在只有很少register的机器上实现java更便利
compiler一般采用stack向连接优化器传递编译的中间结果,若指令集以stack为基础,则有利于运行
时进行的优化工作与执行即时编译或者自适应优化的执行引擎结合,通俗的说就是使编译和运行用的数据结构统一,更有利于优化的开展。
网络移动性:class文件的紧凑性。
安全性:指令集中绝大部分操作码都指明了操作的类型。(在装载的时候使用数据流分析期进行一
次性验证,而非在执行每条指令的时候进行验证,有利于提高执行速度)。
(二)执行技术
主要的执行技术有:解释,即时编译,自适应优化、芯片级直接执行
其中解释属于第一代JVM,即时编译JIT属于第二代JVM,自适应优化(目前Sun的HotspotJVM
采用这种技术)则吸取第一代JVM和第二代JVM的经验,采用两者结合的方式
自适应优化:开始对所有的代码都采取解释执行的方式,并监视代码执行情况,然后对那些经常调
用的方法启动一个后台线程,将其编译为本地代码,并进行仔细优化。若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。
3,运行时数据区:主要包括:方法区,堆,java栈,PC寄存器,本地方法栈
(1)方法区和堆由所有线程共享
堆:存放所有程序在运行时创建的对象
方法区:当JVM的类装载器加载.class文件,并进行解析,把解析的类型信息放入方法区。
(2)Java栈和PC寄存器由线程独享,在新线程创建时间里
(3)本地方法栈: 存储本地方法调用的状态
上边总体介绍了运行时数据区的主要内容,下边进行详细介绍,要介绍数据区,就不得不说明JVM
中的数据类型。
JVM中的数据类型:JVM中基本的数据单元是word,而word的长度由JVM具体的实现者来决定
数据类型包括基本类型和引用类型,(1)基本类型包括:数值类型(包括除boolean外的所有的java基本数据类型),boolean(在JVM中使
用int来表示,0表示false,其他int值均表示true)和returnAddress(JVM的内部类型,用来实现
finally子句)。
(2)引用类型包括:数组类型,类类型,接口类型
前边讲述了JVM中数据的表示,下面让我们输入到JVM的数据区
首先来看方法区:
上边已经提到,方法区主要用来存储JVM从class文件中提取的类型信息,那么类型信息是如何存储的呢?众所周知,Java使用的是大端序(big—endian:即低字节的数据存储在高位内存上,如对于1234,12是高位数据,34为低位数据,则java中的存储格式应该为12存在内存的低地址,34存在内存的高地址,x86中的存储格式与之相反)来存储数据,这实际上是在class文件中数据的存储格式,但是当数据倒入到方法区中时,JVM可以以任何方式来存储它。
类型信息:包括class的全限定名,class的直接父类,类类型还是接口类型,类的修饰符(public,等),所有直接父接口的列表,Class对象提供了访问这些信息的窗口(可通过Class.forName(“”)或instance.getClass()获得),下面是Class的方法,相信大家看了会恍然大悟,(原来如此)
getName(), getSuperClass(), isInterface(), getInterfaces(), getClassLoader();
static变量作为类型信息的一部分保存
指向ClassLoader类的引用:在动态连接时装载该类中引用的其他类
指向Class类的引用:必然的,上边已述
该类型的常量池:包括直接常量(String,integer和float point常量)以及对其他类型、字段和方法的符号引用(注意:这里的常量池并不是普通意义上的存储常量的地方,这些符号引用可能是我们在编程中所接触到的变量),由于这些符号引用,使得常量池成为java程序动态连接中至关重要的部分
字段信息:普通意义上的类型中声明的字段
方法信息:类型中各个方法的信息
编译期常量:指用final声明或者用编译时已知的值初始化的类变量
class将所有的常量复制至其常量池或者其字节码流中。
方法表:一个数组,包括所有它的实例可能调用的实例方法的直接引用(包括从父类中继承来的)除此之外,若某个类不是抽象和本地的,还要保存方法的字节码,操作数栈和该方法的栈帧,异常表。举例:
class Lava{
private int speed = 5;
void flow(){}
}
class Volcano{
public static void main(String[] args){
Lava lava = new Lava();
lava.flow();
}
}
运行命令java Volcano;
(1)JVM找到Volcano.class倒入,并提取相应的类型信息到方法区。通过执行方法区中的字节码,JVM
执行main()方法,(执行时会一直保存指向Vocano类的常量池的指针)
(2)Main()中第一条指令告诉JVM需为列在常量池第一项的类分配内存(此处再次说明了常量池并非
只存储常量信息),然后JVM找到常量池的第一项,发现是对Lava类的符号引用,则检查方法区,看Lava类是否装载,结果是还未装载,则查找“Lava.class”,将类型信息写入方法区,并将方法区Lava类信息的指针来替换Volcano原常量池中的符号引用,即用直接引用来替换符号引用。
(3)JVM看到new关键字,准备为Lava分配内存,根据Volcano的常量池的第一项找到Lava在方法区的位置,并分析需要多少对空间,确定后,在堆上分配空间,并将speed变量初始为0,并将lava对象的引用压到栈中
(4)调用lava的flow()方法
好了,大致了解了方法区的内容后,让我们来看看堆
java对象的堆实现:
java对象主要由实例变量(包括自己所属的类和其父类声明的)以及指向方法区中类数据的指针,指向方法表的指针,对象锁(非必需),等待集合(非必需),GC相关的数据(非必需)(主要视GC算法而定,如对于标记并清除算法,需要标记对象是否被引用,以及是否已调用finalize()方法)。
那么为什么java对象中要有指向类数据的指针呢?我们从几个方面来考虑
首先:当程序中将一个对象引用转为另一个类型时,如何检查转换是否允许?需用到类数据
其次:动态绑定时,并不是需要引用类型,而是需要运行时类型,这里的迷惑是:为什么类数据中保存的是实际类型,而非引用类型?这个问题先留下来,我想在后续的读书笔记中应该能明白
指向方法表的指针:这里和C++的VTBL是类似的,有利于提高方法调用的效率
对象锁:用来实现多个线程对共享数据的互斥访问
等待集合:用来让多个线程为完成共同目标而协调功过。(注意Object类中的wait(),notify(),notifyAll()方法)。
Java数组的堆实现:数组也拥有一个和他们的类相关联的Class实例,具有相同dimension和type的数组是同一个类的实例。数组类名的表示:如[[Ljava/lang/Object 表示Object[][],[I表示int[],[[[B表示byte[][][]
至此,堆已大致介绍完毕,下面来介绍程序计数器和java栈
程序计数器:为每个线程独有,在线程启动时创建,若thread执行java方法,则PC保存下一条执行指令的地址。
若thread执行native方法,则Pc的值为undefined
Java栈:java栈以帧为单位保存线程的运行状态,java栈只有两种操作,帧的压栈和出栈。
每个帧代表一个方法,java方法有两种返回方式,return和抛出异常,两种方式都会导致该方法对应的帧出栈和释放内存。
帧的组成:局部变量区(包括方法参数和局部变量,对于instance方法,还要首先保存this类型,其中方法参数按照声明顺序严格放置,局部变量可以任意放置),操作数栈,帧数据区(用来帮助支持常量池的解析,正常方法返回和异常处理)。
篇7:java开发读书笔记
通过阅读《创新思维与创造力开发》,感受很深。阅读后从中认识到: 第一:创新思维培养是创造力开发的前提。
创新思维是一个重要的前提。创新思维是创新实践,是创造力发挥的前提。思路决定出路,格局决定结局,思维、思路,思路决定出路。所以我们说,创新思维是创造性实践的前提,是创造力发挥的前提。重塑思维的习惯,创新领域:实物创新、对策创新、制度创新、理论创新、心态创新、换一种思路达成目标。第二:创新思维是人类思维中最美的花朵。
创新思维的鲜明特点,创新思维具有的独特过程,创新思维是事业发展的关键,突破思维定式,提升创新思维能力,努力开拓思维的新境界,第四:创新思维能力的培养。
1、破除创新思维枷锁,思维枷锁:从众定势、经验定势、权威定势、书本定势、情感定势。
2、拓展创新思维的视角,思维视角:逆向视角、换位视角、多思维视角。
3、激发创新潜能的方法,激发潜能的方法:良性暗示、头脑风暴、快乐心灵。第五:创新思维是竞争的法宝。
创新思维是我们一个单位、一个地区、一个国家竞争的法宝。今天的社会是竞争的社会,靠什么竞争,靠特色、靠创新、靠点子、靠思路。我们今天企业的竞争也好,我们很多竞争也好,创新思维它是个法宝。
第六:创新思维是育人和工作的的保证。
1、创新思维对我们培养人,培养人才,培养高素质的人才非常有重要性。创新思维不够的,我们非常缺乏的是创新性的创造力发挥的这样的人才。创造力发挥方面下工夫。
相关文章:
参加法治实践活动感想202001-20
Java开发01-20
小学名著竞赛01-20
JAVA语言在计算机软件开发中的应用01-20
java开发笔试题大全01-20
成果导向教学模式下《安卓技术与应用》课程大纲的撰写01-20
java开发工程师01-20
java各种开发框架总结01-20
基于JAVA的数据库开发和应用01-20