名字的可见性
如果在程序的某个部分里建立了一个类型的名字,而其他人这个程序的另一个部分里也建立了相同的名字,那么该如何区分这种同名却不同的类型呢,Java中为了个一个类库生成不会与其他名字混淆的名字,Java设计者希望程序员反过来使用自己的Internet域名,这样就能保证这个名字是独一无二的,反转域名后句点用来代表子目录的部分。
运用其他构件
如果想在自己的程序中使用已经定义好的类,你需要告诉编译器该如何定位他,但如果这个类就在发出调用请求的那个源文件中,那么,就可以直接使用这个类了,即使这个类在文件后面被定义。
但是位于其他文件中,那我们要如何定位呢?编译器无法自动帮你定位文件的位置,因为可能你所调用类型的名称存在不止一处。
因为我们需要使用import关键在来指示编译器来导入哪一个包,也就是类库。
大多数时候,我们使用与编译器附在一起的Java标准类库里的构件,这些构件,不需要你写一长串的反转域名,比如:
import java.util.ArrayList;
这行代码告诉编译器,你想使用Java的ArrayList类。但是,你可能同时想使用util包下的多个类,你又懒得逐一声明,那么你可以使用通配符“*”来达到这个目的
import java.util.*;
这种导入类群的方式,比一个一个导入类的方式更常用。
static关键字
当创建一个类的时候就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,实际上并不存在任何对象。执行new来创建对象的时候,数据存储空间才被分配,其方法才供外界调用。
但如果想为特定区域划分存储空间,或者希望不实例化就调用方法时,是依靠new无法解决的。
通过static可以解决上述问题,当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的人和对象实例关联在一起,所以无需创建对象也可以调用其static方法或static域。
只需要将static关键字放在定义之前即可,如下
class StaticTest{
static int i=47;
}
现在即使创建多个StaticTest对象,StaticTest.i也只有一份存储空间。
StaticTest s1=new StaticTest();
StaticTest s2=new StaticTest();
s1.i=s2.i=47;
引用static变量有两种方法。上例是一种方法:用一个对象去定位它;也可以直接通过类名直接引用,而这对非静态成员变量无法使用。
StaticTest.i++;
对i进行自增运算这时s1.i=s2.i=StaticTest.i=48。
使用类名引用静态变量时首选方式,这不仅是为了强调其静态特性,而且在某些情况下他会为编译器优化提供了好机会。
相似情况也应用于静态方法。(对象+类两种打点调用)。定义方法也类似
class Incrementable{
static void increment(){StaticTest.i++;}
}
Incrementable i = new Incrementable();
increment();//对象调用
Incrementable.increment();//类调用
因为一个static字段对每个类来说只有一份存储空间,因此肯定会改变数据创建方式。但是如果static作用于一个方法时,差别却没有那么大,static方法最重要的特性就是不需要创建任何对象就可以调用。这一点特性对main()方法来说十分重要因为他是一个应用程序的入口。
Java程序
应用之前所讲,现在编写一个打印字符串的程序
import java.util.*;
public class HelloDate{
public static void main(String [] args){
System.out.println(“Hello,it’s:”);
System.out.println(new Date());
}
}
程序的开头必须声明import语句,来引入所需要的额外类,Java程序会默认导入java.lang,因此我们无需导入就可以使用它的所有类,在上例中Java.lang中没有Date类,因此额外导入java.util.
在java.lang下System类具有很多属性,其中out,它是一个静态PrintStream对象。因为是静态的所以可以直接打点调用,由于PrintStream类有诸多方法,这里使用到了他的println()方法,其含义是“我将你给的数据打印倒控制台,然后换行”。
此外创建的类的名字必须与文件名相同,如果你想像上例那样创建一个独立运行的程序,那么文件中必须存在某个类与文件名相同,否则编译器会报错,并且那个类中必包含一个名为main()的方法。
public static void main(String []args){}
其中public关键字代表这是一个外部可调用的方法。main方法的参数是一个String对象的数组。也许你的程序并用不到args,但编译器依然要求必须这样做,因为args要用来存储命令行参数。
上例中System.out.println(new Date())的作用是打印时期,这里传递的参数是一个Date对象,一旦创建之后,就可以直接将他的值(它将被自动转化为String)发送给println().当这条语句执行完毕后,Date对象就不再被使用,而垃圾回收期会发现这一状况,并在任意时候将其回收。
编码风格
在“Java编程语言编码约定”中,代码风格是这样规定的:类名首字母要大些;如果类名由几个单词构成,那么把他们并在一起,其中每个单词的首字母都要大写。例如:
class AllTheColorsOfTheRainbow{//….
这种风格又称骆驼风格。几乎其他内容---方法,字段(成员变量)以及对象引用名称等,公认的风格与类的风格一样,只是标识符的第一个字母采用小写。例如:
class AllTheColorsOfTheRainbow{
int anIntergerRepresenting;
void changeColor(int newHue){
//…..
}
//…..
}