我来解释一下吧,我不知道你的水平,所以可能讲的比较罗嗦了点,希望你能有所收获:
1 java程序的运行原理和编译执行一个java程序的步骤:
java程序是通过java虚拟机解释,将其中的代码(字节码)翻译为具体的操作指令来执行的。
假设要编译并执行位于d:\javademo目录中的Test.java:
一、首先设置classpath和path环境变量: 在我的电脑上点右键 > 属性 > 高级 > 环境变量 > 上面一半的部分是当前用户的环境变量,只对当前用户适用,用其它用户登录后就变为另一个用户的环境变量内容了。下面一半是整个系统的环境变量,对电脑中的每个用户都适用。建议设置系统的环境变量 > 新建 > 变量名填classpath,变量值填一个英文句号(.),注意要是英文的句号 > 确定 > 设置path变量,path变量是已经存在的,我们只要找到该变量名(这里名称是大小写无关的,PATH、path、Path,只要找到就行),双击它或点击它之后点编辑按钮 > 在变量值一栏中的最前面(注意不要将原先的值删掉)加上你的java安装目录下的bin目录的路径,然后加一个英文分号。如你的java安装路径是c:\java,那么这里要加上“c:\java\jdkxxx\bin;(这后面是原先的值)”(这里的jdkxxx会因为你安装的版本不同而不同,所以你要自己查一下) > 完成之后一直点确定就行了
这里讲一下环境变量的作用:环境变量又叫系统变量,和我们程序中的变量类似,是储存一些系统运行期间经常用到的值的,操作系统或应用程序如果需要用到环境变量,它可以根据环境变量的变量名(如刚才定义的classpath)来查找对应的值(如刚才的英文句号)。
那classpath到底是干嘛的呢?它是给java虚拟机用的,当我们需要运行一个java程序时,java虚拟机查找classpath变量的值,根据这些值定位java程序所在的位置,刚才定义的英文句号的意思是命令行所处的当前目录,下面例子中会详细讲到。
(以上的环境变量只要设置一次,以后再编译或运行java程序时就不用再重复设置了)
二、然后打开命令行:开始菜单 > 运行 > 输入cmd后确定
将目录切换到java文件所在的位置,输入以下命令(输入一行命令按一次回车键):
d:
cd javademo
解释:
d: 的作用是切换盘符
cd javademo 的作用是切换目录,该目录只能在当前盘符下进行目录切换,如果在c盘下输入cd d:\javademo是没有效果的,必须先将盘符切换到d盘。该命令可以一次切换多层目录,如在d盘根目录下要切换到d:\a\b\c目录下,可以写cd a\b\c,就几层写几层就行了。
三、编译java程序
经过前一步,当前目录已经是Test.java所在的目录了,因此我们输入以下命令编译:
javac Test.java
这一步命令是大小写无关的,因此也可以输入javac test.java。但注意,文件本身的文件名是大小写有关的,只是输入这个命令的时候可以忽略它的大小写(见第五步)。
四、执行java程序
第三步编译后会生成一个Test.class文件,输入以下命令载入这个文件并执行它:
java Test
注意,这一步Test是大小写相关的,并且不能加.class后缀,因此不能写成java test 或 java Test.class
五、补充,下面是Test.java的一个样本,可以直接拿来做实验:
import javax.swing.JOptionPane;
public class Test
{
public static void main(String[] args)
{
JOptionPane.showDialogMessage(null, "如果你见到这个,就说明你已经成功了");
System.exit(0);
}
}
说明:这个程序定义了一个公有类叫Test,因此它的文件名必须叫Test.java,包括大小写。如果你改变了类的名字,那么文件名也必须跟着改变。
2.类和对象的关系:
其实只要明白一点:类是我们预先定义好的,它就像一个模板,对象由这个模板来创建,因此由一个类可以“复制”出任意多个对象。
举一个直观点了例子,类就好像印刷时用的模板,每一次印刷都会产生一件印刷品(报纸、书、宣传单等等)。模板本身并不太能胜任“给人看”这样一个任务,首先因为它太重,其次因为它的字是反的。类也一样,我们一般不直接用类来完成一件事情,而是先由它生成一个对象,由对象来执行具体的任务。
3.构造方法又叫构造函数,它的任务是创建它所在类的对象。一个类必须至少有一个构造方法,否则这个类无法创建对象(因此也就没用了)。所以如果我们没有在类中自己定义构造方法,编译器会给我们添加一个(这就保证了任何一个类都能产生对象)。
4.方法重载:
举个例子,你想编写一个方法(或叫函数),它返回传入的两个参数中较大的那个,在c中(c不支持方法重载)你可以这样写:
int larger(int x, int y)
{
if (x>=y)
{
return x;
}
else
{
return y;
}
}
但问题是,这个方法只能完成两个整数的比较,如果我还想传入两个浮点数并返回其中的较大者,在c中只能另外定义一个不同名称的函数,因为两个函数的名称相同在c中是不允许的。
而java中可以利用方法重载方便的解决这个问题,这个double型的方法可以这样写:
double larger(double x, double y)
{
....
}
虽然定义了两个都叫larger的方法,但由于参数的类型不同,所以它们是不同的方法。但是这种不同对使用这个方法的人来说是透明的,也就是说,任何人都可以这样调用:
larger(a, b);
不管a和b是整型或double型,java虚拟机都能够从所有重载的方法中正确选择一个合适的方法来执行。
而在c中,由于不能进行方法重载,编写方法的人必须定义不同的名称来完成相似的功能,例如上面例子中两个方法可能分别叫做intLarger和dblLarger,这样使用方法的人也必须根据参数的不同选择一个方法去调用。
其他的都差不多,关键是第2个问题,有点绕人:我来举个例子仔细的说明一下:
String x1 = "abc"; -->1
String x2 = new String("abc");-->2
-->1 的过程:首先创建一个叫x1的引用变量,然后再栈区中查找有没有叫"abc"的对象,如果有直接另x1指向"abc",如果没有,则创建一个名称为"abc"的对象并x1指向"abc",这时如果你再创建一个String x3 = "abc",在这里就不会创建"abc"对象了,直接就是x3指向"abc",x1和x3指向的是同一个对象,他们的内存地址是一样的,System.out.println(x1==x2)//true
因为栈区中有个叫 字符串常量池 的一小块内存。它的好处是所有名称相同的字符串常量都只占用一份内存空间
-->2的过程:
String x2 = new String("abc");其实是创建了2个对象,一个是x2位于栈区,一个是new出来的String类型的"abc"位于堆区,这里的"abc"本身就是String pool中的一个对象,当你new String("abc")时,会把pool中的对象复制一份放到堆区中,并把堆中的这个"abc"对象的应用交给x2。
不知道这样解释对不对,但是应该是这样的吧,如果有什么地方理解不正确,欢迎各位指点啊,呵呵。
____先说一下平台,Java程序需要在Java运行平台(有三个:J2SE即Java标准版,J2EE即Java企业版,J2ME即Java微型版)上运行,通常我们用的是J2SE或者是J2EE,J2ME一般用于手机掌上电脑等单片机系统。
____运行原理:Java平台的JVM(即Java虚拟机)把Java程序(即*.java文件)编译后形成的字节码文件(可以理解为机器码即二进制码,后缀为.class)加载到系统内存,然后以解释的方式来执行一条一条的语句,即根据相应硬件的机器指令翻译一句执行一句。我们运行Java程序时一般先用"javac *.java"命令来编译,然后用"java *"来运行程序。
____关于类和对象:类是组成Java程序的基本单元,一个完整的Java程序就是有一个Public类和一般类构成。类里面封装了变量和方法,或者说是由成员变量和成员方法构成。定义一个类相当于定义了一类事物的特性,比如定义人有名字,双手,双脚,有嘴,然后手可以拿东西,脚可以走路,嘴可以说话一样。对象则相当于类的一个实体,比如我声明一个人,他叫小明,他有这个类的所有属性,有名字,手,脚,他还有这个类的所有方法,他可以拿东西,走路,说话。
____关于“String x = new String(“abc”);”:"String"是Java类库中的一种类,"String(“****”)"则是这个类的构造方法,这个语句的作用是声明一个String类型的对象,并为它初始化。假如我有一个类class A{....}那么声明这个类的对象的方式是:A a=new A();
____构造方法一般用作初始化,调用构造方法声明对象的同时就为该对象分配了内存空间。构造方法是一种特殊的方法,它的名字必须和它所在的类的名字相同,并且不能返回任何数据类型,即void型,但void必须省略不写,也就是说不必为这个方法写类型。而且一个类可以有多个构造方法,但这些构造方法的参数个数或类型必须不同。举例如下:
class A{
int ni,wo;
A(){//构造方法1,无参数
System.out.println("Hello world!");
}
A(int a,int b){//构造方法2,有两个参数,用于初始化
this.ni=a;
this.wo=b;
}
......
}
____关于方法重载:方法重载是Java多态特性的一种,是指一个类中可以有多个同名的方法,从而实现多种功能。但是这个方法的参数个数或者类型必须不同。举例如下:
class B{//此类省略了构造方法,但是系统在编译时会自动为其添加构造方法
int ni,wo;
int JiSuan(int a){
return a*a;
}
int JiSuan(int a,int b){//重载1
return a*b;
}
float JiSuan(int a,float b){//重载2
return a*b
}
}
楼上的二题说的不是很明白
你们要是怎么说的话 对编程理解的还不够透彻
第二题补充下:
可以说类是 对象的集合或者抽象
对象是类的实例
对象是唯一的,不会重复
对象可以调用类属性
类不可调用对象属性
String 该对象类型
x 句柄 指向你所声明的对象所在的内存地址
new 声明一个新的对象
String("abc") String类的构造方法,并在里面赋上属性值
这样说才对 new String("abc") 是创建一个对象;
不是x是对象 他只是个句柄(或者引用?) 指向内存那个对象的所在地址
1,java编译时,首先由编译程序生成一个中间代码,在执行时,由解释程序解释那个中间代码。解释一句,执行一句,然后解释下一句。
2,类和对象的关系 好比 汽车 和 奥迪汽车的关系。对象是类的实例话。
3,构造方法是跟类名相同的方法,由于初始化属性。
4,方法重载允许方法具有相同的方法名,但是方法的参数或返回类型不能都相同。
讲的都还可以。。。
有收获。。