java学习2
继续学习了一些基础的语法内容知识
数据类型扩展
- 整数进制标识
int a = 010; //8 八进制 0开头
int b = 0x10; //16 十六进制 0x开头
int c = 10; //10 十进制 0-9 A-F
- 浮点数进制标识
float A = 1.0;
float B = 1.0;
- 如果进行比较 A与B 大小是不同的,因为float类型表征的是有限离散型数值,它与实际数值会有误差,可以理解为接近但不等于
- 如果面向银行等需要精确数值运算的业务,需要使用 BigDecimal 类型
- 最好完全避免使用浮点数进行比较
- 强制转换
char o = 'a';
char p = '中';
System.out.println(o);
System.out.println(p);
System.out.println((int)o); //强制转换
System.out.println((int)p); //强制转换
System.out.println('\u0061');//unicode编码 转义字符
boolean flag = true;
if(flag == true){ //1
}
if(flag){ //2 1与2是等价的 即flag==true 与 单个flag是等价的
}
- 转义字符
- 后续思考(对象内存?)
System.out.println(dd);
String s1 = new String("Hello, world!");
String s2 = new String("Hello, world!");
String s3 = "Hello, world";
String s4 = "Hello, world";
System.out.println(s1 == s2);
System.out.println(s3 == s4);
//对象和内存
类型转换
注:运算中,不同类型的数据先转换为同一类型,然后进行运算
- 不能对布尔值进行转换
- 不能把对象类型转换为不相干的类型
- 在高容量转换为低容量的时候强制转换(高->低,强制转换; 低->高,自动转换)
- 转换的时候可能存在内存溢出或精度问题
扩展:
- 数字可以用下换线分割
int a = 10_0000_0000;
int b = 1000000000; //a与b等价 JDK7之后
- 溢出问题及解决
int year = 20;
int out = year * a; //int溢出
System.out.println(out);
long out1 = year * a; //默认是int进行运算,算完后才转换为long,所以有溢出
System.out.println(out1);
long out2 = (long)a * (long)year; //强制转换无溢出
System.out.println(out2);
//结果
//-1474836480 溢出
//-1474836480 溢出
//20000000000 成功
书写规范:long类型后面需要加L(l),为方便与1区分,一般都用大写的L
变量
变量定义
- java是一种强类型语言,每个变量都必须声明其类型
- java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域
- 理解:变量指代的是一块内存空间,空间需要指定存储类型,并对变量名进行定义便于区分,其中存储着变量的值
type varName [=value] [,varName[=value]];
// 数据类型 变量名 = 值;可以用逗号隔开来声明多个同类型的变量,但是不建议(可读性差),一行最好定义一个变量
- 每个变量都有类型,可以是基本类型,也可以是引用类型
作用域
- 类变量
- 实例变量
- 局部变量
- 下面给出具体程序举例说明
public class demo02 { //类
static double salary = 200; //类变量,从属于类,与类一起出来一起消失
int year; //实例变量
double money;
boolean flag;
String name;
public static void main(String[] args){ //方法
int a = 1; //局部变量
System.out.println(a);
//实例变量调用 变量类型 变量名字 = new demo02
demo02 d2 = new demo02();
System.out.println(d2.year);
System.out.println(d2.money);
System.out.println(d2.flag);
System.out.println(d2.name);
//实例变量结果
//0 int默认值
//0.0 double默认值
//false 布尔 默认值
//null 字符串默认值
//除了八大基本类型,其余默认值都为 null
// 如果直接调用实例变量会出错
//System.out.println(flag);
//类变量
System.out.println(salary);
}
public void add(){ //另一种方法
// System.out.println(a); // 出错!局部方法局限于方法内,不能在另一个方法内输出
}
}
常量
注:初始化之后不能再改变值!值不再变动;特殊的变量,被设定之后,程序运行过程中不允许改变
定义:final 常量名 = 值
例: final double Pi = 3.1415926;
拓展
- 修饰符不存在先后顺序,如static final 与 final static效果是一样的
- 各类的变量方法和类名命名规范
- 所有变量、方法、类名都需要做到,见名知意
- 类成员变量:首字母小写和驼峰原则,monthSalary
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线 MAX_SPEED
- 类名:首字母大写和驼峰原则,GoodMan
- 方法名:首字母小写和驼峰原则
运算符
总览
-
ctrl + D 复制当前行到下一行(IDEA快捷键)
-
整数运算时,如果式子里有long,则结果为long类型;如果没有(int byte short)不论元素为哪种类型,结果都为int型
-
关系运算符返回布尔值
自增自减
- 自增的位置区别
int a = 5;
int b,c ;
b = a++; //执行完这行语句,先将a=5赋给b,之后再进行a自增即a=a+1
c = ++a; //执行语句前,先将a自增,再将自增后的1赋给c
//结果
//b = 5,c = 7
短路运算
- 短路运算,如果已经判断出结果则不会执行后边的运算
//短路运算!!
int c = 5;
boolean d;
d = (c>5) && (c++ <10);
System.out.println(c);
System.out.println(d);
//结果
// 5 (短路运算,如果已经判断出结果则不会执行后边的运算)
//false
位运算
& | ~
举例:
a = 0011 0100;
b = 0101 1010;
a & b = 0001 0000; //逐位进行与运算
a | b = 0111 1110;//逐位进行或运算
~b = 1010 0101; //逐位取反
<< >>
<<向左移位,反之向右移位
举例:计算2x8
- 对于计算机而言,就此题而言,运算效率最高的方式是移位进行操作,因为是直接的底层运算
即2x8 = 2x2x2x2;
System.out.println(2<<3);
/* 移位运算
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
0001 0000 16
*/
三元运算符
举例: a ? b : c
意思:a是否为true?如果为true则输出b,如果为false则输出c
运算符优先级
拓展
-
幂运算:Math.pow(a,b) 即表示 a^b
-
字符串连接符
如果在输出时,“+”运算符左右两侧有一侧为字符串,则自动将结果转换为字符串,顺序有说法。如下例:
int a = 10; int b = 20; System.out.println(a+b); System.out.println(""+a+b); //字符串拼接 System.out.println(a+b+""); //结果为30,但类型为字符串 //结果 //30 //1020 //30
包机制
-
目的:类似文件夹,防止命名空间重复。具体来说,为了更好组织类,java提供了包机制,用于区别类名的命名空间
-
包语句的的语法格式
package pkg1[.pkg2[.pkg3..]]
-
一般利用公司域名倒置作为包含。例如www.baidu.com,我们在创建包时候为com.baidu.www
-
为了使用某一个包的成员,我们可以在java中明确导入包。可用 import 语句
import package1[.package2...].(classname|*); // * 意思就是调用该包下所有的包成员
-
代码书写规范:阿里巴巴开发手册