数组内部成员初始化

所有数组(不论它是primitive的还是对象的)都有一个可供查询的内部成员)但是你不能修改——它会告诉你这个数组有多少元素。这个成员就是length。由于Java的数组,同C和C++的一样,是从零开始计算的,因此你能访问的最大的数组下标length-1。如果是C和C++的数组,即使你过了界,它也会安安静静地接受这个指令,然后放你到内存里乱串一气,许多臭名昭著的bug就是由此产生的。

但是Java能让你免受这些问题的困扰。一旦你出了界,就会引发一个运行时错误。当然,每次访问数组的时候都要花时间检查,而且代码也会长些,但是你没法把它关了,也就是说,如果效率非常重要,那么访问数组就可能会成为拖累程序效率的一个因素。但是为了internet的安全和程序员的编程效率,Java的设计者们认为这个代价还是值得的。

数组的初始化

在C语言里,初始化数组是一件既常容易出错又冗长乏味的事。C++用所谓的“集合初始化”大大增强了这个过程的安全性。由于Java的一切都是对象,因而它没有C++的“集合”。它也有数组,并且提供了数组的初始化。数组只是一个列在同一个标识符名下的简单序列,这个序列既可以是primitive的,也可以是同一种类型的对象的。数组是通过由方括号括起来的数组下表来定义和使用的。

要定义一个数组,只要直接在类型的名字后面加上一对空的方括号就行了。你也可以将方括号放到标识符的后面,这样做的意思是相同的。这种写法是C和C++程序员们所预想的。但是前一种写法可能更好一些,因为它在说这个类型是“一个int型的数组”。

Java解释器的工作

首先,它要找到classpath环境变量(这是通过操作系统设置的,有时Java安装程序或者Java工具的安装程序会为你设置)。Classpath包含了一个或多个目录,这些目录会被当做根目录供Java搜索.class文件。从这个根目录出发,解释器会将package名字里的每个点都换成斜杠(因此,根据操作系统的不同,package foo.bar.baz就被转换成foo\bar\baz,或者其他可能的形式),这样它生成了以classpath为根的相对路径。然后这些路径再与classpath里的各条记录相连。这才是Java用package的名字寻找.class文件的地方。此外,它还会根据Java解释器所在的位置查找一些标准目录。

创建独一无二的package名字

由于package没有被真的封装成一个单独的文件,而package又是由很多.class文件组成的,因此事情就有点乱了。要解决这个问题,较为明智的做法就是把所有同属一个包的.class文件都放到一个目录里,也就是利用操作系统的层次文件结构来解决这个问题。

将package的文件收进一个单独的子目录里还解决了另外两个问题:创建独一无二的package名字,以及帮助Java在复杂的目录结构中找到它们。这是通过将.class文件的路径信息放到package的名字里面来完成的。Java的约定是package名字的第一部分应该是类的创建者的internet域名的反写。由于internet域名的唯一性是有保证的,因此只要你遵守这个约定,package的名字就肯定是唯一的,这样就不会有名字冲突的问题了。当然,如果你还没有注册域名,那你完全可以编一个,然后用它来创建package的名字。如果你打算要发布Java程序,那么还是应该稍微花点时间去搞个域名。

Private的使用权限

Private关键词的意思是,除非是用这个类(包括这个成员的类)的方法,否则一律不得访问。同一个package里的其它类也不能访问private成员,所以这就有点像是在作茧自缚。但是另一方面,一个package很可能是由好几个人合作开发的,因此private能让你根据自己的需要修改那些成员,而不用担心这么做会不会对别的类产生影响。

默认的package权限通常已经提供了一中较为合适的隐藏效果;记住,从客户程序员的角度来看,package权限的成员也是不能访问的。这样正好,因为默认的权限就是你经常要用的那个(而且还是你忘了设置的时候会用那个的)。于是通常情况下,你只要把那些要对客户程序员开发的成员设成public就行了。结论是,可以先不考虑大量地使用private,因为即使不用,也还过得去。(这点同C++是截然不同。)但是,始终如一地使用private还是很重要的,特别是遇到多线程的时候。

网站建设中Java的接口与实现

访问权限通常被称为隐藏实现。在将数据和方法集成到了类里的同时,完成隐藏实现,这种做法常被称为封装,其结果就是数据类型有了特征和行为。有两个重要的原因要让我们为数据类型设置边界。首先就是要告诉客户程序员,他们能使用哪些东西,不能用哪些东西。你可以在系统里构建自己的内部机制,这样就不必担心客户程序员会一不小心就把这部分东西当作接口来用了。

为了让代码显得更有条理,可能你选用这种风格,就是将public成员都放在类的开头,接下来是protected成员,然后是package权限的,最后是private成员。这样做的好处就是,当用户从上到下读代码的时候,会先看到对他们最重要的东西,就是能在文件以外访问的public成员。而当他们遇到非public成员的时候,就会知道这是类的内部实现部分,这样就可以不读下去了。

Protected继承的访问权限

Protected关键词所处理的是一种被称为继承的概念,所谓继承就是选一个现成的类——我们称之为基类——然后在不改变已有类的前提下,往里面添加新的成员。你还可以修改已有类的成员的行为方式。要继承一个已有的类,你必须说明新的类extends一个已有的类。

如果你创建了一个新的package,并且其中某个类还继承了另一个package里面的类,那么你只能访问原先那个package的public成员。当然如果是在同一个package里面继承的话,那么你还可以访问package权限的成员。有时基类的创建者会希望派生类能访问某个成员,而其它类则不能访问。这就是protected要做的。Protected也赋予成员package权限——也就是说,同一个package里的其它类也可以访问protected元素。

Java中的复用类

Java最令人心动的特性就是它的代码复用了。但是仅仅拷贝源代码再作修改是不能被称为“革命”的。那是C之类的过程语言所采用的办法,而且也不怎么成功。就像Java里的一切,要解决这个问题还要靠类。你可以利用别人写好的、已经测试通过的类来创建新的类,不必一切都从零开始。

这么做的诀窍就是,要在不改动原有代码的前提下使用类。第一种非常简单:在新的类里直接创建旧的类的对象。这被称为合成,因为新的类是由旧的类合成而来的。你所复用的只是代码的功能,而不是它的形式。

第二种方法更为精妙,它会创建一个新的,与原来那个类同属一中类型的类。你全盘接受了旧类的形式,在没有对它做修改的情况下往里面添加了新的代码。这种神奇的做法就被称为继承。编译器会承担绝大部分的工作。继承是面向对象编程的基石,它还有一些额外的含义。合成与继承在语法和行为上有许多相似之处,这很好理解,因为它们都是在原有类的基础上创建新类。

PHP中图像文件如何上传

要为网站增加可上传切屏图像的支持,尽管这看起来不算太困难,但确实需要对应用做多处修改。出于这个原因,最好在具体深入代码之前先做一个规划。首先,使用ALTER为数据库增加一个列,要修改数据库,它需要一个新的列存储每个切屏图像文件的文件名。由于我们计划把所有图像文件都放在同一个文件夹中,所以只需要在数据库中存储文件名本身而不包含路径。

其次,要修改表单,使用一个文件输入域以允许图像文件上传。在增加页面上已经有一个表单来增加内容,所以我们需要修改这个表单,在其中增加一个文件输入域。结合web浏览器,这个输入域可以为用户提供一个用户界面来选择要上传的文件。

向数据库中插入图像文件名

图像文件名作为INSERT语句的一部分存储在数据库中。只是通过一个表单向web服务器上传图像文件还不够。还必须在数据库的新列中存储文件名,从而能够访问和显示图像。实际上,ADD脚本已经使用SQL INSERT语句向表插入了新的内容,不过这个语句并没有考虑到新增的列。

由于这个SQL语句只是插入值,而没有明确各自的列名,因此对应每一列都必须包含一个值。不过我们刚增加了一个新列,这说明这个查询无法再正常工作,它缺少对应新列的值。所以要把一个切屏图像文件名作为新的数据行的一部分增加到数据库中,要求我们还要向INSERT语句增加一个新的值。

«383940414243444546474849505152»
最近发表
控制面板
您好,欢迎到访网站!
  [查看权限]
网站分类
搜索
Tags列表
网站收藏
图标汇集
  • 订阅本站的 RSS 2.0 新闻聚合
友情链接

热门搜索: 外链域名 高外链域名 高收录域名

Copyright www.thyst.cn. Some Rights Reserved.