图片中,如果我变成回忆调用v.getClass(),那么它代表哪个类的Class对象?看过java核心技术

4989人阅读
一、java的版本区别
&& & 常用的 java 程序分为&&Java SE、Java EE、Java ME三个版本,介绍如下:
1. Java SE(Java Platform,Standard Edition)
Java SE 以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE是基础包,但是也包含了支持 Java Web 服务开发的类,并为&Java Platform,Enterprise Edition(Java EE)提供基础。
2. Java EE(Java Platform,Enterprise Edition)。
&& & & &这个版本以前称为&J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web&服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0&应用程序。
3. Java ME(Java Platform,Micro Edition)。
这个版本以前称为 J2ME。Java ME&为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME&包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME&规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。
说得更简单片面一点:
Java SE 是做电脑上运行的软件。Java EE 是用来做网站的-(我们常见的JSP技术)Java ME 是做手机软件的。
二、学习JAVA从哪开始?
或者我们可以说,需要先学习那个java版本?
有道是“万丈高楼平地起”,通过上面的介绍我们就可以知道,学习java编程,无论想从事哪个方面的程序开发,必须要把基础打好,因此,学习java应该从 java se开始学习。
三、java的下载
日,java的下载地址如下,随着时间的改变,下载地址会有所变化,可以直接上网搜索一下。
java se下载地址
/technetwork/java/javase/downloads/index.html
java ee下载地址
/technetwork/java/javaee/downloads/index.html
Java Platform (JDK) 7u5
JavaFX 2.1.1
JDK 7u5 + NetBeans
JDK 7u3 + Java EE
以下载 java se为例,在页面中可以看到如上的图例区域,学习 java se 可以直接下载 &“javava Platform (JDK) 7u5&”,这是当前日期的最新版本。如果想要利用IDE 开发java程序 ,可以直接下载&JDK 7u5 + NetBeans &版本 ,如果想要下载 java ee 的最新版本,直接下载&JDK 7u3 + Java EE &即可。
&& & & 单击对于的图片进行下载时,需要根据不同的系统选择对于的java版本,注意下载前需要选择“Accept License Agreement&”单选框。
Product / File Description
&Linux x86
&Linux x86
&Linux x64
64.93 MB&&
&Linux x64
77.67 MB&&
&Macosx-x64
&Solaris x86
137.41 MB&&
&Solaris x86
82.01 MB&&
&Solaris SPARC
140.43 MB&&
&Solaris SPARC
86.72 MB&&
&Solaris SPARC 64-bit
16.45 MB&&
&Solaris SPARC 64-bit
12.55 MB&&
&Solaris x64
14.92 MB&&
&Solaris x64
&Windows x86
87.95 MB&&
&Windows x64
92.36 MB&&
各个系统中,最后的参数 “x86”,表示是32位系统,“x64”表示64位系统,比如 windows xp 32位系统,就选择 “Windows x86 ” 那一栏的程序下载即可。
四、java的安装于配置
这里以全部选择默认选项进行安装为例进行讲解。程序的默认安装路径为“C:\Program Files\Java\jdk1.7.0_05”,默认安装完成后,需要进行配置,配置方法如下:
首先右键点我的电脑。打开属性。然后选择“高级”里面的“环境变量”,在新的打开界面中的系统变量需要设置三个属性“JAVA_HOME”、“path”、“classpath”,其中在没安装过jdk的环境下。path属性是可能存在的(安装过其它软件可能会自动增加,如暴风影音,)。而JAVA_HOME和classpath是不存在的。
一:点“新建”,然后在变量名写上JAVA_HOME,顾名其意该变量的含义就是java的安装路径,然后在变量值写入刚才安装的路径“C:\ProgramFiles\Java\jdk1.7.0_05”。
二:其次在系统变量里面找到path,没有就新建,然后点编辑,path变量的含义就是系统在任何路径下都可以识别java命令,则变量值为“.;%JAVA_HOME%\”,(其中“%JAVA_HOME%”的意思为刚才设置JAVA_HOME的值),也可以直接写上“C:\ProgramFiles\Java\jdk1.7.0\”
三: 最后再点“新建”,然后在变量名上写classpath,该变量的含义是为java加载类(class or lib)路径,只有类在classpath中,java命令才能识别。其值为“.;%JAVA_HOME%\lib\dt.%JAVA_HOME%\lib\toos.(要加.表示当前路径)”,与相同“%JAVA_HOME%有相同意思”
注意:配置变量时所有字符均是半角字符,即英文输入法状态下进行输入,注意不要漏了分号和实心的点。否则就容易造成配置不正确
以上三个变量设置完毕,则按“确定”直至属性窗口消失,下来是验证看看安装是否成功。
1、先打开“开始”-& “运行”,打入“cmd”,进入dos系统界面。然后打“java -version”,按下回车键,如果安装成功。系统会显示java version jdk&1.7.0_05&的字样。
2、然后在dos界面中输入javac,按下回车键,来查看该命令是否合法,如果出现如果行有个参数的解释,则命令配置成功。如果不成功会弹出“不是有效的命令”等字样提示。
3、同样输入java来查看该命令是否合法,如果出现如果行有个参数的解释,则命令配置成功。
这样环境变量就设置好了,下面进行对PATH,CLASSPTH,JAVA_HOME的讲解
以下为置JAVA_HOME,CLASSPATH,PATH的目的:
1,设置JAVA_HOME:
一、为了方便引用,比如,你JDK安装在C:\ProgramFiles\Java\jdk1.7.0目录里,则设置JAVA_HOME为该目录路径, 那么以后你要使用这个路径的时候, 只需输入%JAVA_HOME%即可,?避免每次引用都输入很长的路径串;
二、归一原则, 当你JDK路径被迫改变的时候, 你仅需更改JAVA_HOME的变量值即可, 否则,你就要更改任何用绝对路径引用JDK目录的文档, 要是万一你没有改全, 某个程序找不到JDK, 后果是可想而知的----系统崩溃!
三、第三方软件会引用约定好的JAVA_HOME变量, 不然, 你将不能正常使用该软件, 以后用JAVA久了就会知道, 要是某个软件不能正常使用, 不妨想想是不是这个问题.
2,设置CLASSPATH:
这是一个很有趣,当然也比较折磨初学者的问题, 这个变量设置的目的是为了程序能找到相应的&.class&文件, 不妨举个例子: 你编译一个JAVA程序---A.java, 会得到一个A.class的类文件,你在当前目录下执行java A, 将会得到相应的结果(前提是你已经设置CLASSPATH为&.&). 现在, 你把A.class移到别的目录下(例如:&e:\&), 执行java
A, 将会有NoClassDefFindError的异常,原因就是找不到.class文件, 现在你把CLASSPATH增加为:&.;e:\&再在任何目录下运行java A, 看看会有什么结果~~:)~~~,一切正常, java命令通过CLASSPATH找到了.class文件!
3,设置PATH:
道理很简单, 你想在任何时候都使用%JAVA_HOME%\bin\java等来执行java命令吗, 当然不会, 于是, 你可以选择把%JAVA_HOME%\bin添加到PATH路径下, 这样, 我们在任何路径下就可以仅用java来执行命令了
.(当你在命令提示符窗口输入你个代码时,操作系统会在当前目录和PATH变量目录里查找相应的应用程序,并且执行.)
五、JRE和JDK的区别
在安装程序时,如果留意你会发现安装了 JRE、和JDK,这两个概念一定要搞清楚。
JRE(Java Runtime Environment,Java运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。是Sun的产品,包括两部分:JavaRuntimeEnvironment和JavaPlug-inJavaRuntimeEnvironment(JRE)是可以在其上运行、测试和传输应用程序的Java平台。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具——编译器、调试器和其它工具。JRE需要辅助软件——JavaPlug-in——以便在浏览器中运行applet.J2RE是Java2
RuntimeEnvironment,即Java运行环境,有时简称JRE.如果你只需要运行Java程序或Applet,下载并安装它即可。如果你要自行开发 Java软件,请下载JDK.在JDK中附带有JRE.注意由于Microsoft对Java的支持不完全,请不要使用IE自带的虚拟机来运行 Applet,务必安装一个JRE或JDK.&
JDK 是整个Java的核心,包括了Java运行环境(Java RuntimeEnvirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK.最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java
Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比SunJDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。
& 作为JDK实用程序,工具库中有七种主要程序。
&&Javac:Java编译器,将Java源代码转换成字节码。
&&Java:Java解释器,直接从类文件执行Java应用程序字节代码。
&&appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
&&Javadoc:根据Java源码及说明语句生成HTML文档。
&&Jdb:Java调试器,可以逐行执行程序,设置断点和检查变量。
&&Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。
&&Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
六、java的运行机制
JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。
1.为什么要使用Java虚拟机
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
Java运行机制
Java程序的运行必须经过编写、编译、运行三个步骤。
编写是指在Java开发环境中进行程序代码的输入,最终形成后缀名为.java的Java源文件。
编译是指使用Java编译器对源文件进行错误排查的过程,编译后将生成后缀名为.class的字节码文件,这不像C语言那样最终生成可执行文件。
运行是指使用Java解释器将字节码文件翻译成机器代码,执行并显示结果。这一过程如图1.1所示。
字节码文件是一种和任何具体机器环境及操作系统环境无关的中间代码,它是一种二进制文件,是Java源文件由Java编译器编译后生成的目标代码文件。编程人员和计算机都无法直接读懂字节码文件,它必须由专用的Java解释器来解释执行,因此Java是一种在编译基础上进行解释运行的语言。
Java解释器负责将字节码文件翻译成具体硬件环境和操作系统平台下的机器代码,以便执行。因此Java程序不能直接运行在现有的操作系统平台上,它必须运行在被称为Java虚拟机的软件平台之上。
Java虚拟机(JVM)是运行Java程序的软件环境,Java解释器就是Java虚拟机的一部分。在运行Java程序时,首先会启动JVM,然后由它来负责解释执行Java的字节码,并且Java字节码只能运行于JVM之上。这样利用JVM就可以把Java字节码程序和具体的硬件平台以及操作系统环境分隔开来,只要在不同的计算机上安装了针对于特定具体平台的JVM,Java程序就可以运行,而不用考虑当前具体的硬件平台及操作系统环境,也不用考虑字节码文件是在何种平台上生成的。JVM把这种不同软硬件平台的具体差别隐藏起来,从而实现了真正的二进制代码级的跨平台移植。JVM是Java平台无关的基础,Java的跨平台特性正是通过在JVM中运行Java程序实现的。Java的这种运行机制可以通过图1.2说明。
Java语言这种“一次编写,到处运行(write once,run anywhere)”的方式,有效地解决了目前大多数高级程序设计语言需要针对不同系统来编译产生不同机器代码的问题,即硬件环境和操作平台的异构问题,大大降低了程序开发、维护和管理的开销。
需要注意的是,Java程序通过JVM可以达到跨平台特性,但JVM是不跨平台的。也就是说,不同操作系统之上的JVM是不同的,Windows平台之上的JVM不能用在Linux上面,反之亦然。
我们可以通过helloworld来理解这几个缩写词的具体含义:
public class HelloWorld { public static void main(String[] args) { System.out.println(&helloworld&); }}
编译之后, 我们得到了HelloWorld.class(图中的&Your program's class files&)
在HelloWorld里面, 我们调用了 JAVA API中的 java.lang.System这个类的静态成员对象 out, out 的静态方法: public static void println(String string);
然后我们让虚拟机器来执行这个HelloWorld。
1. 虚拟机会在classpath中找到HelloWorld.class。
2. 虚拟机中的解释器(interpret)会把HelloWorld.class解释成字节码。
3. 把解释后的字节码交由execution engin执行。
4. execution engin会调用native method(即平台相关的字节码)来在host system的stdout(显示器)的指定部分打印出指定的字符串。
5. 这样, 我们就看到&helloworld&字样了。
有了这个流程后, 我们就好理解上面几个术语了:
a. JDK: java develop kit (JAVA API包)
b. SDK: software develop kit, 以前JDK 叫做java software develop kit, 后来出了1.2版本后, 就改名叫jdk了, 省时省力, 节约成本。
c. JRE. java runtime environment 我们的helloworld必须在JRE(JAVA运行环境,JAVA运行环境又叫JAVA平台)里面, 才能跑起来。 所以, 显然地, JRE其实就是JDK + JVM
d. JVM java virtual machine. 简单地讲, 就是把class文件变成字节码, 然后送到excution engin中执行。而为什么叫虚拟机, 而不叫真实机呢? 因为JVM本身是又不能运算, 又不能让显示器显示&helloworld&的, 它只能再调用host system的API, 比如在w32里面就会调c++的API, 来让CPU帮他做做算术运算,来调用c++里面的API来控制显示器显示显示字符串。
而这些API不是JDK里面有的,我们平时又看不见的,所以我们就叫它native api了(亦曰私房XX)。
e. 解释平台无关。 有人会说, 在linux的里面调用native api与w32里面调用的api肯定不一样吧? 那为什么说JAVA是平台无关的呢?
其实是这样的, 君不见里面又有jdk-for-w32又有jdk-for-linux下载吗? 刚才不是说了吗? native api, native api, 就是我们平时看不见的api吗! 调用native这些烦琐的活儿都让jdk去做了。所以我们调用的时候只用知道jdk(java api) 里面的java.io.*能提供磁盘访问功能, java.awt.* 能画个框框画个圆圆就行了吗。 至于JDK又是怎么调用的,
在LINXU上更圆呢? 还是在W32上更圆,(x) 这个就是JDK个人的事情了。(理论上讲是一样圆的, 当然这又和显示器是否纯平相关了:D)
同时, 这里就引申出了另一个话题。既如何编写平台无关的JAVA程序。 其中关键的一条, 就是调用且只调用jdk中的API, 而不要私自调用native api。 原因很简单啊, JDK-for-linux和JDK-for-w32表面都是一样的,所以我在w32里面调用JDK写的java程序,在linux里面也会一样的写法啊, 所以就可以移植来移植去都没问题。(b) 但是如果我在w32里面调用了
一个图形显示的native api, 当我移植到linux去的时候, 谁又能保证里面也有相同名称,相同参数,相同返回值, 相同功能的native api供我调用呢!(?)
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:142015次
积分:1693
积分:1693
排名:第9273名
原创:32篇
转载:23篇
评论:25条
(1)(1)(1)(2)(30)(10)(5)(5)谁知道VC++通过JNI调用JAVA类过程中,FindClass为什么总是找不到?
[问题点数:100分,结帖人priscill]
谁知道VC++通过JNI调用JAVA类过程中,FindClass为什么总是找不到?
[问题点数:100分,结帖人priscill]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。Java 中类的加载顺序
这其实是去年校招时我遇到的一道阿里巴巴的笔试题(承认有点久远了-。-),嗯,如果我没记错的话,当时是作为方向的一道选做大题。当然题意没有这么直白,题目只要求你写出程序运行后所有System.out.println的输出结果,其中程序是题目给的,而各个System.out.println的执行顺序不同会导致最后程序输出的结果也不同。
具体的题目我肯定记不清,不过我们可以换个直接的问法,如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序是什么?
当时我也是一头雾水,事后我就自己写了一个小Demo,这才知道了类内部的实际加载顺,测试代码如下:
public class B{
//静态变量 &
static int i=1;
//静态语句块
& & System.out.println(&Class B1:static blocks&+i);
//非静态变量
//静态语句块
& & System.out.println(&Class B2:static blocks&+i);
//构造函数
public B(){
& & System.out.println(&constructor B: &+&i=&+i+&,j=&+j);
//非静态语句块
& & System.out.println(&Class B:common blocks&+&i=&+i+&,j=&+j);
//非静态方法
public void bDisplay(){
& & System.out.println(&Class B:static void bDisplay(): &+&i=&+i+&,j=&+j);
//静态方法
public static void bTest(){
& & System.out.println(&Class B:static void bTest(): & &&+&i=&+i);
public class A extends B{
//静态变量 &
static int i=1;
//静态语句块
& & System.out.println(&Class A1:static blocks&+i);
//非静态变量
//静态语句块
& & System.out.println(&Class A2:static blocks&+i);
//构造函数
public A(){
& & super();
& & System.out.println(&constructor A: &+&i=&+i+&,j=&+j);
//非静态语句块
& & System.out.println(&Class A:common blocks&+&i=&+i+&,j=&+j);
//非静态方法
public void aDisplay(){
& & System.out.println(&Class A:static void aDisplay(): &+&i=&+i+&,j=&+j);
//静态方法
public static void aTest(){
& & System.out.println(&Class A:static void aTest(): & &&+&i=&+i);
Class ClassLoading :
public class ClassLoading {
& & public static void main (String args[]) {
& & & & A a=new A();
& & & & a.aDisplay();
程序运行结果如图: enter image description here
通过上述示图,我们可以比较清晰的看出java类的整个加载过程。
若要加载类A,则先加载执行其父类B(Object)的静态变量以及静态语句块(执行先后顺序按排列的先后顺序)。
然后再加载执行类A的静态变量以及静态语句块。(并且1、2步骤只会执行1次)
若需实例化类A,则先调用其父类B的构造函数,并且在调用其父类B的构造函数前,依次先调用父类B中的非静态变量及非静态语句块.最后再调用父类B中的构造函数初始化。
然后再依次调用类A中的非静态变量及非静态语句块.最后调用A中的构造函数初始化。( 并且3、4步骤可以重复执行)
而对于静态方法和非静态方法都是被动调用,即不会自动调用执行,所以用户没有调用时都不执行,主要区别在于静态方法可以直接用类名直接调用(实例化对象也可以),而非静态方法只能先实例化对象后才能调用。
OK,今天就总结到这里了,如果有地方说的不好或有错误的地方,欢迎大家指出,定当改正,谢谢。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。在java世界中,所有的对象都直接或间接都是Object的子类,实例化一个类之前首先会实例化他的父类,那么如果我的app中有n个类,那么是不是有n个Object
[问题点数:40分,无满意结帖,结帖人stan]
在java世界中,所有的对象都直接或间接都是Object的子类,实例化一个类之前首先会实例化他的父类,那么如果我的app中有n个类,那么是不是有n个Object
[问题点数:40分,无满意结帖,结帖人stan]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 如果我爱你 电视剧 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信