注释

平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写了啥,但是当项目结构一旦复杂起来,我们就需要用到注释了。

注释并不会被执行,是给我们写代码的人看的。

书写注释是一个非常好的习惯!

Java中的注释有三种

  • 单行注释(Line Comment)
// 这是一个单行注释
  • 多行注释(Block Comment)
/* 这是一个多行注释 */

/*
这也是一个多行注释
*/

/*
 * 这是一个强迫症写的多行注释
 */
  • 文档注释(Document)
/**
 * @Description 这是个带一些功能的文档注释
 * @Author 锁寒
 */

Java文档注释教程


标识符

Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。

命名规则

关于 Java 标识符,有以下几点需要注意:

  • 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始。
  • 首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合。
  • 关键字不能用作标识符。
  • 标识符是大小写敏感的。
  • 合法标识符举例:age、$salary、_value、__1_value。
  • 非法标识符举例:123abc、-salary。
  • 变量名最好是有意义的名字,这样更方便理解并提高阅读性。

关键字

关键字含义
abstract表明类或者成员方法具有抽象属性
assert断言,用来进行程序调试
boolean基本数据类型之一,声明布尔类型的关键字
break提前跳出一个块
byte基本数据类型之一,字节类型
case用在switch语句之中,表示其中的一个分支
catch用在异常处理中,用来捕捉异常
char基本数据类型之一,字符类型
class声明一个类
const保留关键字,没有具体含义
continue回到一个块的开始处
default默认,例如,用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现
do用在do-while循环结构中
double基本数据类型之一,双精度浮点数类型
else用在条件语句中,表明当条件不成立时的分支
enum枚举
extends表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口
final用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量
finally用于处理异常情况,用来声明一个基本肯定会被执行到的语句块
float基本数据类型之一,单精度浮点数类型
for一种循环结构的引导词
goto保留关键字,没有具体含义
if条件语句的引导词
implements表明一个类实现了给定的接口
import表明要访问指定的类或包
instanceof用来测试一个对象是否是指定类型的实例对象
int基本数据类型之一,整数类型
interface接口
long基本数据类型之一,长整数类型
native用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
new用来创建新实例对象
package
private一种访问控制方式:私用模式
protected一种访问控制方式:保护模式
public一种访问控制方式:共用模式
return从成员方法中返回数据
short基本数据类型之一,短整数类型
static表明具有静态属性
strictfp用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范
super表明当前对象的父类型的引用或者父类型的构造方法
switch分支语句结构的引导词
synchronized表明一段代码需要同步执行
this指向当前实例对象的引用
throw抛出一个异常
throws声明在当前定义的成员方法中所有需要抛出的异常
transient声明不用序列化的成员域
try尝试一个可能抛出异常的程序块
void声明当前成员方法没有返回值
volatile表明两个或者多个变量必须同步地发生变化
while用在循环结构中
Java关键字
特殊直接量含义
false布尔值的假
null空值
true布尔值的真
特殊直接量

数据类型

Java是一种强类型语言

  • 要求变量的使用严格符合规定,所有变量必须先定义后才能使用。

弱类型语言

  • 不太要求变量的使用严格符合规定,可以随意变更

Java的数据类型分为两大类

  • 基本类型(primitive type)
  • 引用类型(reference type)

以下材料来自菜鸟教程

基本类型

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

byte:

  • byte 数据类型是8位、有符号的,以二进制补码表示的整数
  • 最小值是 -128(-2^7)
  • 最大值是 127(2^7-1)
  • 默认值是 0
  • byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一
  • 例子:byte a = 100,byte b = -50。

short:

  • short 数据类型是 16 位、有符号的以二进制补码表示的整数
  • 最小值是 -32768(-2^15)
  • 最大值是 32767(2^15 - 1)
  • Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一
  • 默认值是 0
  • 例子:short s = 1000,short r = -20000

int:

  • int 数据类型是32位、有符号的以二进制补码表示的整数
  • 最小值是 -2,147,483,648(-2^31)
  • 最大值是 2,147,483,647(2^31 - 1)
  • 一般地整型变量默认为 int 类型
  • 默认值是 0 
  • 例子:int a = 100000, int b = -200000。

long:

  • long 数据类型是 64 位、有符号的以二进制补码表示的整数
  • 最小值是 -9,223,372,036,854,775,808(-2^63)
  • 最大值是 9,223,372,036,854,775,807(2^63 -1)
  • 这种类型主要使用在需要比较大整数的系统上
  • 默认值是 0L
  • 例子: long a = 100000Llong b = -200000L
    "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。

float:

  • float 数据类型是单精度、32位、符合IEEE 754标准的浮点数
  • float 在储存大型浮点数组的时候可节省内存空间
  • 默认值是 0.0f
  • 浮点数不能用来表示精确的值,如货币
  • 例子:float f1 = 234.5f;

double:

  • double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数
  • 浮点数的默认类型为 double 类型
  • double类型同样不能表示精确的值,如货币
  • 默认值是 0.0d
  • 例子:double d1 = 7D ; double d2 = 7.; double d3 = 8.0; double d4 = 8.D; double d5 = 12.9867; 7 是一个 int 字面量,而 7D,7. 和 8.0 是 double 字面量。

boolean:

  • boolean数据类型表示一位的信息;
  • 只有两个取值:true 和 false;
  • 这种类型只作为一种标志来记录 true/false 情况;
  • 默认值是 false
  • 例子:boolean one = true;

char:

  • char 类型是一个单一的 16 位 Unicode 字符
  • 最小值是 \u0000(十进制等效值为 0)
  • 最大值是 \uffff(即为 65535)
  • char 数据类型可以储存任何字符
  • 例子:char letter = 'A';

引用类型

  • 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
  • 对象、数组、类和接口都是引用数据类型。
  • 所有引用类型的默认值都是null。
  • 一个引用变量可以用来引用任何与之兼容的类型。
  • 例子:Site site = new Site("Frostlock");

整数拓展

二进制:0b开头

十进制:正常写

八进制:0开头

十六进制:0x开头

浮点数拓展

有float、double。

浮点运算会有精度问题,这个问题可能会导致出现严重问题。

浮点数会有误差,整体是离散的,有的时候接近但是不等于。

最好不要用浮点数进行比较。

如需要进行实数比较,可以使用BigDecimal类。

字符拓展

所有的字符本质还是数字。

char a = "A";
System.out.println((int)a); // (int)为强制类型转换

以上代码会输出56.

编码Unicode:占用2字节 ,会有0-65536个,当然现在可以更多。具体可以查看Unicode表

其他编码:可以自己搜下。

转义字符:一种特殊的字符,会转换成特殊的不好打出的字符,如:\n换行、\t制表符。具体可以在网上搜索。

字符串:懒得写了,以后补充。

布尔值拓展

用来表示真、假。

boolean flag = true;
if (flag == true) {} //比较繁琐
if (flag) {} //相对简洁
// 以上两个if表达效果相同

什么是字节

位(bit):是计算机内部数据储存的最小单位,11001100是一个八位二进制数。

字节(byte):是计算机中数据处理的基本单位,习惯上用大小的B来表示。

1B(byte字节)= 8bit(位)

字符:是指计算机中使用的字母、数字、字和符号。


类型转换

由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。

运算中,不同类型的数据先转化为同一内容,然后再进行运算。

强制转换

可以由高转低。

最简单的强制类型转换如下:

int i = 128;
byte b = (byte)i; // 强制转换i的类型为byte
// 注意以上会有个问题,当i转换为byte的时候会出现内存溢出,b的值会出错。

自动转换

当由低转高的时候不需要额外操作,系统会自己转换。

int i = 128;
long l = i;
System.out.println(l);
// 会输出128,没有任何报错。

注意点

  1. 不能对布尔值进行转换。
  2. 不能把对象转换为不相干的类型。
  3. 在把高容量转换为低容量时要强制转换。
  4. 转换的时候可能会出现内存溢出。
  5. 自动转换时并不会先自动转换运算时的类型,如果运算时溢出结果同样错误,推荐在运算时先强制转换。

Tip:自从JDK7以后用户可以通过下划线“_”来分割数字方便阅读。如:100_000_000


变量

变量是什么:就是可以变化的量。

Java是一种强类型语言,每个变量必须声明其类型。

Java变量是程序中最基本的储存单元,器要素包括变量名、变量类型和作用域。

type varName [=value] [{, varName[=value]}];
// 数据类型 变量名 = 值; 可以使用逗号来生命多个同类型变量。

变量作用域

  • 类变量:独立于方法之外的变量,用 static 修饰。
  • 实例变量:独立于方法之外的变量,不过没有 static 修饰。
  • 局部变量:类的方法中的变量。

类变量(静态变量)

  • 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
  • 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
  • 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变。
  • 静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
  • 静态变量在第一次被访问时创建,在程序结束时销毁。
  • 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
  • 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
  • 静态变量可以通过:ClassName.VariableName的方式访问。
  • 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。

实例变量

  • 实例变量声明在一个类中,但在方法、构造方法和语句块之外;
  • 当一个对象被实例化之后,每个实例变量的值就跟着确定;
  • 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
  • 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
  • 实例变量可以声明在使用前或者使用后;
  • 访问修饰符可以修饰实例变量;
  • 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
  • 实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定;
  • 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:ObjectReference.VariableName。

Java 局部变量

  • 局部变量声明在方法、构造方法或者语句块中;
  • 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
  • 访问修饰符不能用于局部变量;
  • 局部变量只在声明它的方法、构造方法或者语句块中可见;
  • 局部变量是在栈上分配的。
  • 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。

常量

常量(Constant):在Java语言中,用关键字final来定义一个常量。常量一旦被初始化后不能再更改。

在定义常量时,需要注意如下内容:

  • 在定义常量时就需要对该常量进行初始化。
  • final 关键字不仅可以用来修饰基本数据类型的常量,还可以用来修饰对象的引用或者方法。
  • 为了与变量区别,常量取名一般都用大写字符。

Java 语言使用 final 关键字来定义一个常量,其语法如下所示:

final dataType variableName = value;

// 常量演示
public class HelloWorld {
    // 静态常量
    public static final double PI = 3.14;
    // 声明成员常量
    final int y = 10;
    public static void main(String[] args) {
        // 声明局部常量
        final double x = 3.3;
    }
}

命名规范

  • 所有变量、方法、类名:见名知意。
  • 类成员变量:首字母小写和驼峰原则:monthSalary 除了第一个单词意外,后面的单词字母大写。
  • 局部变量:同上
  • 常量:大写字母和下划线
  • 类名:单词首字母大写
  • 方法名:和类成员变量相同

运算符

Java语言支持如下运算符

  • 算术运算符:+、-、*、/、%、++、--
  • 赋值运算符:=
  • 关系运算符:>、<、>=、<=、==、!=、instanceof
  • 逻辑运算符:&&(与)、||(或)、!(非)
  • 位运算符:&、|、^、~、>>、<<、>>>(无符号右移,挺不常见)
  • 条件运算符:?:
  • 扩展赋值运算符:+=、-=、*=、/=

算术运算实例

public class Operator {
   public static void main(String[] args) {
      int a = 10;
      int b = 20;
      int c = 25;
      int d = 25;
      System.out.println("a + b = " + (a + b) );
      System.out.println("a - b = " + (a - b) );
      System.out.println("a * b = " + (a * b) );
      System.out.println("b / a = " + (b / a) );
      System.out.println("b % a = " + (b % a) );
      System.out.println("c % a = " + (c % a) );
      System.out.println("a++   = " +  (a++) );
      System.out.println("a--   = " +  (a--) );
      // 查看  d++ 与 ++d 的不同
      System.out.println("d++   = " +  (d++) );
      System.out.println("++d   = " +  (++d) );
   }
}
/*
   输出结果
   a + b = 30
   a - b = -10
   a * b = 200
   b / a = 2
   b % a = 0
   c % a = 5
   a++   = 10
   a--   = 11
   d++   = 25
   ++d   = 27
*/

关系运算实例

public class Operator {
   public static void main(String[] args) {
      int a = 10;
      int b = 20;
      System.out.println("a == b = " + (a == b) );
      System.out.println("a != b = " + (a != b) );
      System.out.println("a > b = " + (a > b) );
      System.out.println("a < b = " + (a < b) );
      System.out.println("b >= a = " + (b >= a) );
      System.out.println("b <= a = " + (b <= a) );
   }
}
/*
   以上实例编译运行结果如下:
   a == b = false
   a != b = true
   a > b = false
   a < b = true
   b >= a = true
   b <= a = false
*/

位运算符实例

public class Operator {
   public static void main(String[] args) {
      int a = 60; /* 60 = 0011 1100 */ 
      int b = 13; /* 13 = 0000 1101 */
      int c = 0;
      c = a & b;       /* 12 = 0000 1100 */
      System.out.println("a & b = " + c );
 
      c = a | b;       /* 61 = 0011 1101 */
      System.out.println("a | b = " + c );
 
      c = a ^ b;       /* 49 = 0011 0001 */
      System.out.println("a ^ b = " + c );
 
      c = ~a;          /*-61 = 1100 0011 */
      System.out.println("~a = " + c );
 
      c = a << 2;     /* 240 = 1111 0000 */
      System.out.println("a << 2 = " + c );
 
      c = a >> 2;     /* 15 = 1111 */
      System.out.println("a >> 2  = " + c );
  
      c = a >>> 2;     /* 15 = 0000 1111 */
      System.out.println("a >>> 2 = " + c );
   }
} 

/*
   以上实例编译运行结果如下:
   a & b = 12
   a | b = 61
   a ^ b = 49
   ~a = -61
   a << 2 = 240
   a >> 2  = 15
   a >>> 2 = 15
*/

逻辑运算实例

public class Operator {
   public static void main(String[] args) {
      boolean a = true;
      boolean b = false;
      System.out.println("a && b = " + (a&&b));
      System.out.println("a || b = " + (a||b) );
      System.out.println("!(a && b) = " + !(a && b));
   }
}

/*
   以上实例编译运行结果如下:
   a && b = false
   a || b = true
   !(a && b) = true
*/

赋值运算实例

public class Operator {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int c = 0;
        c = a + b;
        System.out.println("c = a + b = " + c );
        c += a ;
        System.out.println("c += a  = " + c );
        c -= a ;
        System.out.println("c -= a = " + c );
        c *= a ;
        System.out.println("c *= a = " + c );
        a = 10;
        c = 15;
        c /= a ;
        System.out.println("c /= a = " + c );
        a = 10;
        c = 15;
        c %= a ;
        System.out.println("c %= a  = " + c );
        c <<= 2 ;
        System.out.println("c <<= 2 = " + c );
        c >>= 2 ;
        System.out.println("c >>= 2 = " + c );
        c >>= 2 ;
        System.out.println("c >>= 2 = " + c );
        c &= a ;
        System.out.println("c &= a  = " + c );
        c ^= a ;
        System.out.println("c ^= a   = " + c );
        c |= a ;
        System.out.println("c |= a   = " + c );
    }
}

/*
   以上实例编译运行结果如下:
   c = a + b = 30
   c += a  = 40
   c -= a = 30
   c *= a = 300
   c /= a = 1
   c %= a  = 5
   c <<= 2 = 20
   c >>= 2 = 5
   c >>= 2 = 1
   c &= a  = 0
   c ^= a   = 10
   c |= a   = 10
*/

条件运算(三元运算符)符实例

public class Operator {
    public static void main(String[] args){
       int a , b;
       a = 10;
       // 如果 a 等于 1 成立,则设置 b 为 20,否则为 30
       b = (a == 1) ? 20 : 30;
       System.out.println( "Value of b is : " +  b );
 
       // 如果 a 等于 10 成立,则设置 b 为 20,否则为 30
       b = (a == 10) ? 20 : 30;
       System.out.println( "Value of b is : " + b );
    }
}

/*
   以上实例编译运行结果如下:
   Value of b is : 30
   Value of b is : 20
*/

自增自减运算符

  • 自增(++)自减(--)运算符是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算,而自增自减运算符是一个操作数。
  • 前缀自增自减法(++a,--a): 先进行自增或者自减运算,再进行表达式运算。
  • 后缀自增自减法(a++,a--): 先进行表达式运算,再进行自增或者自减运算。

实例:

public class selfAddMinus{
    public static void main(String[] args){
        int a = 5;//定义一个变量;
        int b = 5;
        int x = 2*++a;
        int y = 2*b++;
        System.out.println("自增运算符前缀运算后a="+a+",x="+x);
        System.out.println("自增运算符后缀运算后b="+b+",y="+y);
    }
}

/*
    自增运算符前缀运算后a=6,x=12
    自增运算符后缀运算后b=6,y=10
*/

短路逻辑运算符

当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。

实例:

public class LuoJi{
    public static void main(String[] args){
        int a = 5;//定义一个变量;
        boolean b = (a<4)&&(a++<10);
        System.out.println("使用短路逻辑运算符的结果为"+b);
        System.out.println("a的结果为"+a);
    }
}

/*
    使用短路逻辑运算符的结果为false
    a的结果为5
*/

包机制

包的作用

  • 1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
  • 2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
  • 3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。

包语句的语法格式为:

package pkg1[.pkg2[.pkg3…]];

一般利用公司的域名作为包名。

为了能够使用某一个包的成员,我们需要再Java程序中明确导入该报,使用import语句可以完成此功能。

推荐搜索阿里巴巴开发手册

创建包

创建包的时候,你需要为这个包取一个合适的名字。之后,如果其他的一个源文件包含了这个包提供的类、接口、枚举或者注释类型的时候,都必须将这个包的声明放在这个源文件的开头。

包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。

如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。

import 关键字

为了能够使用某一个包的成员,我们需要在 Java 程序中明确导入该包。使用 "import" 语句可完成此功能。

在 java 源文件中 import 语句应位于 package 语句之后,所有类的定义之前,可以没有,也可以有多条,其语法格式为:

import package1[.package2…].(classname|*);

如果在一个包中,一个类想要使用本包中的另一个类,那么该包名可以省略。

注意:

类文件中可以包含任意数量的 import 声明。import 声明必须在包声明之后,类声明之前。


JavaDoc

详情请查看:Java文档注释教程

可以通过 -encoding UTF-8 -charset UTF-8 来显示加载中文。