打造第一个java程序
名称的可视性
名称问题有些人觉得不是什么大问题,我开始也觉得那不是个什么大问题,但是当你有一天写了很多的类时,你就发现,名称其实真的很重要,假如你有这么一个类,他需要调用其他几个类, 当这几个被类名相同时,问题就出现了,那么
怎么区分他们,并且使他们的名称不冲突呢?毕竟我们不可能把每个声明过的类的名字一一记住,以便在下次声声明其他名称时,加以区分。这个时候我们就需要使用包(package)了,一个包就是一个命名空间。命名空间的使用规则是:反转internet域名,例如,我的blog是blog.csdn.com/maoerzuozuo你可以在类的开头使用package maoerzuozuo.com.csdn.blog,这样就好了~每个包都是一个独一无二的命名空间。需要注意一点:当使用package说明一个包时,该包的层次结构必须和文件目录的结构相同!就想c:\maoerzuozuo\com\csdn\blog
使用其他组件
包定义了之后一定要使用的,怎么使用呢?在文件的开头使用import关键字,假如我要导入我开发的一个叫hello.class组件,我只要import maoerzuozuo.com.csdn.blog.hello;就导入了我所创建的包,当然你也可以偷懒,用import maoerzuozuo.com.csdn.blog.*;
导入该文件夹里所有的包(也许你有的包根本用不上),但是这样有个弊端,就是在编译的速度要比直接指明包的编译速度要慢。
关键字static(静态的)
一个class只有在你使用new来产生对象时,他的函数才能被外界使用,但是也有2中情况是用上面的方法无法实现的。
1、不管产生多少的对象或没有对象产生对象时,一些特定的数据存储只有一份;
2、类中的某个函数不想和对象绑定在一起,既我不想产生对象,但是我还想用类中的一个函数;
一般情况下, 你要使用一个非静态(non-static)的成员的话,必须先产生一个对象使用对象来调用这个数据或函数,所以你必须知道这个函数/数据属于哪个对象才行,因为static是不用产生对象就可以使用的,所以在static的函数中不能直接调用non-static的函数或变量。
解决1、把static关键字摆在成员变量或函数定义之前,就可以使他们变为静态的。
class StaticDemo
{
static int i=888;
public static void main(String args[])
{
StaticDemo sd1=new StaticDemo();
StaticDemo sd2=new StaticDemo();
System.out.println(sd1.i);//888
System.out.println(sd2.i);//888
StaticDemo.i++;
System.out.println(sd1.i);//889
System.out.println(sd2.i);//889
}
}
现在即使你产生n个StaticDemo对象,但是i只有原始的一份,不管你是sd1.i还是sd2.i,其实就是同一个i,全部引用自这个StaticDemo.i,所以,只要改变StaticDemo.i内存储的数据,这些sd1和sd2的i都会改变,因为他们的i的句柄全部指向的是StaticDemo.i这一个内存空间,就相当于,有一个人在a公司工作,还在b公司兼职,而他假如死掉了,则同时影响2家公司,就是这个意思,同样的道理也适用于static的函数
解决2、要想不产生对象就能使用函数,这样需要在函数名前加上static
class StaticDemo
{
public static void show(String s)
{
System.out.println(s);
}
public static void main(String args[])
{
show("one");//调用方法1
StaticDemo.show("two");//调用方法2
new StaticDemo().show("three");//调用方法3
}
}
对于调用方法1,其实他隐藏了一个关键子,就是this,他的完整形式应当是this.show("one"),这个this的用法以后会学到
对于调用方法2,使用的是className.method()的形式,这个也就是static的函数调用的典型形式,non-static的函数是不能使用这样的方法调用的!
对于调用方法3,这个方法就是我们调用函数的一般方法,创建对象,由对象调用函数,这个方法对于static和non-static是同样适用的。某个成员变量在声明为static的时候,其建立的方式有很大的变化,但是static的函数变化不大,static函数最大的一点用处就是可以在不建立对象的情况下,调用函数,就像我们经常见到的main函数一样。
你的第一个java程序
java程序默认的回把java.lang下的包导入到你所创建的文件中,我们没有必要再使用import来导入。一个public的class的名称一定要和文件名称是一样的,并且一个class里面只允许有一个public的class,附则程序是编译不过去的。如果你要运行这个类的话,那么这个类中一定要有一个main()函数,他的固定格式为public static void main(String args[]),其中,public表示这是一个公开给外界使用的函数,并且是个static的不允许有返回值,而传入main()的参数必须是个String对象数组,即使你从来没有过,这个args[]的string数组可以存储cmd的参数。
编译与执行
使用javac 文件名.java来编译java文件,使用java className来执行className这个类,这里要注意2点,一个是当你使用java命令执行一个类时,这个类必须要有main函数;第二个className不一定等于文件名,一个java文件中假如有public类,那么这个类名必须要和文件名相同,其他情况你可以随你自己的意思起名字
注释及内嵌文档
//注释单行 /*.......*/注释多行,多行注释内不能嵌套多行注释。
寓文档于注释
javadoc命令可以将内嵌在程序代码中的文档提取出来,生成html格式的文件,使用浏览器就可以查看。
语法
这个部分我就跳过去了,有兴趣的朋友自己看看,很简单的
编码风格
类名在编写的时候,应当第一个字母大写,如果名称是由多个单词组成,则把这些个单词并在一起写,并且把他们的第一个字母大写 例如 public class MaoErZuoZuo
本章总结:
这一章总算ko了,呵呵~其实这章讲的不难,大家就是要仔细看书,好好体会tij的精髓
本章习题解答
这章的习题总体不难,惟独有一个题是运用了后面学习的知识,我们就把他作为难题来对付好了
"撰写某个程序,使他能够接受由命令行传入的3个引数,为此,你需要对代表命令行引数的string数组进行索引"
public class Solve
{
public static void main(String args[])
{
System.out.println(args[0]);
System.out.println(args[1]);
System.out.println(args[2]);
}
}
这个程序可以接受3个引数,并且把他显示出来,有的人会问了:我们怎么把引数传递进来呢。大家在运行时,要在java Solve后面加个空格,在加三个引数,每个使用空格隔开,例如 java Solve aaa bbb ccc这样程序就会接受到这3个引数,并且把他显示。当你输入引数和接受引数的数量不符时候,会抱ArrayIndexOutOfBoundsException的错误,希望大家注意!
大家如果在学习的过程中,有什么问题,可以这样联系我
E-mail molmd@163.net /163.com QQ:31349283 我们可以共同学习进步!
欢迎访问我的blog,http://blog.csdn.com/maoerzuozuo 里面有更多学习内容!
未完待续...............