第1部分Java语言

1.3.2 安全性
Java程序限制在Java运行环境中,不允许它访问计算机的其他部分,下载小应用程序并能确保它对客户机的安全性不会造成危害是Java的一个最重要的方面。

1.4 Java的魔力:字节码
字节码是一套设计用来在Java运行时系统下执行的
高度优化的指令集,该Java运行时系统称为Java虚拟机(JavaVirtual Machine,JVM)。在其标准形式下,JVM 就是一个字节码解释器.
SUN公司在Java 2发行版中提供了一个字节码编译器——JIT(Just In Time,即时),JIT是Java虚拟机的一部分,它根据需要、一部分一部分地将字节码实时编译为可执行代码。它不能将整个Java程序一次性全部编译为可执行的代码,因为Java要执行各种检查,而这些检查只有在运行时才执行。

1.6 继 续 革 命
Java的第二个主要发布版本是Java 2。Java 2 是一个分水岭,它标志这个快速演变语言“现代时代”的开始!
Java 2增加了很多对新特性的支持,例如Swing和类集框架,并且它提高了Java虚拟机和各种编程工具的性能。Java 2也包含了一些不赞成继续使用的内容,主要是不赞成使用线程类中suspend( ),resume( )和stop( )这些方法。

1.7 Java不是增强的HTML
实质上,HTML是一种定义信息逻辑的组织方式并提供相关信息的链接(叫超文本链接)。你可能知道,超文本链接(hypertext link)(也叫超链接)是把一个超文本与另一个超文本文档链接起来的工具,而这个被链接的超文本文档可能在本地或万维网上其他地方。超文本文档要素的定义是通过选择该超文本文档与另一个相关文档的链接,在用户搜索各种路径后,该超文本文档可以非线性的方式阅读。
HTML提供Java小应用程序标记,该标记启动Java小应用程序。这样,就可以在超文本文档中嵌入能启动Java小应用程序的指令。

2.1 面向对象编程
第一种方法被称为面向过程的模型(process-oriented model),用它编写的程序都具有线性执行的特点。面向过程的模型可认为是代码作用于数据,像C这样的过程式语言采用这个模型是相当成功的。
第二种方式,也就是面向对象的编程(object-oriented
programming)被构思出来了。面向对象的编程围绕它的数据(即对象)和为这个数据严格定义的接口来组织程序。面向对象的程序实际上是用数据控制对代码的访问。

2.1.2 抽象
一旦你定义好了对象和指向这些对象的简明的、可靠的接口,你就能很从容很自信地解除或更替旧系统的某些组成部分。

2.1.3 面向对象编程的3个原则
封装:封装(Encapsulation)是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。
Java封装的基本单元是类。一个类(class)定义了将被一个对象集共享的结构和行为(数据和代码)。一个给定类的每个对象都包含这个类定义的行为和结构,好像它们是从同一个类的模子中铸造出来似的。具体地说,类定义的数据称为成员变量(member variables)或实例变量(instance variables)。操作数据的代码称为成员方法(member methods)或简称方法(methods)。
继承:继承(Inheritance)是一个对象获得另一个对象的属性的过程。继承很重要,因为它支持了按层分类的概念。如前面提到的,大多数知识都可以按层级(即从上到下)分类管理。继承性与封装性相互作用。
如果一个给定的类封装了一些属性,那么它的任何子类将具有同样的属性,而且还添加了子类自己特有的属性(见图2-2)。这是面向对象的程序在复杂性上呈线性而非几何性增长的一个关键概念。新的子类继承它的所有祖先的所有属性。它不与系统中其余的多数代码产生无法预料的相互作用。
多态性:多态性(Polymorphism,来自于希腊语,表示“多种形态”)是允许一个接口被多个同类动作使用的特性,具体使用哪个动作与应用场合有关。多态性的概念经常被说成是“一个接口,多种方法”。这意味着可以为一组相关的动作设计一个通用的接口。多态性允许同一个接口被必于同一类的多个动作使用,这样就降
低了程序的复杂性。选择应用于每一种情形的特定的动作(specific action)(即方法)是编译器的任务,程序员无需手工进行选择。你只需记住并且使用通用接口即可。
精心设计的类层级结构是重用你花时间和努力改进并测试过的程序的基础,封装可以使你在不破坏依赖于类公共接口的代码基础上对程序进行升级迁移,多态性则有助于你编写清楚、易懂、易读、易修改的程序。

2.2 第1个简单程序
2.2.1 键入程序

/*this is a simple java example
call this file "Example.java"*/

class Example{
    public static void main(String[] args)
    {
        System.out.println("this is a simple java program.");
    }
}
在Java中,一个源程序文件被称为一个编译单元(compilation unit)。它是一个包含一个或多个类定义的文本文件。Java编译器要求源程序文件使用.java文件扩展名。
在Java中,所有的代码都必须驻留在类中。按照约定,类名必须与源程序的文件名相同。你也应该确保文件名的大小写字母与类名一样,这是因为Java是区分大小写的。
当Java源代码被编译后,每个单独的类都被放入自己的输出文件中,并以类的名字加“.class”扩展名为其文件名。这就是为什么Java源程序文件必须与其中包含的类同名的原因——源程序文件将与“.class”文件相同。运行Java解释器实际上是指定你想要解释器运行的类的名字,它会自动搜索包含该名字且带有.class扩展名的文件。如果找到,它将运行包含在该指定类中的代码。
注意:javac   要编译的文件(不区分大小写)
        java  要解释的类文件(区分大小写)
        同时需要注意类名跟文件名一定要对应相同.

关键字public是一个访问说明符(access specifier),它允许程序员控制类成员的可见性。如果一个类成员前面有public,则说明该成员能够被声明它的类之外的代码访问(与public相对的是private,它禁止成员被所属类之外的代码访问)。在本例中,main( )必须被定义为public类型,因为当程序开始执行时它需要被它的类之外的代码调用。关键字static允许调用main( )而不必先实现该类的一个特殊实例。这是必要的,因为在任何对象被创建之前,Java解释器都会调用main()。
System是一个预定义的可访问系统的类,out是连接到控制台的输出流。可能你已经猜到了,控制台输出(输入)在实际的Java程序和小应用程序中并不经常使用。因为绝大多数现代计算环境从本质上讲都是窗口和图形界面的,控制台I/O主要被用简单的实用工具程序和演示程序使用。

2.3 第2个示例程序

/* Here is another short example2,
call this file "Example2.java"*/

class Example2{
    public static void main(String[] args){
        int num = 100;
        System.out.println("This is num:"+num);
        num = num *2;
        System.out.println("The value of num *2 is "+num);
    }
}

方法print ( )和方法println ( )类似,只是它在每次调用后并不输出一个新行(即换行)。其次,在调用println ( )时,注意变量num可以被自身使用。方法print ( )和方法println ( )都能够用来输出Java的任何内置类型的值。

2.6.6 Java关键字
目前Java语言一共定义了48个保留关键字(参见表2-1 )。这些关键字与运算符和分隔符的语法一起构成Java语言的定义。这些关键字不能用于变量名、类名或方法名。
除了上述关键字,Java还有以下保留字:true,false,null。这些词是Java定义的值。你也不能用这些词作为变量名,类名等等。
Java保留关键字
abstract const finally Int public this
boolean continue float interface return throw break default for long short throws byte do goto native static transient case double if new strictfp try catch else implements package super void char extends import private switch volatile class final instanceof protected synchronized while

3.3 整 数 类 型
Java定义了4个整数类型:字节型(byte),短整型(short),整型(int),长整型(long)。这些都是有符号的值,正数或是负数。Java 不支持仅仅是正的无符号的整数。
Java对高位含义的管理是不同的,它通过增加一个专门的“无符号右移”运算符来管理高位。

3.8.3 变量的作用域和生存期
尽管程序块能被嵌套,你不能将内部作用域声明的变量与其外部作用域声明的变量重名。在这一点上,Java不同于C和C++。下面的例子企图为两个独立的变量起同样的名字。在Java中,这是不合法的。但在C/C++中,它将是合法的,而且2个变量bar将是独立的。

3.9.1 Java的自动转换
如果下列2个条件都能满足,那么将一种类型的数据赋给另外一种类型变量时,将执行自动类型转换(automatic type conversion):
· 这2种类型是兼容的。
· 目的类型数的范围比来源类型的大。
当以上2个条件都满足时,拓宽转换(widening conversion)发生。例如,int型的范围比所有byte型的合法范围大,因此不要求显式强制类型转换语句。
对于拓宽转换,数字类型,包括整数(integer)和浮点(floating-point)类型都是彼此兼容的,但是,数字类型和字符类型(char)或布尔类型(bollean)是不兼容的。字符类型(char)和布尔类型(bollean)也是互相不兼容的。

3.9.2 不兼容类型的强制转换
尽管自动类型转换是很有帮助的,但并不能满足所有的编程需要。例如,如果你需要将int型的值赋给一个byte型的变量,你将怎么办?这种转换不会自动进行,因为byte型的变化范围比int型的要小。这种转换有时称为“缩小转换”(),因为你肯定要将源数据类型的值变小才能适合目标数据类型。
目标类型(target-type)指定了要将指定值转换成的类型。例如,下面的程序段将int型强制转换成byte型。如果整数的值超出了byte型的取值范围,它的值将会因为对byte型值域取模(整数除以byte得到的余数)而减少。当然,如果浮点值太大而不能适合目标整数类型,那么它的值将会因为对目标类型值域取模而减少。
例如:
byte b;
int i = 257;
b = (byte) i;
输出 b 的值为1;

3.10 表达式中类型的自动提升
在表达式中,对中间值的精确要求有时超过任何一个操作数的范围。例如,考虑下面的表达式:
byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;
中间项结果a*b很容易超过它的任何一个byte型操作数的范围。Java自动提升各个byte型或short型的操作数到int型。这意味着子表达式a*b使用整数而不是字节型来执行。
byte b = 50;
b = b * 2; // Error! Cannot assign an int to a byte!
该程序试图将一个完全合法的byte型的值50*2再存储给一个byte型的变量。但是当表达式求值的时候,操作数被自动地提升为int型,计算结果也被提升为int型。这样,表达式的结果现在是int型,不强制转换它就不能被赋为byte型。

3.10.1 类型提升的约定
首先,如刚才描述的,所有的byte型和short型的值被提升到int
型。其次,如果一个操作数是long型,整个表达式将被提升到long型;如果一个操作数是float型,整个表达式将被提升到float型;如果有一个操作数是double型,计算结果就是double型。
double result = (f * b) + (i / c) - (d * s);
在第一个子表达式f*b中,变量b被提升为float类型,该子表达式的结果当然是float类型。接下来,在子表达式i/c,中,变量c被提升为int类型,该子表达式的结果当然是int类型。然后,子表达式d*s中的变量s被提升为double类型,该子表达式的结果当然也是double类型。最后,考虑三个中间值,float类型,int类型,和double类型。float类型加int类型的结果是float类型。然后float类型减去提升为double类型的double类型,该表达式的最后结果是double类型。

3.12 字符串的简单介绍
Java的字符串类型,叫做字符串(String),它不是一种简单的类型,它也不是简单的字符数组(在C/C++中是)。字符串(String)在Java中被定义为对象,要完全理解它需要理解几个和对象相关的特征。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值