本系列教程为 Java 语言的入门教程, 主要针对有一定编程基础的同学, 帮助其了解 Java 的基础语法, 以及面向对象的一些基本特性在 Java 中的实现方式.

阅读本文之前请先学习博客中的另一文章“面向对象起步 — 封装、继承、多态”, 以了解面向对象编程的基本概念. 本文将不再复述其中已提到的概念和术语.

本节关键词: 类、对象、包、属性、方法、重载、调试

  • 关于Java相对于其它程序设计语言的优劣比较本文不再赘述, 事实上, 就设计语言而言并无优劣之分, 关键看其是否能满足项目需要.
  • 本文中使用的开发工具涉及 JDK ( Java开发工具包) 和 IDE ( 集成开发环境, 教程中使用的是 Eclipse, 用其它 IDE 亦可. 若使用非 Eclipse 作为 IDE 则下文中针对 Eclipse 的操作步骤/界面会有差异, 但这不是重要, 必要时问一下度娘, 网上有大量介绍. ) .
  • 本文不涉及如何安装 JDK, 如何搭建开发环境等内容, 若有必要, 请参阅其它资料.


在正式开始学习之前先强调一下:

不同于一般的课本以知识点为主线进行阐述, 读者往往可以跳跃式地阅读.

本教程将以 “叙事” 的方式展开, 将相关知识点穿插其中.

教程中的 “故事情节” 环环相扣, 关联紧密. 因此, 在学习本教程时, 一定要跟着教程的叙述 (思路) 走, 教程中提到实验步骤一定要立刻动手操作, 当提到需要思考的地方一定要停下来思考和小结, 万不可囫囵吞枣, 泛泛而读. 否则, 越读到后面你将越迷惑. 就像看一部侦探片, 不可快进, 更不可”跃进”! 必要时甚至需要再回头重看.

切记! 切记! 阿门!

类、对象

在 Java 的世界里, 一切都是从创建类开始, 程序是无法独立存在于类之外的.

类和对象是面向对象理论里实现封装的重要手段.

OK, 启动Eclipse, 我们来创建一个类……

首次启动Eclipse的过程中会出现一个要求指定工作空间 ( workspace ) 的对话框, 指定一个保存项目文件的文件夹. 今后你的项目文件将被存储在该文件夹下,所以请记住它.

之后, 在Eclipse主界面左侧的 Package Explorer 视图中空白处点右键 → New → Java Project 新建一个 Java 项目 ( Java Project ), 如下图.

首次启动Eclipse可能会显示 Welcome 视图, 关闭它就可以看到 Package Explorer 视图

在此后出现的 “New Java Project” 对话框的 “Project Name” 输入框中填入项目名称 (随意), 此处我们填入 “JavaStudy”, 直接点击 Finish 按钮即可.

此时, Package Explorer 中即出现新建的项目. 逐层展开项目可看到Eclipse已经帮我们创建了一个名为src的源文件夹, 并引入了一些常用的 jar 文件 ( 这些文件被归入到了JRE System Library中 ), 如下图:

src 源文件夹是用来存放我们写的程序.

默认引入的这些 jar 文件其实是别人已经写好了的一些程序, 经过打包之后形成一个个独立的 jar 文件. 这些 jar 是一般 Java 项目所需的, 暂时无须知道他们的用途…… 今后可能我们会使用到更多的第三方库 ( jar ), 也需要同样引入 ( 如何做? 暂时别管 ).

OK, 接着来……

现在我们要在 JavaStudy 项目中新建我们的第一个类……

在 src 图标上点击右键 → New → Class, 出现如下图所示的 “New Java Class” 对话框.

在 Package 处输入Package 的名称 ( 本文输入com.bailey.study.animal )

在 Name 处输入类的名称 ( 本文输入Pig )

点击 “Finish”…… 这样就创建了一个名为 Pig 的类 ( 猪类, 呵呵~).

疑问很多吧, 呵呵, 解释一下……

package : 称为”“. 为了避免类名冲突 ( 不同的类名称相同 ), 通常需要为类指定它所在的包. 在其它的程序设计语言里也有类似的东西, 可能会被称为”命名空间 ( namespace )”.

习惯上包名一般以”公司域名倒序.项目名”开头. 在本例中, 指定了包名为 com.bailey.study.animal, 类名为Pig之后, 该类的完整名称其实是 com.bailey.study.animal.Pig, 这样就可以避免重名了……

习惯上, 包名以小写字母开头, 以 “.” 分隔各个部分. 类名则以大驼峰法 ( Camel-Case )命名, 即首字母大写, 组成名称的各单词首字母大写, 其余字母小写(如: Pig, StudentInfo 参阅百度百科-骆驼命名法 )

OK, 我们来看看Eclipse生成了些什么吧……

可以看到, Package Explorer 中出现了新建的包和类, 而在右侧主视图中出现了 Pig.java 的源代码. ( 双击Package Explorer中的类名即可打开源码 )

相信你对那些花花绿绿的代码很好奇吧, 呵呵~ 简单解释一下(看注释)……

1
2
3
4
5
6
7
8
9
package com.bailey.study.animal;    // 指定类所在的包

/**
* 定义"猪类".
* "public" 是什么东东? 别管它, 等你长大了就知道了~
*/
public class Pig {

}

看到绿色的注释了吧, 注释风格是不是和 C 语言很像?

好… 继续…, 我们为 “猪类” 添加2个属性: name, weight ( 名字, 体重 ) 和 一个方法: eat ( 吃 ) , 代码如下 ( 注意看注释 ):

1
2
3
4
5
6
7
8
9
10
11
12
package com.bailey.study.animal;

public class Pig {
public String name; // 定义一个名为"name"的属性, 数据类型为 String (字符串)
public String sex; // 性别

// 定义一个名为"eat"的方法, 接收一个 String 型(字符串)的参数food, 无返回值
public void eat(String food) {
// 若属性 name 的值为 "小花", 参数 food 值为 "米饭", 则输出 "小花吃了米饭"
System.out.println(name + "吃了" + food);
}
}

嘿嘿, 就这么简单~ 别傻看了, 快去试试吧……

上面的代码并非推荐的写法, 更好的写法在本文最后, 所以…… 请坚持看完本文!

好的, 到此为止我们定义了一个类 Pig, 那要怎么使用它呢?

注意, Pig 只是一个类 (猪类), 并非一头具体的猪, 它还吃不了东西, 就像我们不能说”猪类你去饭吧“, 这样谁知道你叫谁呢…… 应该说”小花吃饭去吧“, 也就是说, 我们得把猪类(类) 变成一头具体的猪(对象).

怎么变呢?

对了, 实例化! 代码大概是这样: Pig p = new Pig();

但是, 这行代码写在那里呢? 总得有个调用方 ( 触发这段代码的地方 ) 吧……

OK, 现在就来创建另外一个类, 作为程序的入口, 并把”小花”生出来……

在 Package Explorer 视图中, src 图标上点右键 → New → Package, 在弹出对话框中的 Name 处输入com.bailey.study.test, 创建一个新的包.

然后…… 在com.bailey.study.test包的图标上点击右键 → New → Class, 创建一个新的类命名为”HelloJava“. 需要注意的是, 请选中 “New Java Class” 对话框中的 “public static void main(String[] args)” 复选框, 这样 Eclipse 会帮我们在新建的类中添加一个名称为 main 的方法, 这个方法将作为程序入口.

当然, 如果你使用别的 IDE, 暂时找不到上面所说的复选框也不要紧, 直接手动来写就行, 代码在下面…

然后…… 打开HelloJava类的源代码, 在里面添加一些代码, 最终完成的样子如下:

1
2
3
4
5
6
7
8
9
10
11
package com.bailey.study.test;

import com.bailey.study.animal.Pig; // 引入 Pig 类

public class HelloJava {
public static void main(String[] args) {
Pig p = new Pig(); // 实例化, 将对象赋值给变量 p
p.name = "小花"; // 将对象 p 的name属性赋值为字符串"小花"
p.eat("米饭"); // 调用对象 p 的 eat 方法, 让它吃米饭
}
}

注意看一下上面的注释就能明白各行代码是什么意思了……

其中, 有一些不知道含意的关键词, 例如: public, static, 暂时别管他, 以后我们再解释……

对于上述代码中的第 3 行, 稍作解释……

当要使用的类与当前类不在同一个包 ( package ) 时就必须使用 import 关键词引入该类 ( 例如本例中的 Pig 类 ).

否则… Java就不知道 Pig 从哪里来的!

把第 3 行删了试试…

呵呵~ 这有点像其它程序设计语言中的 include / using

为了省事, 可以使用Eclipse快捷键 Ctrl + Shift + O, 试试~

好了, 现在入口函数也有了, 怎么让程序运行起来呢?

在 Package Explorer 视图中找到 HelloJava 类点右键 → Run As → Java Application

看到了吗? 在 Eclipse 窗口的中的 Console 视图出现了 “小花吃了米饭”, 呵呵, 这就运行起来了~

如下图:

Console 意为控制台, 这个视图中将显示程序的输出内容……

也可以在 HelloJava 类的图标上点右键 → Debug As → Java Application, 这样会以”调试模式“ 启动程序 ( 前面的叫”运行模式“ ).

调试模式下, 程序运行到我们设置的”断点“就会暂停, 此时可以观察当前各个变量的当前值, 以便对程序进行排错. 而在运行模式下, 程序执行是会忽略所有的断点.

如何设置”断点”?

在想要设置 “断点” 的代码前双击即可, 之后, 会在断点所在的行前面出现一个蓝色的圆点, 如下图:

快以调试方式运行一次试试呀……

以后遇到程序报错就别老傻坐着看了, 设个断点调试一下吧! 学会调试程序是一个程序员必备的重要技能!

好了, 在继续往下看之前先暂停 3 分钟…… 整理一下思路, 想想我们刚才都做了些什么? 它们之间的关系是如何的?

过程大概是这样: 创建类 → 实例化 → 调用对象的方法

重载

前面的例子中, 我们只为Pig类定义一种”吃法”: eat(String food), 无论这食物是凉的或是烫的, 这猪都一口就吃下去了. 但事实上, 如果食物是比较烫, 恐怕得凉一会, 呵呵~

于是, 我想再多传一个参数给 eat 方法, 告诉它食物是否是烫的…… 程序该如何修改呢?

也许, 你想到的办法是修改原先的 eat 方法, 为它添加一个参数: isHot.

但其实没必要修改原先已有的那个 eat 方法, 只要为 Pig 类再增加一个同名的 eat 方法就好了. ( 原先的 eat 方法可认为是一种默认吃法, 我不想改它, 呵呵~)

如果你已经读完了“面向对象起步 — 封装、继承、多态”, 那你应该明白, 这就是传说中的”重载 (Overload)“了, 如果还没有读… 那建议先停一下, 去看看吧!

OK, 看代码……

1
2
3
4
5
6
7
8
9
10
11
public void eat(String food) {
System.out.println(name + "吃了" + food);
}

public void eat(String food, boolean isHot) {
if (isHot) {
System.out.println("等呀等... 终于凉了...");
}

eat(food); // 这里调用了第 1 行定义的那个eat方法
}

没什么好说的…… 关注一下第 10 行的注释, Maybe 你悟到了点什么……

是的, Java会根据传入的参数, 自动选择一个最合适的方法去调用……

说到这里, 去把 HelloJava.java 中的 p.eat("米饭"); 改为 p.eat("米饭", true); 试试…

关于重载的一些概念和原则, 还是请阅读一下本博客中的另一篇文章“面向对象起步 — 封装、继承、多态”, 此处不再赘述……

好了, 本节内容就是这些……

也许看完了之后你会发现有各种各样的规则 ( 要求 ), 别忙着死记, 放轻松~

事实上, Eclipse 是很聪明的, 当你犯错时它会划红线提醒你的, 到时候再看看提示, 改一改就好了.

写了一些程序之后, 慢慢地就不会犯错了……


为了让你看上去像一个老Java程序猿, 一些约定俗成的东西应该遵循, 一些技巧可以了解:

(1) 定义类/属性/方法时记得为它们加上访问修饰符

(2) 包名首字母小写

(3) 类名采用首字母大写的驼峰命名规则(大Camel-Case)

(4) 属性名, 方法名采用首字母小写的驼峰命名规则(小Camel-Case)

(5) 输入代码的过程中, 使用Eclipse快捷键 Alt + / 可调出输入提示

(6) 在代码视图中点右键 → Source → Generate Getters and Setters … 可快速地生成 getter, setter方法.

(7) 程序出现异常时, 善用调试模式(Debug) 进行排错, 别动不动就怀疑是不是电脑出问题了, 或者张嘴就问. 一步步跟踪代码的执行过程, 发现问题, 思考原因, 最终解决问题是一个难得的学习机会.