Java基本语法知识要点

0x00

  一个源文件中有多少个类,在用javac编译后,在同一目录下将产生多少个对应的字节码文件(.class )。类里面不一定要有public static void main(String[] args){}.但是只有存在main方法的类才能够被独立运行,而且一个类里最多只能有一个main方法。

0x01

  配置环境变量的用意就是方便在任意路径下执行特定的可执行文件。path中的值,系统会从前往后来遍历它们中的可执行文件。在classpath中的值:classpath=.;c:;d:\中,点表示当前路径,而且在最后一个路径后面没有分号。那么JVM在找类时,按照当前目录-->C盘-->D盘的顺序遍历。如果classpath=c:;d:;,即在最后加了分号则在遍历完了D盘后如果还没有找到要执行的类文件,则检索当前路径。

0x02

  关键字均小写,类名每个单词首字母大写.

0x03 文档注释

/**
。。。
*/

一般放在开头

0x04

  多行注释别嵌套多行注释

0x05 标识符

  标识符使用26个字母(严格区分大小写),下划线_和美元符号$,不可以以数字开头。main虽然不是关键字,但是却被虚拟机视为程序入口。

0x06 Java中的名称规则

  • 包名:多单词组成时所有字母都小写 xxxyyyzzz

  • 类名接口名:所有单词首字母大写

  • 变量名和函数名:第一个单词首字母小写,第二个单词开始每个单词首字母大写

  • 常量名:所有字母都大写,每个单词间用下划线连接。如XXX_YYY_ZZZ

0X07 常量

  • 单字符要使用单引号包起来‘’;

  • 字符串要使用双引号包起来“”;

  • null常量,只有一个数值就是null;

  • 布尔常量:true,false;

  • 八进制整数用0(零)开头;

  • 十六进制用0x开头

  • 十进制转二进制:Interger.toBinaryString(60)

  • 二进制负数为二进制绝对值取反+1;二进制负数最高位为1。

0x08 变量

  • 整数型:byte(一个字节),short(两个字节),int(四个字节),long(八个字节) 【默认情况下是int】

  • 浮点型:float(四个字节),double(八个字节) 【默认情况下是double】

  • 字符型:char(0~65355 两个字节)

  • 布尔型:boolean

以下为引用数据类型

  • 类:class

  • 接口:interface

  • 数组:[]

0x09 定义变量的格式

  数据类型 变量名 = 初始值;

float f = 2.1f;//因为默认情况下小数为double型,所以初始化float时要在小数后面加上f否则会报错损失精度。

double d = 12.34;

  注意:同一域内不能定义相同标识符的变量,即使他们数据类型不同。

0x0A 类型转换

  不同类型的变量(常量)不能直接运算。

  如

byte b = 3;

b = b+2;

会报错。在第二句,第一个大小小的操作数会被提升类型为大小大的操作数类型,即byte转为int,但运算结果无法精确地赋值给赋值符号左边的b。但是如果用b+=2;则不会报错。因为上面是运算和赋值,而这里是赋值。

0x0B 运算符

  如果用b = (byte)(b+2);就可以编译通过。

  +号也用来连接两个字符串。字符串数据和任何数据使用+连接,最终都会变成字符串。

  如 System.out.println("5+5="+5+5);打印5+5=55;

  如 System.out.println("5+5="+(5+5));打印5+5=10;

0x0C

  println这个ln就是用来换行的,如果用print则输出后不换行。

0x0D 转义字符

  • \n 换行

  • \r 回车 win中回车符用\r\n表示

  • \t 制表符

  • \b 退格

0x0E 逻辑运算符(用于连接布尔类型的表达式)

  • & AND

  • | OR

  • ^ XOR

  • ! NOT

  • && AND(短路) 区别是左操作数为假时不再看右操作数,直接判定为假

  • || OR (短路)

0x10 位运算符

  • >>n 右移n位

    右移后最高位补什么由原数据的最高位决定。如果原数据最高位是1,则用1补空位,如果最高位是0,则用0补空位。

  • <<n 左移n位

  • >>>n 无符号右移n位,无论最高位是什么,右移后都用0补空位。

  • & 与运算

  • | 或运算

  • ^ 异或运算 一个数异或同一个数两次,结果还是原来的数。常用于异或加密。

  • ~ 反码

0x11 练习

  需求:不使用第三个空间的情况下,交换两个变量值

  思路:使用异或(技巧性方式)

	class Swap
{
public static void main(String[] args)
{
int a=13,b=31;
System.out.println("a="+a+",b="+b);
a = a^b;
b = a^b;
a = a^b;//这种方法发现赋值号右边都一样。
System.out.println("a="+a+",b="+b);
}
}

0x12 三元运算符

  m=(条件表达式)?表达式1:表达式2;

  简化了if-else结构

0x13 switch语句

  switch(){} 小括号里面的类型可以是byte,short,int,char.

  在花括号中,不管default:放在什么位置,都不先执行default,而从上到下从第一个case开始。所有case都不满足才执行default。如果default后面没有马上遇到break或者}且后面还有case,则不管后面的case是否匹配,都将被依次执行,直到碰到break或}.如:

	class Demo
{
public static void main(String[] args)
{
int a=13;
switch(a)
{
case 1:System.out.println(1);
default : System.out.println("default");
case 12:System.out.println(13); } }
}

output:

	default

	13

  注:如果有多个选项的执行语句相同,可以把这些case写在一块,如

	case 1:

	case 2:

	System.out.println("hello world");

0x14 循环结构

while(判断条件)
{
循环体
} do
{
循环体
}
while(判断条件) for(初始化表达式1,初始化表达式2,...;循环条件;循环后的操作表达式1,循环后的操作表达式2,...)
{
循环体
}//循环条件为空语句是,默认结果为true. /* for(;;){}是最简单的for循环 */

0x15 foreach循环

  无需获得数组或集合的长度,无需循环条件,无需根据索引(下标)就能遍历每一个元素。语法格式如下:

	for(type variableName:array){}

  variableName自动迭代访问每一个元素,这个variableName是用户为了用这种类型的循环自己起的临时变量。每个元素在访问到时值被赋给这个变量,因此这种循环体里的操作不能改变数组或集合的值。这个临时变量的作用域就在这个循环体内,出了循环体这个变量就用不了了。如果希望改变数组元素的值,则不能使用这种foreach循环。如果要打印每一个元素,还是可以用一用的。

0x16 练习

  需求:九九乘法表

  思路:使用for循环嵌套

class Demo
{
public static void main(String[] args)
{ for(int i=1;i<10;i++)
{
for(int j=1;j<=i;j++)
{
System.out.print(j+"*"+i+"="+(i*j)+"\t");
}
System.out.println();
} }
}

0x17 方法的定义

  格式:

修饰符 返回值类型 方法名(参数类型 形参1,参数类型,形参2,...)//可以没有形参
{
方法执行语句;
return 返回值;//当然,当定义时返回值类型是void,则return可以不写。
}

  如:

public static int getResult(int n)
{
return n*n;
}
//注意:方法中只能调用方法,不能再方法中定义方法。

0x18 方法的重载overload

  在同一个类中,允许存在一个以上的同名函数,只要参数列表不同(特指形参个数或形参数据类型不同)就行。重载和返回值类型无关。也就是说返回值类型不同也可能重载。

  当定义的功能相同但参与运算的参数不同,那么这时就定义一个函数名称以表示其功能方便阅读。

0x19 数组的定义

  格式1: 元素类型[] 数组名 = new 元素类型[数组长度];

  如:

	int[] array = new int[100];

  格式2: 元素类型[] 数组名 = new 元素类型[]{元素0,元素1,...};

  如:

	int[] array = new int[]{1,2,3};

	int[] array = {1,2,0};

0x1A 内存结构

  Java程序运行时,虚拟机在内存开辟五个区域,分别时栈区、堆区、方法区、本地方法区和寄存器。

  栈区:用于存储局部变量,当数据使用完,所占空间会自动释放。也存放实体的引用。如数组名(数组基地址)【引用类型:如int[] array】

  堆区:数组和对象(都是实体),通过new建立的实例都放在堆区;每一个实体都有内存地址值;实体中的变量都有默认的初始化值(0);实体不在被使用时,会在不确定的时间内被垃圾回收器回收(垃圾回收机制)。

0x1B

  如果实参是一个实体,则在定义调用方法时,定义的形参应该是引用类型,如一个求数组中元素最大值的方法定义如下:

public static int getMax(int[] array){}

0x1C

  对数组的排序等操作,由于传参使用的是引用类型,所以定义方法时,返回类型用void即可。因为引用始终指向堆区中的那个数组首地址。

0x1D 练习

  需求:排序

  思路:选择排序

  源码:

class Demo
{
public static void main(String[] args)
{
int[] arr = {3,5,27,33,2,4,9,22,1,4,0,11};
printArr(arr);//打印数组
selectSort(arr);
printArr(arr); }
public static void selectSort(int[] array)//选择排序
{
for(int x=0;x<array.length-1;x++)
for(int y=x+1;y<array.length;y++)
{
if(array[x]>array[y])
{
int temp = array[x];
array[x] = array[y];
array[y] = temp;
}
}
}
public static void printArr(int[] array)//打印数组
{
System.out.print("[ ");
for(int i=0;i<array.length;i++)
{
System.out.print(array[i]);
if(i!=array.length-1)
System.out.print(", ");
else
System.out.print(" ");
}
System.out.println("]");
}
}

0x1E 练习

  需求:数组排序

  思路:冒牌排序

  步骤:大的往后放

  源码:

class Demo
{
public static void main(String[] args)
{
int[] arr = {3,5,27,33,2,4,9,22,1,4,0,11};
printArr(arr);
//selectSort(arr);
bubbleSort(arr);
printArr(arr); }
/*冒泡排序*/
public static void bubbleSort(int[] array)
{
for(int x=0;x<array.length-1;x++)
{
for(int y=0;y<array.length-x-1;y++)
if(array[y]>array[y+1])
{
int temp = array[y];
array[y] = array[y+1];
array[y+1] = temp;
}
}
} /*打印数组方法*/
public static void printArr(int[] array)
{
System.out.print("[ ");
for(int i=0;i<array.length;i++)
{
System.out.print(array[i]);
if(i!=array.length-1)
System.out.print(", ");
else
System.out.print(" ");
}
System.out.println("]");
}
}

0x20

  希尔排序是效率最高的排序算法

0x21

  用系统提供的排序,实际开发中要使用这个方法。需要import java.util.*;然后函数里面用 Arrays.sort(数组名);

0x22 如何用一个方法来互换一个数组中的两个元素呢?

 public static void swap(int[] arr,int a ,int b)

{
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
/*
注意,如果定义成public static void swap(int a ,int b){} 数组是不会被这个方法影响的,因为这个方法执行后,只是在栈区当中的swap下的a和b的值互换了一下,而跟堆区中的数组没有关系。因此在用方法置换数组元素值时,还要把数组引用作为参数进行传递。
*/

0x23 练习

  需求:十进制转二进制

  思路:使用对象

class Dec2Bin
{
public static void toBinary(int n)
{
StringBuffer sb = new StringBuffer();//创建一个对象
while(n>0)
{ sb.append(n%2); 用append添加到对象中
n/=2;
}
System.out.println(sb.reverse());
}
public static void main (String[] args)
{
toBinary(6);
}
}

0x24

  当定义了一个字符数组,默认填充\u0000,打印出来是空格。

0x25 练习

  需求:十进制转十六进制

class toHex
{
public static void toHex(int num)
{
StringBuffer sb = new StringBuffer();
while(num!=0)
{
int temp = num & 15;
if(temp>9)
//System.out.println((char)(temp-10+'A'));
sb.append((char)(temp-10+'A'));
else
//System.out.println(temp);
sb.append(temp);
num = num >>>4;//相当于除以16
}
System.out.println(sb.reverse());
}
public static void main(String[] args)
{
toHex(60);
}
}

0x26 练习

  需求:优化进制转换

  思路:调用同一的进制转换函数

class trans
{
public static void trans(int num, int base, int offset)
{
if(num==0)
{ System.out.println(0);
return ;
}
char[] index = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] array = new char[32];
int pos = array.length;
while(num!=0)
{
array[--pos] = index[num & base];
num=num>>>offset;
}
for(;pos<array.length;pos++)
System.out.print(array[pos]);
}
public static void toBin(int num)
{
trans(num,1,1);
}
public static void toHex(int num)
{
trans(num,15,4);
}
public static void toOctonary(int num)
{
trans(num,7,3);
}
public static void main(String[] args)
{
toBin(10);
toHex(10);
toOctonary(10);
}
}

0x27 二维数组

  • 定义格式一:

      int[][] 数组名 = new int[n][m];
  • 定义格式二:

      int[][] 数组名 = new int[n]][];

  每一个一维数组都是默认初始化值null;可以对这三个一维数组分别进行初始化:数组名[0]= new int[3];数组名[n-1]= new int[102]...

二维数组也可以使用 数组名.length返回长度。

  • 定义格式三:

      int[]][] 数组名 = {{1,2,3},{4,5}};

  *定义也可以是这样的:int y[][];int[] y[];

上一篇:网络转载:局域网安全:解决ARP攻击的方法和原理


下一篇:Linux入门之路