强类型语言
所有变量需要先定义才能使用
Java的数据类型分为2大类
- 基本类型
- 引用类型
整数拓展
二进制是0b开头 八进制是0 十六进制是0x
int i = 10;
int i2 = 010; //八进制0
int i3 = 0x10; //十六进制0x 0-9 A-F F就是等于16
system.out.printIn(i);
system.out.printIn(i2);
system.out.printIn(i3);
浮点数拓展
float f = 0.1f;
double d = 1.0/10;
system.out.printIn(f==d); //false
//-----------------------------------------------------------------
float f = 22222222222222222333333333332f;
float f2 = f + 1;
System.out.println(f == f2); //true
//这里相等的原因是因为float是有限的 离散的 有舍入误差,大约 接近但不等于
//最好完全避免使用浮点数进行比较,银行业务,金额相关用BigDecimal,因为浮点数会精度丢失
字符拓展
char c = 'a';
char c1 = '中';
System.out.println(c1);//中
System.out.println(c);//a
System.out.println((int)c);//强制转换 97
System.out.println((int)c1);//强制转换 20013
所有的字符本质就是数字
编码 Unicode 2字节 65536
char c3 = '\u0061'; //a
// \u是指unicode编码的0061,对应的就是字母a
//转义字符
// \t 制表符
// \n 换行
String s1 = new String("Hello World");
String s2 = new String("Hello World");
String d1 = "Hello World";
String d2 = "Hello World";
System.out.println(s1==s2);//false
System.out.println(d1==d2);//true
因为s1,s2是创建不同的对象,比较的是2个对象的内存地址值
而d1,d2都是用的常量池里的一个叫“Hello World”的字符串他们地址都是相同的,相当于d1,d2都指向了同一个地址
类型转换
- 由于java是强类型语言,所以进行某些运算时,需要用到类型转换
低 --------------------------------------------------高
byte,short,char > int > long > float > double
注意:小数优先级大于整数
-
运算中,不同类型的数据先转换为同一类型,再进行运算
-
强制类型转换发生在高转低,例如下图 由于是高转低所以要在i前加(byte)
int i = 128;
byte b = (byte)i;
如上述代码运算结果是 i = 128, b = -128,因为byte最大是127,所以内存溢出了,可以查看Byte的源码
强制转换 (类型)变量名 高-低
自动转换 低-高
- 自动类型转换是从低到高自动转换
注意点
- 不能转换布尔值
- 不能转换不相关的类型
- 把高容量转低容量需要强制转换
- 转换的时候可能存在内存溢出,精度问题
- 操作比较大的数值要小心内存溢出
jdk7新特性 数字之间可以用下划线分割,如
int i = 10000000000;
int i = 1000_0000_000;
//这样是一样的;
int money = 1000000000;
int years = 20;
int total = money*years;//-1474836480
long total2 = money*years;//-1474836480 默认是int,转换之前已经存在问题了,因为他是先运算再转换,所以运算就溢出了,需要改为先转换再运算
long total3 = money*((long)years);//200000000
变量
- 变量就是可以变化的量
- Java是一种强类型语言,每个变量都必须声明其类型。
- Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
作用域分为类变量,实例变量,局部变量
public class Variable{
static int all = 0; //类变量 需要加static
String str = “Hello World”; //实例变量 没有static
public void method(){
int i = 0; //局部变量 在方法里的变量
}
}
type varName = Value
注意:
- 每个变量都有类型,类型可以是基本类型,也可以是引用类型
- 变量名必须是合法的标识符
- 变量声明是一条完整的语句,因此每个声明都必须以分号结束
实例变量:从属于对象:如果不自行初始化,这个类型的默认值 整数是0 浮点数是0.0
布尔值默认是false,除了基本类型,其余的默认值都是null
常量
- 常量(Constant):初始化(initialize)后不能再改变值
- 所谓常量可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。
final 常量名 = 值;
final double PI = 3.14;
常量名一般使用大写字符。
//修饰符,不存在先后顺序 如:
static final double PI = 3.14;
final static double PI = 3.14;
变量的命名规范
- 所有变量,方法,类名:见名知意
- 类成员变量:首字母小写和驼峰原则:monthSalary
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写和驼峰原则:Man,GoodMan
- 方法名:首字母小写和驼峰原则: run(), runRun()
运算符
- Java支持如下运算符:
- 算术运算符:+,-,*,/,%,++,–
- 赋值运算符 =
- 关系运算符:>,<,<=,>=,==,!=
- 逻辑运算符:&&,||,!
- 位运算符:&,|,^,~,>>,<<,>>>
- 条件运算符 ? :
- 扩展赋值运算符 +=, -=,/=,*=
自增自减运算
int a = 3;
int b = a++; //执行这行代码后,先把A的值给B,然后再自增
sout(b);//3
int c = ++a;//执行这行代码后,先自增,再把值给C
位运算
A = 0011 1100
B = 0000 1101
A&B = 0000 1100 //00为0 11为1 01为0
A|B = 0011 1101 //00为0 ,有1为1
A^B = 0011 0001 //两个数相同为0,否则为1
~B = 1111 0010 //取反
2*8怎么运算最快 2*8可以拆分为 2*2*2*2 就是2<<3 这是效率最高的
<< 相当于*2 那么>>相当于/2
二进制
0000 0000 0
0000 0001 1
0000 0010 2 //把这里的1往左移动3次就等于16
0000 0011 3
0000 0100 4
0000 1000 8
0001 0000 16
a+=b //等于a=a+b
a-=b //等于a=a-b
a/=b //等于a=a/b
a*=b //等于a=a*b
//字符串连接符
int a = 10;
int b = 20;
system.out.printIn(a+b); //30
system.out.printIn(""+a+b);//1020
system.out.printIn(a+b+"");//30
注意空字符串在前会进行拼接所以得出1020,空字符串在后会先进行运算所以是30+"",也就是30
三元运算符
? :
x ? y : z
如果x==true 结果为y否则为z
包机制
- 为了更好的组织类,,Java提供了包机制,用于区别类名的命名空间
- 包的语法格式为 package pkg1.pkg2
- 一般利用公司域名倒置作为包名
- 为了能够使用某一个包的成员,我们需要在Java程序中明确导入该包,使用import语句
import pkg1.pkg2
import pkg1.* //*是通配符,代表导入这个包下所有的类
JavaDoc
-
javadoc命令是用来生成自己API文档的
-
参数信息
- @author 作者
- @version 版本
- @since 最早使用的jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
Scanner
- Scanner类用来获取用户的输入
- 基本语法:
Scanner = new Scanner(System.in);
- 通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们需要使用hasNext()与hasNextLine()判断是否还有输入的数据
- next():
- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符之前遇到的空白,next会自动将其过滤
- 只有输入有效字符后才将后面输入的空白作为分隔符或者结束符
- 不能得到带有空格的字符串
- nextLine():
- 以Enter为结束符,也就是返回输入回车前的所有字符包括空白
- 可以获得空白
//创建扫描器对象,用来接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方法接受:");
//判断用户是否有输入
if (scanner.hasNext()){
//接受用户的输入
String str = scanner.next();
System.out.println("用户的输入为:"+str);
}
//凡是输入io流的类如果不关闭会占用一定资源,所以用完要关闭
scanner.close();