Java学习 笔记

来源:互联网 发布:ubuntu ssh开机自启动 编辑:程序博客网 时间:2024/06/11 21:08
Java技术的架构包括三个方面: 
J2EE(Java 2 Platform Enterprise Edition )即企业版 ,是以企业为环境而开发应用程序的解决方案。 

J2SE(Java 2 Platform Stand Edition)即标准版,是桌面开发和低端商务应用的解决方案。 

J2ME(Java 2 Platform Micro Edition )即小型版,是致力于消费产品和嵌入式设备的最佳解决方案。 


J2EE目前已经成为开发商创建电子商务应用的事实标准。 
J2SE是Java 2平台的标准版, 它适用于桌面系统,提供CORBA标准的ORB技术,结合Java的RMI支持分布式互操作环境。 
J2ME提供了HTTP高级Internet协议,使移动电话能以Client/Server方式直接访问Internet
的全部信息,不同的Client访问不同的文件,此外还能访问本地存储区,提供最高效率的无线交

流。



同C语言编程一样,我们首先也要编写Java源程序,然后由Java编译程序将Java源程序编译为JVM可执行的代码,即Java字节码。Java源程序编译后生成的字节码文件就相当于C源程序编译后的Windows上的exe可执行文件,JVM虚拟机的作用类似Windows操作系统。

在Windows上运行的是exe文件,在JVM上运行的是Java字节码文件,也就是扩展名为.class的文件。 Windows执行exe可执行文件的过程,就是从exe文件中取出一条条的计算机指令,交给CPU去解释执行。

JVM执行Java字节码文件的过程,也是JVM虚拟机从Java字节码文件中取出一条条的字节码指令交给“CPU”去执行。硬件与软件是可以相互转化的,我们可以用视霸卡硬件解码VCD数据,也可以用超级解霸软件解码VCD数据。执行Java字节码的“CPU”可以是硬件,也可以是某个系统上运行的一个软件,这个软件称为Java字节码解释程序(也就是Java虚拟机)。 

可见,只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当前,并不是在所有的平台下都有相应的Java解释器程序,这也是Java并不是在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。 顺便来一句:Java兼顾解释性与编译性语言的特点,.java源文件转换成.class字节码文件的过程是编译型的,.class在操作系统上运行的过程则是解释型的,Java虚拟机充当了解释器的作用。


Sun公司提供了自己的一套Java开发环境,通常称之为JDK(Java Development Kit)。Sun 公司提供了多种操作系统下的JDK,随着时间的推移和技术的进步,JDK的版本也在不断地升级。

JRE:JVM(java虚拟机)+类库。

JDK:JRE+Java开发工具

JDK安装目录下:javac.exe是Java源文件的编译工具,Java源文件的扩展名为.java,如Test.java,Java源文件被编译后的Java字节码文件的扩展名为.class,如Test.class。 java.exe是Java字节码解释程序,负责解释执行Java字节码文件,就是一个JVM。


对象的比较:

有两种方式可用于对象间的比较,它们是“==”运算符与equals()方法,“==”操作符用于比较两个变量的值是否相等,equals()方法用于比较两个对象的内容是否一致。我们在前面讲过“==”操作符用于基本数据类型的变量比较的情况,非常简单和容易理解。如果一个变量是用作指向一个数组或一个对象的句柄,那么这个变量的类型就是引用数据类型,“==”操作符用于比较两个引用数据类型变量的情况,对初学者来说,很容易造成一些混淆,我们来看看下面的程序代码:

class Compare {   public static void main(String[] args)   {         String str1 = new String("abc");         String str2 = new String("abc");         String str3 = str1;         if(str1==str2)          System.out.println("str1==str2");         else          System.out.println("str1!=str2");          if(str1==str3)          System.out.println("str1==str3");         else          System.out.println("str1!=str3");    } } 
程序运行结果是:
str1!=str2
str1==str3
str1和str2分别指向了两个新创建的String类对象,尽管创建的两个String实例对象看上去是一模一样,但他们是两个彼此独立的对象,是两个占据不同内存空间地址的不同对象。str1和str2分别是这两个对象的句柄,也就是str1和str2的值分别是这两个对象的内存地址,显然他们的值是不相等的。将str1中的值直接赋给了str3,str1和str3的值当然是相等的。str1和str2就好比是一对双胞胎兄弟的名称,尽管这对双胞胎兄弟长相完全一模一样,但他们不是同一个人,所以,是不能等同的,str3就好比是为str1取的一个别名,str3和str1代表的是同一个人,所以,它们是相等的。这个过程如图3.7所示。

只要在脑子里想的是各个变量所对应的内存状态,就非常容易理解上面的结果了。 我们下面再来看看使用equals()方法的情况。 

class Compare {    public static void main(String[] args)    {           String str1 = new String("abc");           String str2 = new String("abc");           String str3 = str1;           if(str1.equals(str2))          System.out.println("str1 equal str2");         else          System.out.println("str1 not equal str2");          if(str1.equals(str3))          System.out.println("str1 equal str3");         else          System.out.println("str1 not equal str3");     } } 
程序运行结果是:
str1 equal str2
str1 equal str3

equals()方法是String类的一个成员方法,用于比较两个引用变量所指向的对象的内容是否相等,就像比较两个人的长相是否一样。


构造函数:

一旦编程者为该类定义了构造方法,系统就不再提供默认的构造方法了。

class Construct
{
int age;
public Construct(int x)
{
age = x;
}
}
上的 Construt 类中定义了一个对成员变量赋初值的构造方法, 该构造方法有一个形式参
数,这时系统就不再产生默认的构造方法,我们再编写一个调用 Construct 类的程序。
class TestConstruct
{
public static void main(String [] args)
{
Construct c = new Construct();
}
}
编译上面的程序,出现如下错误:
E: \TestConstruct.java:13: cannot resolve symbol
symbol    : constructor Construct    ()
location: class Construct
Construct c = new Construct();
^
1 error
错误的原因就是,调用 new Construct()创建 Construct 类的实例对象时,要调用的是没有参数的那个构造方法,而我们又没有定义无参数的构造方法,但我们定义了一个有参数的构造方法,系统不再为我们自动生成无参数的构造方法。针对这种情况,我们只要自己定义构造方法,都需要带上一个无参数的构造方法,否则,就会经常碰到上这样的错误。




0 0
原创粉丝点击