是的,我又想再学一遍Java了,之前上课的时候总是囫囵吞枣,这种填鸭式的学习方式也许能使我成绩上好看一些,但我都知道,其实我所学所掌握的,少之又少.利用这一个假期,我重新回来好好学学Java.南方的冬天异常地寒冷,愿它能安抚我浮躁的内心,让我能真正学点什么.
如同所有的面向对象语言一样,Java拥有面向对象的三大特性:封装
,继承
,多态
.除此之外还有各种面向对象带来的好处,这些东西我不再写在这里,随便任何一本参考书都说过这些,似乎想说服什么人一样.实际上好的东西不需要说服谁,Java也好C也好,它们都证明了自己足够优秀,我一直都坚信的一个理念就是:Take whatever suits you best.我们当然不需要在工具的好坏上争个高下,除非你是工具的开发者.
不同于大多数语言,Java既可以看作是编译型语言,也可以看作解释型语言,其特别之处在于,Java是运行于Java虚拟机(Java Virtual Machine,JVM)上的语言,Java程序需要编译,但和其它语言编译完成后生成的编译平台相关的机器码不同,其编译生成的(*.class)文件是无关平台的字节码,当然它无法在任一平台执行,必须用Java解释器来执行,即JVM来执行.
JVM是一个抽象的计算机,和真实的计算机一样,它具有指令集并使用不同的存储区域,负责执行指令,管理数据,内存和寄存器.正是由于JVM的存在,才使得Java的跨平台特性成为可能,也正是由于其存在,才使得Java的执行效率不如其它一些编译型的语言高效.
java
和javac
等命令的安装位置)在Linux下配置Java环境变量:
返回当前用户根目录,命令:~
,打开终端,并输入以下命令:
ls -a
,找到.profile
,使用编辑器打开,如gedit .profile
设置PATH,在文件末尾添加内容如下JAVA_HOME内容是JDK安装路径
,Linux下$
代表引用,:
用于分隔路径:
# set PATH so it includes Oracle JDK
export JAVA_HOME=/usr/share/java/jdk-11.0.1
export PATH=$JAVA_HOME/bin:$PATH
重启/注销系统重新登录/执行source .profile
,让PATH环境变量生效
刚刚实现的是单一用户环境变量配置,也可以设置系统全局变量(需root权限,对所有用户有效),如:
/
,进入/etc
,命令:etc
,执行ls -a
,找到environment
文件gedit environment
,可以看到PATH的内容,将JDK安装路径的二进制文件目录加入PATH即可,如:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/share/java/jdk-11.0.1/bin"
source environment
,让PATH环境变量生效以上教程均为Ubuntu 18.10测试无误得出,不同Linux发行版大同小异,但不保证完全相同
JDK 1.5以上版本将无需设置CLASSPATH,CLASSPATH的用途以后会说明
设置好环境变量,使用java -version
命令进行测试,输出如下:
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
注:source
命令只在当前终端有效,让Java环境变量一直生效稳妥的方法是注销系统重新登录
建议设置当前用户PATH即可,修改系统全局变量不当或将导致系统无法进入X环境,请确保你不会犯错误
在Windows下配置Java环境变量
# 下面是一条编译命令,用于将(*.java)文件编译生成(*.class)文件
javac FileName.java
# 当然你可以使用一些参数,如:
# 指定JRE编译时查找类的位置
javac -cp dir1,dir2,...,dirn FileName.java
javac -classpath dir1,dir2,...,dirn FileName.java
# 解决*dows系统存储文本时编码格式的一些设计缺陷
# 好吧其实是指定编译时以何种编码格式从(*.java)文件中读取信息
javac -encoding UTF-8 FileName.java
# 指定存放(*.class)的路径
javac -d path FileName.java
# 我们这么执行(*.class)文件:
java FileName.class
# 当然你可以使用一些参数,如:
# 指定JVM运行时查找类的位置
javac -cp dir1,dir2,...,dirn FileName.class
javac -classpath dir1,dir2,...,dirn FileName.class
# 其它参数就不一一介绍了
从以上命令我们可以看出,CLASSPATH是一个用于指定寻找class目录的环境变量,可以在编译/运行文件时指定
从Java 9以后,新增了一个jshell
工具,用于在终端学习Java或测试一些Java的新API,它可以直接执行Java语句,变量声明和表达式,并即时显示运行结果,其用法如下:
# 输入jshell并回车,就可以进入jshell:
yjzzjy4@yjzzjy4-AERO-15XV8 ~ jshell
| 欢迎使用 JShell -- 版本 11.0.1
| 要大致了解该版本, 请键入: /help intro
jshell> System.out.println("Hello World!");
Hello World!
jshell> int a = 0x3f3f3f3f
a ==> 1061109567
jshell> class test {
...> }
| 已创建 类 test
jshell> /exit
| 再见
# jshell的一些用法,使用其/help参数查看,不再在这过多介绍
Java是一个纯面向对象的语言,其所有的语句都必须写在类体内部(除了一些特殊语句,如import
),因此Java程序的构成和C++不一样的地方在于,Java的函数必须属于某个类,这些函数称为类的方法,包含主函数的类称为主类,Java程序实际上就是一个又一个类的信息交流过程,一个Java程序中可以有多个类,但只能有一个主类和一个主方法,程序的运行从主类开始.因为方法必须属于某个类,因此Java不支持类外定义方法,更符合封装性的特性.
Java程序的基本构成如下:
class someclass {
private double index; //成员;
public void func() {} //方法;
}
第一个Java程序(Hello World)
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
补充说明一下Java的命名规范:
和C惯用下划线的命名规则不同的是,Java使用驼峰命名规则,其规则大致如下:
类型 | 命名 |
---|---|
普通类/接口/接口实现类 | 所有单词首字母大写 |
异常类 | <类名>+Exception |
测试类 | <类名>+Test |
方法类型 | 命名 |
---|---|
设置/获取某个值的方法 | setV/getV |
返回长度的方法 | length |
判断布尔值的方法 | isV |
将对象转换为某个特定类型的方法 | toT |
包类型 | 命名 |
---|---|
项目包 | <域名反转>.<团队名>.<项目名>.<类名> |
相关项目包 | <域名反转>.<团队名>.<父项目名>.<子项目名>.<类名> |
请看如下示例:
package com.google.www.gmailteam.inbox.*; //inbox项目下的所有类;
package com.google.www.gmailteam.inbox.checkerplus.*; //checkerplus是inbox的子项目;
interface SomeInterface { //接口;
public void func();
}
class SomeClass implements SomeInterface { //接口的实现类;
private int len;
private double currentBalance;
public final int MAX_SIZE = 0x3f3f3f3f;
public double getBalance() {
return currentBalance;
}
public int length() { //返回长度方法;
return len;
}
public boolean isRight() {} //boolean方法;
public void func() {} //覆盖抽象方法;
}
class MyClass { //普通类;
public toSomeClass {} //转换方法;
}
class MyClassTest {} //测试类;
class MyException extends Exception {} //异常类;
以上,便是我进入Java世界的第一步.