【Java开源代码栏目提醒】:本文主要为网学会员提供“一个Java源文件可包含三个“顶级”要素: - 毕业设计”,希望对需要一个Java源文件可包含三个“顶级”要素: - 毕业设计网友有所帮助,学习一下!
Java知识整理补充 一个
Java源文件可包含三个“顶级”要素 一个包声明可选 任意数量的输入语句 类和界面声明 该三要素必须以上述顺序出现。
即任何输入语句出现在所有类定义之前如果使用包声明则包声明必须出现在类和输入语句之前。
类库被组织成许多包每个包都包含几个类。
如下所列为一些重要的包
java.lang包含一些形成语言核心的类如String、Math、Integer和Thread。
java.awt包含了构成抽象窗口工具包AWT的类这个包被用来构建和管理应用程序的图形用户界面。
java.applet包含了可执行applet特殊行为的类。
java.net包含执行与
网络相关的操作的类和处理接口及统一资源定位器URLs的类。
java.io包含处理I/O文件的类。
java.util包含为任务设置的实用程序类如随机数发生、定义
系统特性和使用与日期日历相关的函数。
Java编码约定 Variables——所有变量都可大小写混用但首字符应小写。
词由大写字母分隔限制用下划线限制不是不合法使用美元符号因为这个字符对内部类有特殊的含义但是使用了是合法的。
currentCustomer 变量应该代表一定的含义通过它可传达给读者使用它的意图。
尽量避免使用单个字符 除非是临时“即用即扔”的变量例如用i j k作为循环控制变量 constant——原始常量应该全部大写并用下划线将词分隔对象常量可大小写混用。
HEAD-COUNT MAXIMUM-SIZE control structures——当语句是控制结构的一部分时即使是单个语句也应使用括号将语句封闭单个语句时不用也是合法的只不过不推荐你这样做。
例如 if condition do something else do something else 变量和作用域 局部local变量是在一个方法内定义的变量 也被称作自动automatic、临时temporary或栈stack变量当一个方法被执行时 局部变量被创建当一个方法被终止时 局部变量被清除局部变量必须使用之前初始化 否则编译时将出错 在方法外定义的变量是在使用new Xxxx 调用构造一个对象时被创建。
在构造一个对象时可创建两种变量。
一是类变量它是用static关键字来声明的只要需要对象类变量就将存在。
二是实例变量它不需用static关键字来声明只要对象被当作引用实例变量就将存在。
实例变量有时也被用作成员变量因为它们是类的成员。
方法参数变量定义在一个方法调用中传送的自变量每次当方法被调用时一个新的变量就被创建并且一直存在到程序的运行跳离了该方法。
当执行进入一个方法时局部变量被创建当执行离开该方法时局部变量被取消。
因而局部变量有时也被引用为“临时或自动”变量。
在成员函数内定义的变量对该成员函数是“局部的”因而你可以在几个成员函数中使用相同的变量名而代表不同的变量。
在
Java程序中任何变量都必须经初始化后才能被使用。
当一个对象被创建时实例变量在分配存储器的同时被下列值初始化 byte 0 short 0 int 0 long 0L float 0.0f double 0.0d char ‘u0000 空字符 boolean false All reference types Null 一个具有空值的引用不能引用任何对象。
试图使用它引用的对象将会引起一个异常。
异常是出现在运行时的错误。
在方法外定义的变量被自动初始化。
局部变量必须在使用之前做“手工”初始化。
如果编译器能够确认一个变量在初始化之前可被使用的情形编译器将报错。
按优先顺序列出了各种运算符“L to R”表示左到右结合“R to L”表示右到左结合 Separator R to L -- - data type L to R / L to R - L to R ltlt gtgt gtgtgt L to R lt gt lt gt instanceof L to R L to R amp L to R L to R L to R ampamp L to R R to L : R to L / - ltlt gtgt gtgtgt amp 关系和逻辑运算符返回布尔结果int到boolean不能自动转换。
运算符 能够进行String对象的链接并生成一个新的String String salutation quotDr. quot String name quotJack quot quotArthurquot String title salutation name 最后一行的结果是 Dr. Jack Arthur 如果运算符中有一个自变量为String对象则其它自变量将被转换成String。
所有对象都可被自动转换成String尽管这样做的结果可能是意义含糊的。
不是串的对象是通过使用toString 成员函数而转换成串的等价物的。
右移位运算符gtgt和gtgtgt 在移位的过程中 符号位被拷贝 逻辑或非符号右移位运算符gtgtgt 在移位的过程中 符号位不被拷贝 作用于位图 移位运算符将它们右侧的操作数模32简化为int类型左侧操作数 模64简化为long类型右侧操作数。
因而 任何int x x gtgtgt 32都会导致不变的x值 而不是你可能预计的零。
重要一点是: gtgtgt运算符仅被允许用在整数类型 并且仅对int和long值有效。
如果用在short或byte值上 则在应用gtgtgt之前 该值将通过带符号的向上类型转换被升级为一个int。
有鉴于此无符号移位通常已成为符号移位 在赋值的信息可能丢失的地方编译器需要程序员用类型转换typecast的方法确认赋值。
例如它可以“挤压”一个long值到一个int变量中。
显式转型做法如下 long bigValue 99L int squashed int bigValue 在上述程序中期待的目标类型被放置在圆括号中并被当作表达式的前缀该表达式必须被更改。
一般来讲建议用圆括号将需要转型的全部表达式封闭。
否则转型操作的优先级可能引起问题。
重温short的范围是-215至215-1char的范围是0至215-1。
因而在short和char之间的赋值总需要一个显式转型 一般来讲如果变量类型至少和表达式类型一样大位数相同则你可认为表达式是赋值兼容的。
对 运算符来说当两个操作数是原始数据类型时其结果至少有一个int并且有一个通过提升操作数到结果类型、或通过提升结果至一个较宽类型操作数而计算的值这可能会导致溢出或精度丢失。
short abc a1 b2 c ab 上述程序会因为在操作short之前提升每个short至int而出错。
然而如果c被声明为一个int或按如下操作进行类型转换 c shortab 则上述
代码将会成功通过。
在switch expr1 语句中expr1必须与int类型是赋值兼容的byte short或char类型可被升级不允许使用浮点或long表达式。
当变量或表达式的值不能与任何case值相匹配时可选缺省符default指出了应该执行的程序
代码。
如果没有break语句作为某一个case
代码段的结束句则程序的执行将继续到下一个case而不检查case表达式的值。
break语句被用来从switch语句、loop语句和预先给定了label的块中退出。
continue语句被用来略过并跳到循环体的结尾。
label可标识控制需要转换到的任何有效语句它被用来标识循环构造的复合语句。
在
Java编程语言中即使数组是由原始类型构成甚或带有其它类类型数组也是一个对象。
声明不能创建对象本身而创建的是一个引用该引用可被用来引用数组。
数组元素使用的实际存储器可由new语句或数组初始化
软件动态分配。
当数组声明的方括号在左边时该方括号可应用于所有位于其右的变量 多维数组 数组的数组 int twoDim new int 4 twoDim0 new int5 twoDim1 new int5 int twoDim new int 4 非法 在
Java编程语言中所有数组的下标都从0开始。
一个数组中元素的数量被作为具有length属性的部分数组对象而存储 这个值被用来检查所有运行时访问的界限。
如果发生了一个越出界限的访问那么运行时的报错也就出现了。
数组一旦创建后其大小不可调整。
Java编程语言在System类中提供了一种特殊方法拷贝数组该方法被称作arraycopy。
在处理对象数组时System.arraycopy拷贝的是引用而不是对象。
对象本身不改变。
message passing消息传递这个术语通
常用来表达这样一个概念即指示一个对象在它本身数据上做某项
工作一个对象的方法定义了该对象能在它本身数据上做什么。
值传递
Java编程语言只由值传递参数 当一个对象实例作为一个参数被传递到方法中时参数的值就是对该对象的引用。
对象的内容可以在被调用的方法中改变但对象的引用是永远不会改变的。
有两个规则适用于重载方法 调用语句的参数表必须有足够的不同以至于允许区分出正确的方法被调用。
正常的拓展晋升如单精度类型float到双精度类型double可能被应用但是这样会导致在某些条件下的混淆。
方法的返回类型可以各不相同但它不足以使返回类型变成唯一的差异。
重载方法的参数表必须不同。
一个新对象的初始化的最终步骤是去调用一个叫做构造函数的方法。
构造函数是由下面两个规则所确认的 方法名称必须与类名称完全相匹配。
对于方法不要声明返回类型 对于this的任何调用如果出现在任何构造函数中必须是第一个语句。
每个类都是Object的一个子类因此可以用Object数组作为任何对象的容器。
唯一不能被增加到Object数组中的唯一的东西就是基本变量以及包装类。
比Object数组更好的是向量类Vector它是
设计来贮存异类收集对象的。
Java编程语言允许一个类仅能扩展成一个其它类。
这个限制被称做单继承性。
构造函数不能被继承 子类从超类父类继承所有方法和变量除private修饰的成员外 子类不从超类继承构造函数 包含构造函数的两个办法是 使用缺省构造函数 写一个或多个显式构造函数 除了子构造函数外父类构造函数也总是被访问。
在
Java编程语言中有一个类它是其它所有类的父类。
这就是
java.lang.object类。
因此如定义 public class Employee 实际上定义被默认为 public class Employee extends Object and 关键字super super被用在类中引用其超类。
super被用来调用超类的成员变量。
超类行为就被调用就好象对象是超类的组件。
调用行为不必发生在超类中它能自动向上层类追溯。
关键字super可被用来引用该类中的超类。
它被用来引用超类的成员变量或方法。
对象的类型转换 使用instanceof来测试一个对象的类型。
用类型转换来恢复一个对象的全部功能。
用下述提示来检查类型转换的正确性 向上的类型转换是隐含地实现的。
向下的类型转换必须针对子类并由编译器检查。
当运行时错误发生时运行时检查引用类型。
如果不用instanceof做测试就会有类型转换失败的危险。
通常情况下类型转换一个对象引用的尝试是要经过几种检查的 向上强制类型转换类层次总是允许的而且事实上不需要强制类型转换运算符。
可由简单的赋值实现。
class Manager class Contractor 对于向下类型转换编译器必须满足类型转换至少是可能的这样的条件。
比如任何将Manager引用类型转换成Contractor引用的尝试是肯定不允许的因为Contractor不是一个Manager。
类型转换发生的类必须是当前引用类型的子类。
如果编译器允许类型转换那么该引用类型就会在运行时被检查。
比如如果instanceof检查从源程序中被省略而被类型转换的对象实际上不是它应被类型转换进去的类型那么就会发生一个运行时错误exception。
异常是运行时错误的一种形式而且是后面模块中的主题。
除了能用附加额外特征的办法在旧类基础上产生新类它还可以修改父类的当前行为。
如果在新类中定义一个方法其名称、返回类型及参数表正好与父类中方法的名称、返回类型及参数相匹配那么新方法被称做覆盖旧方法。
覆盖方法的规则 记住子方法的名称以及子方法参数的顺序必须与父类中的方法的名称以及参数的顺序相同以便该方法覆盖父类版本。
下述规则适用于覆盖方法 覆盖方法的返回类型必须与它所覆盖的方法相同。
覆盖方法不能比它所覆盖的方法访问性差 覆盖方法不能比它所覆盖的方法抛出更多的异常。
不能将非static方法覆盖为static方法。
在
Java编程语言中对象的初始化是非常结构化的。
这样做是要保证安全。
Java技术安全模式要求在子类执行任何东西之前描述父类的一个对象的各个方面都必须初始化。
因此
Java编程语言总是在执行子构造函数前调用父类构造函数的版本。
调用父类构造函数。
通常要定义一个带参数的构造函数并要使用这些参数来控制一个对象的父类部分的构造。
可能通过从子类构造函数的第一行调用关键字super的手段调用一个特殊的父类构造函数作为子类初始化的一部分。
要控制具体的构造函数的调用必须给super提供合适的参数。
当不调用带参数的super时缺省的父类构造函数即带0个参数的构造函数被隐含地调用。
在这种情况下如果没有缺省的父类构造函数将导致编译错误。
调用super能将任意数量的合适的参数赋到父类中的不同构造函数中但它必须是构造函数中的第一个语句。
当被使用时super或this必须被放在构造函数的第一行。
显然两者不能被放在一个单独行中但这种情况事实上不是一个
问题。
如果写一个构造函数它既没有调用super??也没有调用this??编译器自动插入一个调用到父类构造函数中而不带参数。
其它构造函数也能调用super??或this??调用一个Static方法和构造函数的数据链。
最终发生的是父类构造函数可能几个将在链中的任何子类构造函数前执行。
包 包声明必须在源程序文件的开始被声明 根据源
程序文件只允许有一个包声明 包名称是分层的由圆点隔开 包声明如果有的话必须在源程序文件的开始处。
可以以空白和注解开始而没有其它方式。
只允许有一个包声明并且它控制整个源程序文件。
Import语句 告诉编译器到哪儿寻找类来使用必须先于所有类声明 static成员 有时想有一个可以在类的所有实例中共享的变量。
比如这可以用作实例之间交流的基础或追踪已经创建的实例的数量。
可以用关键字static来标记变量的办法获得这个效果。
这样的变量有时被叫做class variable以便与不共享的成员或实例变量区分开来。
当没有一个特殊对象变量的实例的时候有时需要访问程序
代码。
用关键字static标记的方法可以这样使用有时被称做class method。
static方法可以用类名而不是引用来访问如 因为static方法不需它所属的类的任何实例就会被调用因此没有this值。
结果是static方法不能访问与它本身的参数以及static变量分离的任何变量。
访问非静态变量的尝试会引起编译错误。
静态方法不能被覆盖成非静态。
静态初始化程序 当类被装载时静态
代码块只执行一次。
方法程序体中不存在的
代码在static block中类可以包含该
代码这是完全有效的。
当类被装载时静态块
代码只执行一次。
类中不同的静态块按它们在类中出现的顺序被执行。
Java编程语言允许关键字Final被应用到类中。
如果这样做了类便不能被子分成子类。
比如类
Java.lang.String就是一个final类。
这样做是出于安全原因因为它保证如果方法有字符串的引用它肯定就是类String的字符串而不是某个其它类的字符串这个类是String的被修改过的子类因为String可能被恶意窜改过。
Final方法 个体方法也可以被标记为final。
被标记为final的方法不能被覆盖。
这是由于安全原因。
如果方法具有不能被改变的实现而且对于对象的一致状态是关键的那么就要使方法成为final。
被声明为final的方法有时被用于优化。
编译器能产生直接对方法调用的
代码而不是通常的涉及运行时查找的虚拟方法调用。
被标记为static或private的方法被自动地final因为动态联编在上述两种情况下都不能应用。
Final变量 如果变量被标记为final其结果是使它成为常数。
想改变final变量的值会导致一个编译错误。
下面是一个正确定义final变量的例子 public final int MAX_ARRAY_SIZE 25 接口是抽象类的变体。
接口中的所有方法都是抽象的没有一个有程序体。
接口只可以定义static final成员变量。
接口的好处是它给出了屈从于
Java技术单继承规则的假象。
当类定义只能扩展出单个类时它能实现所需的多个接口。
接口的实现与子类相似除了该实现类不能从接口定义中继承行为。
当类实现特殊接口时它定义即将程序体给予所有这种接口的方法。
然后它可以在实现了该接口的类的任何对象上调用接口的方法。
由于有抽象类它允许使用接口名作为引用变量的类型。
通常的动态联编将生效。
引用可以转换到接口类型或从接口类型转换instanceof运算符可以用来决定某对象的类是否实现了接口。
对于下述情况接口是有用的 声明方法期望一个或更多的类来实现该方法。
揭示一个对象的编程接口而不揭示类的实际程序体。
当将类的一个包输送到其它开发程序中时它是非常有用的。
捕获无关类之间的相似性而不强迫类关系。
描述“似函数”对象它可以作为参数被传递到在其它对象上调用的方法中。
它们是“函数指针”用在C和C中用法的一个安全的替代用法。
在JDK1.1中对方法名称的标准化做了重大努力。
因此在JDK1.2中大量的类构造函数和方法调用过时。
它们由根据更标准化的命名规则规定的方法名称所取代总的说来使程序员的生活简单化。
例如在JDK1.1版本中的
Java.awt.Component类 改变或获得组件大小的方法是resize和size。
改变或获得组件矩形框的方法是reshape和bounds。
在JDK1.0版本中的
Java.awt.Component这些方法被降级并被以set和get开头表示该方法的初级运算的方法所代替。
setSize和getSize setBoundsgetBounds 无论什么时候将
代码从JDK1.0升迁到JDK1.1或更高版本中或者即使使用以前用在JDK1.0中的
代码对用-deprecation标志来编译
代码都是一个好主意。
c: javac -deprecation MyFile.
java -deprecation标志将
报告在降级过的类中使用的任何方法。
Java.lang包中的Object类有public boolean equals Object obj方法。
它比较两个对象是否相等。
仅当被比较的两个引用指向同一对象时对象的equals方法返回true。
运算符也进行等值比较。
也就是说对于任何引用值X和Y当且仅当X和Y指向同一对象时 XY返回真。
当两个分离的对象的内容和类型相配的话StringDateFile类和所有其它override equals的包装类IntegerDouble等等将返回真。
内部类有如下属性 类名称只能用在定义过的范围中除非用在限定的名称中。
内部类的名称必须与所嵌套的类不同。
内部类可以被定义在方法中。
这条规则较简单它支配到所嵌套类方法的变量的访问。
任何变量不论是本地变量还是正式参数如果变量被标记为final那么就可以被内部类中的方法访问否则就不行。
内部类可以使用所嵌套类的类和实例变量以及所在嵌套块中的本地局部final变量。
内部类可以被定义为abstract. 属性 只有内部类可以被声明为private或protected以便防护它们不受来自外部类的访问。
访问保护不阻止内部类使用其它类的任何成员只要一个类嵌套另一个。
一个内部类可以作为一个接口由另一个内部类实现。
被自动地声明为static的内部类成为顶层类。
这些内部类失去了在本地范围和其它内部类中使用实例数据或变量的能力。
内部类不能声明任何static成员只有顶层类可以声明static成员。
因此一个需求static成员的内部类必须使用来自顶层类的static成员或声明为static内部类。
Java编程语言不把基本数据类型看作对象。
例如在基本格式本身当中数字、布尔及字符型数据都被看作是为了提高效率。
Java编程语言提供包装类来将基本数据元素看作对象。
这样的数据元素被包裹在创建于它们周围的对象中每个
Java基本数据类型在
Java.lang包中都有一个相应的wrapper class。
每个包装类对象封装一个基本值。
包装类
列表如下 基本数据类型 包装类 boolean Boolean byte Byte char Char short Short int Int long Long float Float double Double 可以通过将被包裹的值传递到合适的构造函数中来构造包装类对.