重学Java二之程序设计基础(Java基础语法)

Java基础语法

变量的命名

帕斯卡命名法:一个变量由多个单词构成时,每个单词首字母都大写【类名、接口名、枚举名】
驼峰命名法:一个变量由多个单词组成时,第一个首字母小写,其余单词首字母都大写【变量名、方法名】
1、标识符
什么是标识符?

就是程序中起名字的地方。

用在哪?

类/接口、变量、方法、包、参数

有什么讲究?【静态方法不能访问静态变量】

语法规范:违反规范会发生编译错误

  • 标识符区分大小写,理论上没有长度限制

  • 由字母、数字、下划线或美元符号组成

    疑惑:中文行不行?经测试,可以,字母不单纯指英文字母,还代表其它语言字母

    ​ 中文符号 ¥ 可以吗? 经测试,可以,

    ​ 但是一般按规范都是用英文符号和字母来书写代码的

  • 标识符的首字母由字母、下划线或美元符号开头,不能以数字开头

  • 标识符的命名不能使用关键字(全是小写的)、布尔值(true、false)和 null

    怎么保证不和关键字冲突?

    ​ 不要纯小写就解决了啊!

默认的编程规范来指导标识符命名:
  1. 类/接口:

    1. 类名首字母大写
    2. 使用多个单词时每个单词首字母都大写
    3. 实体类一般一个单词命名(用来存储数据的类)/‘;;
    4. 多数情况下,多个单词的第一个大多是名词来表达操作的对象【e.g:StudentDao、StudentImpl等】
  2. 变量:

    1. 变量首字母小写
    2. 一个字母:循环变量 for (i=1; i<10; i++){...}
    3. 一个单词:局部变量或者实体性的成员变量 类名:Student--》变量名:student
    4. 多个单词:
  3. 方法:

    1. 首字母小写,方法名
    2. 动词 + 宾语的结构 e.g:addStudent()
  4. 包:

    1. 为啥要有包?包是干啥的?

      • 包装类和接口
      • 给类分组的(给类价格前缀)
    2. 纯小写,类似于倒置的域名,用点隔开 e.g:com.kfm.bean 【公司.名字全拼.功能】指实体类包

  5. 参数:

    • 纯小写
    • 参照局部变量命名规则
扩展:阿里编程规范(为什么这么规定?我不用会怎么样?挑挑毛病?)
  • 命名分格

    • 代码中命名均不能以下划线和美元符开始以及结束(代码看起来不够优雅,可读性差)
    • 命名严禁使用拼音与英文混合的方式,不允许直接使用中文(英文拼写和语法让阅读者易于理解,避免歧义,通用的拼音国际名称可以【taobao \ alibaba】)
    • 类名使用驼峰命名【UpperCamelCase
    • 方法名、参数名、成员变量、局部变量统一使用帕斯卡命名【getHttpMessage() \ inputUserId
    • 常量命名全部大写,单词间用下划线隔开,语义表达完整,不嫌名字长【MAX_STOCK_COUNT
    • 抽象类命名使用Abstract或者Base开头;异常类命名使用Exception结尾;测试类以测试的类开头,Test结尾。【见其明知其意】
    • 中括号是数组类型的一部分:【String[] args; 反对 String args[];
    • 包名统一使用小写,点分隔符之间有且只有一个自然语义英语单词。包名统一使用单数形式,如果类名有复数含义,类名可以使用复数。【com.kfm.open.util MessageUtils
  • 常量定义

    • 不允许任何未经定义的常量直接出现在代码中
    • long或者Long初始赋值时,必须大写L,小写的容易和数字1混了
  • 代码风格

    • 大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果 是非空代码块则:

      1) 左大括号前不换行。

      2) 左大括号后换行。

      3) 右大括号前换行。

      4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。

    • 左右小括号与括号内的字符之间不加空格

    • 任何二目、三目运算符的左右两边都需要加一个空格

    • 缩进采用 4 个空格,禁止使用 tab 字符

      public static void main(String[] args) {
          //缩进四个空格
          String say = "Hello";
          // 运算符的左右必须有一个空格 
      	int flag = 0; 
      	// 关键词 if 与括号之间必须有一个空格,括号内的 f 与左括号,0 与右括号不需要空格 
      	if (flag == 0) { 
      		System.out.println(say); 
      	} 
       
      	// 左大括号前加空格且不换行;左大括号后换行 
      	if (flag == 1) { 
      		System.out.println("world"); 
      	// 右大括号前换行,右大括号后有 else,不用换行 
      	} else { 
      		System.out.println("ok"); 
      	// 在右大括号后直接结束,则必须换行 
      	}
          
      }
      
2、关键字

全部都是小写

abstractassertbooleanbreakbyte
casecatchcharclassconst
continuedefaultdodoubleelse
enumextendsfinalfinallyfloat
forgotoifimplementsimport
instanceofintinterfacelongnative
newpackageprivateprotectedpublic
returnstrictfpshortstaticsuper
switchsynchronizedthisthrowthrows
transienttryvoidvolatilewhile

Java注释

1、单行注释
//书写在一行的注释  用 ‘//’  在Eclipse中快捷键 Ctrl+/
2、多行注释
/*
 * 多行注释  
 * 在Eclipse中 鼠标选中需要注释的代码 Ctrl+Shift+/
 */
3、文档注释
概念:

如果想为程序生成像官方的JDK文档一样的文件,可以使用文档注释对代码进行注释,并通过 javadoc 命令生成注释文件。

/**
 *测试文档的注释
 *@author 作者
 *@paramete 参数及其意义
 *@return 返回值
 *@version 版本
 */
案例:生成一个java文档

1.一个java文件

public class Introduce{
    /**
     *文档注释
     *@author bigdata7
     *@version 1.0
	 *@param args :字符串数组参数名[]
	 *String是指参数类型 中括号可以在args后面也可以在String后面
     */
    public static void main(String[] args){  //java运行入口函数
        System.out.println("Hello World!");
    }

}

2.生成java文档【一个文件夹里面有许多文件,会生成一个网页式的】

D:\kaifamiao\java se\coding\0825>javadoc Introduce.java
正在加载源文件Introduce.java...
正在构造 Javadoc 信息...
标准 Doclet 版本 11.0.2
正在构建所有程序包和类的树...
正在生成.\Introduce.html...
正在生成.\package-summary.html...
正在生成.\package-tree.html...
正在生成.\constant-values.html...
正在构建所有程序包和类的索引...
正在生成.\overview-tree.html...
正在生成.\index-all.html...
正在构建所有类的索引...
正在生成.\allclasses-index.html...
正在生成.\allpackages-index.html...
正在生成.\deprecated-list.html...
正在构建所有类的索引...
正在生成.\allclasses.html...
正在生成.\allclasses.html...
正在生成.\index.html...
正在生成.\help-doc.html...

D:\kaifamiao\java se\coding\0825>

数据类型

为什么分这么多类信息:计算机的内存空间有限,所在在使用数据类型时 量入为出

为什么1byte是8个字节 (2的8次方 256 分开加符号位 ) -128((-2)^7) ~ 127((2^7)-1)范围

1byte = 8bit

E是9位

原码、反码、补码:
机器数:

一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。

 3 :我们很清楚,3 的二进制数是 0000 0011
+3 :最高位标识正负 +是0,-是1,所以 +3 的机器数是 :0000 0011 【第一个符号位】
-3 :机器数:1000 0011 【最高位第一位标识符号,负为1】
真值:

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。

例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。

所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。

	0000 0001的真值 = +000 0001 = +1
	1000 0001的真值 = –000 0001 = –1

对于一个数, 计算机要使用一定的编码方式进行存储,原码, 反码, 补码是机器存储一个具体数字的编码方式。

原码:

概念:原码就是真值的符号位加上真值的绝对值,即用第一位表示符号位,其余位表示值。

理解:原码就是一个数的真值(二进制表达的最高位来表示符号位,负1,正0)

[+1]原 = 0000 0001
[-1]原 = 1000 0001
反码:

概念:正数的反码是本身;负数的反码是符号位不变,其余位取反

[+3]反 = 0000 0011
[-3]反 = [1000 0011]原 = 1111 1100
[-1]反 = [1000 0001]原 = 1111 1110
补码:

概念:正数的补码是本身;负数的符号位不变,其余位取反,再加1

理解:即正数的原码、补码、反码三码相同;负数的补码是反码基础上最后跟1

[+3]原 = 0000 0011				[-3]原 = 1000 0011
[+3]反 = 0000 0011				[-3]反 = 1111 1100
[+3]补 = 0000 0011				[-3]补 = 1111 1100 1
原因:

为了解决原码做减法的问题, 出现了反码;

使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数,这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].【java补码存储】

常量:

【立即量,编译过程中就可以确定的值】

  • 根据场景合理选择数据类型

    类型例子说明
    int1234默认整数
    long12345678901L大小写都行
    double3.14默认小数
    float2.14F大小写F
    String“字符串”引用类型字符串常量
    booleantrue\false布尔类型
    Objectnull标识没有对象
基本数据类型
数值类型

默认小数类型是double,float需要后面加f;整数超过一定值是long,要在后面写l来标明是long类型,否则会报编译错误

  • 精确类型

    • byte【1个字节(byte),8位有符号数】
    • short【】
    • int【4字节,32位有符号数】
    • long【8字节,64位有符号数 19位10进制】
  • 浮点类型

    • float【4字节,32位有符号数 -3.4E38 ~ 3.4E38】后缀F

      为什么float用4字节,表示范围大于8字节的long?

      float一定是不精确的 【符号位 指数 (小数位)尾数】

    • double【8字节,64位有符号数 -1.7E308 ~ 1.7E308】后缀D

字符类型(char)【2字节,16位unicode字符 0~65535】

占两个字节 只能存一个字符 可以是中文 可以用数字赋值

注意区分char(单引号)和String的区别 String双引号

布尔类型(false、true)【1字节】

String转换不成布尔类型 int无法转换为布尔类型

引用数据类型
  1. 数组(Array)
  2. 类(Class)
  3. 接口(Interfacer)

基本数据类型的转换

7中基本数据类型之间可以互转,boolean类型无法和其余7中转换
默认转换(小转大):
  • 赋值,小的数据类型会转换成大的数据类型(这里的大小指表示范围,而不是占用空间)

  • 进行运算:小数据类型先转换成大数据类型,再进行计算

  • 见串得串:和字符串(String)运算时,结果还是字符串

  • 默认提升:比int类型小的数据类型(byte, short【2byte】,char【2byte】)在运算过程中会先转换成int再进行运算

    byte byte1 = 2;
    short short1 = 2;
    
    byte byte2 = byte1 + short1; //它们运算是先转换成int再运算的,结果还是int
    //-->会报错   应该是int类型强制转换成byte
    byte byte2 = (byte)(byte1 + short1);
    
    char char1 = 'a';		//97
    int int2 = 'a' + 1;		//98
    char1++;				//char可以自加
    char1+=1;				//char可以加等
    
  • 常量:立即量,编译过程中就可以确定的值

    final x1 = 1111;//这不是常量,是不可变变量
    int int1 = 12345678901;//不合适  太大超出范围
    long long1 = 12345678901;//也不合适
    long long2 = 12345678901L;//表示long型常量  后边L大写一般,小写和1容易混淆
    
  • 不默认提升:

    • 编译优化:byte byte1 = 24 + 1; —>优化 byte byte1 = 25;
    • 自加操作:byte1++;
    • 加等操作:byte1+=2;
  • 强制转换(大转小):

    • 大小还是指表示范围

    • 坑多,会损失精度

    • 强转运算

      补码存储

      int int1 = 1;
      short short1 = (short)int1;
      
合理选择数据类型
  1. 使用场景,用户需求
  2. 合理的值域
  3. 操作的方便性
  4. 资源稀缺性(内存,存储,网络传输)

运算符

ctrl + 1 快速修正

运算符就是告诉程序执行特定的运算操作的符号。

Java运算符按功能可分为:赋值运算符、算数运算符、关系运算符、逻辑运算符、条件运算符(三目运算)和位运算符。

赋值运算

赋值运算符 “ = ” 用于给变量赋值。可以和算术运算符结合,组成复合赋值运算符(+=、-+、*=、/=、%=、&=、|=、)

示例
int i=3;
int j=5;
i = i + j;  //可以用 i+=j;代替  一般写作
注意(小贴士):
byte b1 = 1;
byte b2 = 2;
/*
 *使用 +=  时不进行类型转换  b1+=b2  b1还是byte类型
 *使用 + 时需要类型转换  b1 = (byte)(b1 + b2);  才合适 byte余byte运算是int类型
*/

算术运算
概念:

许多语言中的取模运算只能用于整数型,Java对此做了扩展,它允许对浮点数进行取模操作。例如,3%2 的结果是 1, 15.2%5 的结果是 0.2。取模操作还可以用于负数,结果的符号与第一个操作数的符号相同,例如,5%-3 的结果是 2,-5%3 的结果是-2。

符號:

算术运算符包括通常的加(+)、减(-)、乘(*)、除(/)、取模(%),完成整数型和浮点型数据的算术运算。

特殊:

此外,算术运算符还有“++”和“–”两种,分别称为加1和减1运算符。这两种运算符有前缀形式和后缀形式,含有有所不同。例如,i++ 和 ++i 的执行顺序是不一样的,i++ 在 i 使用之后再 +1,++i 在 i 使用之前先 +1。i-- 和 --i 的情况于此类似。

//	加、减、乘、除、取余、自增(先执行,后自加)、自减(+、-、*、/、%、++、--)
int a = 1;
int b = 2;

System.out.println(a/b);//算术值应该是0.5  会转成int类型出来0
System.out.println(a%b);//余数0.5   出来0
System.out.println(b%a);//余数1

System.out.println(b++);//先输出b,后在使用时自加
System.out.println(++b);//先自加 后执行
System.out.println(b--);//先执行输出,后在使用时自减
System.out.println(--b);//先自减 后执行

int i=1;
i++;//i=1
i--;//此时 i=1+1 使用i则先把上次的i++运算做了  i=2 然后i--不运算 此时i为2 
--i;//此时 i=2-1 使用i之前做上次的i--运算 再直接自减 不用先输出i再自减了  此时i=0
关系运算【比较运算符】
  • 关系运算符都是二元(两个操作数)运算符。

    比较运算符运算完返回布尔值(true或false)

    • == 和 != 可以用于任何数据类型,之后的只能用于数值类型
    • == 和 != 既可以判断两个数的值是否相等,也可以判断对象或数组的实例是否相等。判断实例时比较的是两个对象在内存中的引用地址是否相等。

    “==” 是等于运算符 “=” 是赋值运算符

    运算符含义示例结果
    ==等于2==3false
    !=不等于2!=3true
    >大于2>3false
    <小于2<3true
    >=大于等于2>=3false
    <=小于等于2<=3true
逻辑运算
符号:

逻辑与(&)、逻辑或(|)和逻辑非(!)

短路逻辑运算符(&&、||):

当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。同理,左边操作数为false,则短路或的右边也是false,则右边不进行运算。

  • 什么情况下使用短路逻辑运算符:【防止空指针保护】
三目运算(目是操作数)【条件运算符】
  • 三个操作数,简化分支结构
  • 语法:布尔表达式 ? 表达式1 :表达式2;
  • x = 2 < 3?2:3; 输出x=2.
位运算
  • 位运算符用来对二进制位进行操作,包括按位取反(~)、按位与(&)、按位或(|)、异或(^)、右移(>>)、左移(<<)和无符号右移(>>>)。位运算符只能对整数型和字符型数据进行操作。

    1. 取反(~)

    参加运算的一个数据,按二进制位进行“取反”运算。

    运算规则:~1=0; ~0=1;

    即:对一个二进制数按位取反,即将0变1,1变0。

    2. 按位与(&)

    参加运算的两个数据,按二进制位进行“与”运算。

    运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;即:两位同时为“1,结果才为“1,否则为0。

    例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3 & 5的值得1。

    3. 按位或(|)

    参加运算的两个对象,按二进制位进行“或”运算。

    运算规则:0 | 0=0; 0 | 1=1; 1 | 0=1; 1 | 1=1;

    即 :参加运算的两个对象只要有一个为1,其值为1。

    例如:3 | 5,即 0000 0011 | 0000 0101 = 0000 0111 因此,3 | 5的值得7。

    4. 异或(^)

    参加运算的两个数据,按二进制位进行“异或”运算。

    运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

    即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

    5. *左移(<<)*

    运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。例如: 12345 << 1,则是将数字12345左移1位:

    位移后十进制数值变成:24690,刚好是12345的二倍,所以有些人会用左位移运算符代替乘2的操作,但是这并不代表是真的就是乘以2,很多时候,我们可以这样使用,但是一定要知道,位移运算符很多时候可以代替乘2操作,但是这个并不代表两者是一样的。

    6. 右*移(>>)*

    同样,还是以12345这个数值为例,12345右移1位: 12345>>1。

    右移后得到的值为 6172 和int 类型的数据12345除以2取整所得的值一样,所以有些时候也会被用来替代除2操作。另外,对于超过32位的位移,和左移运算符一样,,会先进行位数求余数。

  • 7. 无符号右移(>>>)*

    无符号右移运算符和右移运算符是一样的,不过无符号右移运算符在右移的时候是补0的,而右移运算符是补符号位的。以下是-12345二进制表示:

    右移运算符中,右移后补0,是由于正数 12345 符号位为0 ,如果为1,则应补1。

package com.bigdata.practice0827;

public class OptionalTestDemo {
	
	public static void main(String[] args) {
		//算术运算 + 赋值运算(=)
		//test1();
		
		//比较运算符
		//test2();
		
		//逻辑运算符
		test3();
	}

	private static void test3() {
		/*
		 * 逻辑运算符:用于对两个布尔值进行运算 结果还是布尔值
		 * &:与  理解:必须均为true才为true 【什么和什么】
		 * |:或  理解:必须全为false才是false 【要么什么、要么什么】
		 * !:非  理解:取反 !true结果为false
		 * &&:短路与  理解:左边全为false,则必为false右边不进行计算
		 * ||:短路或	 理解:左边全为true,则必为true右边不进行计算
		 * */
		
		//使用短路运算能够避免空指针的错误
		System.out.println(true&&outBool());  //true 短路与 右边为真则真【需要右边联合判断】
		System.out.println(!true&&outBool());  //短路与 一旦左边false  则结果必是false 不会运行右边的
		
		
	}
	
	private static boolean outBool() {
		System.out.print("我运行了");
		return true;
	}

	private static void test2() {
		/*
		 * 比较运算符:==(等于),!=(不等于),>,<,>=,<=
		 * 注意区分 == 与 = 的区别,一个是比较运算符等于,一个是赋值运算符
		 * <,>,<=,>= :只能比较数值类型的  优先级高于 == 和 !=
		 * == , != :支持所有数据类型的比较
		 * 关系表达式的运算结果是 boolean类型的值 (true和false)
		 * 
		 * */
		System.out.println(3>=5==false);  // 3>5 是 false,false与false比较结果是正确即true 
		
	}

	private static void test1() {
		// TODO Auto-generated method stub(待办列表的意思)
		/*
		 * 算术运算:+、-、*、/、%、++、--
		 * */
		int a=1;	//给局部变量 a赋值为1
		int b=2;
		String str="字符串";
		byte b1=4;
		byte b2=5;
		
		System.out.println(b1+b2);	//进行 b1+b2 运算时 先转为 int 类型再运算 出来是 int 类型的数据 
		System.out.println(b1=(byte)(b1+b2)); //b1=b1+b2 会报错 它们值是int类型的赋给了byte类型的变量 所以需要强转
		
		System.out.println(b1+=b2); //b1+=b2 指的就是 b1+b2  但是用 += 运算在运算时不会做转换类型操作 结果还是byte类型
		
		//System.out.println(a/b);	// 1/2=0.5 取整数位 0
		//System.out.println(b/a);	// 2/1=2
		//System.out.println(a%b);	// 1%2 余数为1
		//System.out.println(b%a);	// 2%1 余数为0
		
		System.out.println(a++);	// 1+1=2 先输出a  再进行自加 即输出a=1,但此时a的值已经是2
		System.out.println(a);		// a=2

		System.out.println(++a);	// a=2 的基础上 ++a 自增 即此时 a=3 ,++a表示a先自加1再输出 所以 a=3
		System.out.println(a);		// a=3

		// 同理 --在后 输出时先输出再自减  --在前面先自减再输出
		System.out.println(a--);	// a=3 先输出即输出a=3  但同时a已经自减为2  下面再输出
		System.out.println(a);		// a=2
		System.out.println(--a);	// 先a=2-1再输出a 此时a=1
		
		System.out.println(a+str);	// 输出字符串 "1字符串"  加号中使用字符串 结果则是字符串的连接
	}
}

运算符的优先级:

操作数越少优先级越高

优先级从高到低 同级从左到右
在这里插入图片描述

键盘输入:

从键盘导入数据要使用 Scanner 类的方法获取用户从键盘输入的数据。

Scanner類:
1.导入:import java.util.Scanner;
2.创建对象:Scanner scanner = new Scanner(System.in);
3.从键盘上获取用户输入的数据:
方法名称说明
String next()获得一个字符串
int nextInt()获得一个整数
doublenextDouble()获得一个双精度浮点数
boolean hasNext()判断是否有输入数据,输入则返回true,不然返回false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值