jdk,jre,jvm
JDK是软件开发工具包,安装目录java/bin
是jdk的核心包。其中最主要的可执行文件有
- javac—-编译器 编译命令:
javac [选项] 文件名+后缀
- java—-解释器 即字节码文件运行程序:命令:
java [选项] 文件名无后缀
apple小程序是浏览器进行解释编译得到的字节码文件 - jdb—-调试器
- appletviewer—-java Applet 解释器
java/lib
目录下是函数库
JRE是java运行环境,由java虚拟机和一些标准的类别函数库(javaAPI类库)组成
JVM是java虚拟机,用于解释运行编译得到的字节码文件。jvm是java无视环境跨平台的最重要手段。只要有 Java 虚拟机的平台,就能解释执行 java 字节码程序
平台无关性的代价是降低程序的执行效率
jdk>jre>jvm
验证java环境:**java javac**
二者都可选参数:**-version**
Java语言优点
- 强类型:强类型能约束程序员必须遵守更多的编程规定,也能让编译器检测出程序中尽可能多的错误。
- 平台无关性
- 自动回收:jvm有一个垃圾回收器
- 面向对象
- 安全性:隐藏指针。运行前检查字节码文件。applet禁止访问本地资源…
- 分布式:C/S架构,实现数据分布(访问网络数据)与操作发布(分布计算网络获取结果)
-
java基础语法
类机制
一个 java源文件扩展名必须是
**.java**
- 一个源文件有多个类,那么只能有一个public类。
- 命名可见性:如果一个源文件有public类,那么源文件文件名必须与该public类名相同
包机制
- 包名是一个目录名,即项目路径
- 声明包:
package pkg1 [. pkg2[. pkg3...]];
- 命名包:一般使用公司域名的倒置作为包名
- package 语句必须出现在源程序文件的起始行,表示出现在该文件中的所有类都属于这个程序包。如果有多个源程序的程序包声明使用相同的包名,则表示这些源程序文件中的全部类都属于这个程序。
如果 源程序文件的首行没有 package 语句,则被默认为是无名包,存于当前目录中。
import
import用于引入所需要的类或包中的成员。import必须在package后面,类的定义之前
- 除了导入包,也可以不导包直接在代码写全所属包类。如
java.io.File a=new java.io.File("Test.java");
麻烦很多
- 除了导入包,也可以不导包直接在代码写全所属包类。如
默认使用的都是
java.lang
下的内容,所以java.lang
下的包不需要导入注释
单行注释
//...
- 多行注释
/*...*/
文档注释和多行注释的每一行一般还会使用一个*分隔 - 文档注释
/**...*/
javadoc命令
可以将文件中的文档注释提取出来生成HTML格式的API文档- 文档注释中有如下参数信息可以填写,javadoc就会根据这些参数生成命令 ```java /**
- @author kuangsheng 作者名
- @version 1.0 版本号
- @since 1.8 说明需要使用的最早jdk版本 / public class Test{ /*
- @param name 参数名
- @return String 返回值情况
- @throws Exception 异常抛出情况
*/
public String(String name) throws Exception{
} } //dos中执行:javadoc -encoding UTF-8 -charset UTF-8 Test.java 参数分别是设置编码和字符集为utf-8 ```return name;
main主函数
主函数必须是public static void main(String agrs) {...}
这样的写法。args不是固定的标识符
- 由字母,下划线字符_,美元字符$,文字,数字组成。
-
命名规则
一般变量名、方法名用小写英文字母开头;
- 文字和常数用大写字母命名;
- 类名首字母用大写字母;
-
java字符
Java 语言使用 Unicode 字符集(包括数字,字母,汉字,日文……,特殊字符)
if-else
- while
- do-while
- for
- for-each:
for(variable : collection) {// todo}
collection只能是数组或者是一个实现了 Iterable 接口的类对象 - switch:case 标签可以是:
- 类型为 char、byte、 short 或 int 的常量表达式。还有枚举常量。
- 从 Java SE 7 开始, case 标签还可以是字符串字面量。
- break:退出当前循环的整个循环。break可以标签,使用标签可以跳出任意一重循环,如在最内层循环使用break标签语句跳出最外层循环
- continue:跳过当前的一轮循环。如果已经是最后一轮循环了还执行continue语句,则跳转至循环第一轮
```java
public static void main(String[] args) {
} } /*不使用break:输出 aaaaaaaaab aaaaaaaaab …. 使用break: ab ab ab 使用带标签break 输出 a 然后就结束了2个循环read_data: //定义标签位置 for(int i=0;i<10;i++){ for (int j= 0; j< 10; j++) { System.out.print('a'); break read_data; } System.out.println('b');}
```java
Scanner in = new Scanner(System.in);
while (sum < goal ){
System.out.print("Enter a number: ");
n = in.nextlntO;
if (n < 0)
continue;
sum += n; // not executed if n < 0
}
运算符
几乎所有运算符都只能操作基本类型,唯一的例外是 =(赋值运算符)、==(关系运算符) 和 !=(关系运算符),它们能操作所有对象(这也是令人混淆的一个地方)
算术运算符
+ - * / %
- +还有一个作用就是连接相邻的一个字符串,如
sout(5+"d"); ->5x
- +还有一个作用就是连接相邻的一个字符串,如
还有等于号与算术运算符结合,等同于
x?=y相当于 x=x?y
赋值运算符
运算符的赋值是由符号 = 完成的。它代表着获取 = 右边的值并赋给左边的变量。右边可以是任何常量、变量或者可产生一个返回值的表达式。但左边必须是一个明确的、已命名的变量(即常数不能作为左值)。也就是说,必须要有一个物理的空间来存放右边的值。
- 如可将一个常数赋给一个变量(A = 4),但不可将任何未知的东西赋给一个常数(比如不能 4 = A)。
基本类型间的赋值只是直接复制了一个值,而对象间的复制则是在操纵引用,如
String str = new String("小牛肉");String s;``s = str;
s和str还是指向同一个对象关系运算符
-
逻辑运算符
&& 逻辑与 || 逻辑或 ! 逻辑非
&&和 || 具有短路 (short-circuiting) 特性: 整个表达式会在运算到可以明确结果时就停止并返回结果,这意味着该逻辑表达式的后半部分不会被执行到
位运算符
会把操作数转化为二进制进行运算
- 有
& and与 | or或 ^ xor非 ~ not异或
还有移位运算符:
>>右移,<<左移运算符 >>>(无<<<)暂时不知道和>>有什么区别
三元操作符
即
布尔表达式:a?b 为真返回a或者a表达式结果 为假...
instanceof
判断一个对象是否是另外一个类的对象或者子类对象。
- 对象的类型必须和判断的类型存在关系,比如存在父子类关系,否则会报错
老师类和学生类继承自Person。
object是Student类型,object既不是Teacher和String类的对象,也不是Teacher和String子类的对象。但是二者好歹和object类型Object存在关系。所以false
person是Student类型,Student和String完全不存在关系,所以直接报错
==,!=和equals的区别
- equals():
**java.lang.Object**
- ==和!=,equals判断基本类型时,就是判断值是否相同
- 判断对象时:Object.equals本质上还是等同于==。不过很多类都重写了equals方法。如基本类都重写了,重写后的equals便是比较值
查看基本类==基本类型时,也是只比较值
class Value { int i; } public class EqualsMethod2 { public static void main(String[] args) { Value v1 = new Value(); Value v2 = new Value(); v1.i = v2.i = 100; System.out.println(v1.equals(v2)); //false //注意这里不是比较字段值,上面 } }
Objects.equals()
//这是Object类的equals方法 public boolean equals(Object obj) { return (this == obj); } //这是工具类java.util.Objects的equals方法 public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); //这个equals是Object的方法 }
运算符优先级与结合性表
只需记住基本的乘除>加减即可 还有=号是右结合
- 强制类型转换运算符
**(?)**
的优先级为第二级 - 实际开发中只需用括号显式的定义运算顺序即可,无需死记硬背