Day 1 Java&变量
java语言特点
面向对象
简单
跨平台(操作系统、服务器、数据库)
计算机的执行机制
编译执行
将源文件编译成机器码,一次编译,多次执行
执行效率高,不可跨平台
解释执行
将源文件一行一行解释,一行一行执行。不同的操作系统具备不同的 解释器。
执行效率低,可以跨平台。
java的执行机制
先编译,再解释
将源文件编译成字节码文件(平台中立文件.class),再将字节码文件进行解释执行。
java的设计理念:Write Once Run Anywhere
重要名词解释
JVM(Java Virtual Machine)虚拟机
使用软件在不同操作系统中,模拟相同的环境。
JRE(Java Runtime Environment)运行环境
包含JVM和解释器,完整的Java运行环境。
JDK(Java Development Kit)开发环境
包含JRE+类库+开发工具包(编译器+调试工具)。
类的阐述
同一个源文件中可以定义 多 个类
编译后,每个类都会生成独立的 .class 文件
一个类中,只能有一个主函数,每个类 都可以 有自己的主函数
public修饰的类称为公开类,要求类名必须和文件名称 完全 相同,包括大小写
一个源文件中,只能有一个公开类
package
作用:类似于文件夹,用于管理字节码(.class)文件。
带包编译:javac -d . 源文件名称.java(自动生成目录结构)
javac -d . HelloWorld.java
带包运行:java 包名.类名
包名采用域名倒置的规则,例如:
cn.com.company.department.group.project.module.XxxClass
代码注释
// 单行注释
/* 多行注释 */
/* 文档注释 / (生成外部文档:javadoc -d . HelloWorld.java)
/**
外部文档注释
*/
标识符命名
语法规定
可以由:字母、数字、_、$ 组成,但不能以数字开头。
不能与关键字、保留字重名。
约定俗称
望文生义、见名知义。
类名由一个或多个单词组成,每个单词首字母大写(pascal)。
函数名、变量名由一个或多个单词组成,首单词首字母小写,拼接词首字母大写(camel)。
包名全小写。
常量全大写,多个单词用 _ 连接。
变量的概念
变量的组成:数据类型、变量名、值
Java中的变量具有严格的数据类型区分。(强类型语言)
Java是强类型语言,变量的类型必须与数据的类型一致。
注意:int为整数的默认类型,所以为long类型赋值时,需要在值的后面追加“L”。原因如下图
图片注解:所有变量都要存储在本地变量表中,而本地变量表中的Slot(槽)最大存储位数为32位,如果要存储Long类型值(占据64位),则要在数后加L明确告知计算机申请两个Slot(槽)来存储这个值,并对两个槽内的值进行处理,只能进行原子操作,要用则一起用,要么都不用,否则会成为脏数据,如不加L告知计算机,则会出现超出大小无法在一个Slot(槽)内存储而出现错误。
加注:因为Slot(槽)的存储大小为32位,因此Java则以int(32位)为整数的默认数据类型。
byte short int long
float double
double为浮点数的默认类型,如需为float类型赋值,需要在值的后面追加“F”
float:4字节 1bit符号位,8bits指数位,23bits尾数位
double:8字节 1bit符号位,11bits指数位,52bits尾数位
boolean
可直接赋值true/false或赋值一个结果为true/false的表达式
注意:java中的boolean不能参与算数运算
boolean:1字节 描述状态只占1位,总8位
char
char
String
任何“”之间的字面值
变量赋值
二进制:0b开头
八进制:0开头
十进制:无开头
十六进制:0x开头
public class HelloWorld{
public static void main(String args[]){
int i2 = 0b10; //二进制的赋值方式,输出值为2
System.out.println(i2);
int i8 = 010; //八进制的赋值方法,输出值为8
System.out.println(i8);
int i10 = 10; //十进制的赋值方法,输出值为10
System.out.println(i10);
int i16 = 0x10; //十六进制的赋值方法,输出值为16
System.out.println(i16);
}
}
short为char赋值
short 有符号数 -32768 — 32767
char 无符号数 0 — 65535
由于它们取值范围部分重合但有负数处无法赋值,所以直接复制存在风险
直接复制报错,强制类型转换可以解决,但可能会损失精度
double强制转换int
小数位为大于16个9则进位,小于十六个9则直接截掉小数位
例:
int i = 1.9999 9999 9999 9999 //i=2
int j = 1.9999 9999 9999 9991 //i=1
int z = 1.9999 99 //i=1
int x = 1.9999 9999 9999 9999 9999 //i=2
类型转换
自动类型转换:
两种类型相互兼容。
目标类型 大于 源类型。
强制类型转换:
两种类型相互兼容。
目标类型 小于 源类型。
注:强制类型转换规则:
自动类型提升
操作数中没有int,均为short/byte,计算结果依旧提升为int
其他情况下提升为两操作数中类型大的一方的类型
特殊:任何类型与String相加(+)时,实为拼接,其结果自动提升为String。
思考:
System.out.println(10+20+"5"); //输出305(String 类型)
System.out.println(10+20+"5"+'4'); //输出3054(String类型)
System.out.println(10+'4'+20+"5"); //输出825(String类型)
//只有与String类型相加为拼接,所以在10与char类型'4'相加时,4转换为ASCII码即52与其相加,所以结果为825
附加:
n=n+1 存在自动的类型提升
n+=1 在有限的位数内,完成自增
byte i = 127;
i=i+1 //错误!i+1超出byte范围,提升至int赋值给类型为byte的i有可能损失精度
i+=1 //无报错,但结果为-128,因为i永远只保留后八位,无论加多少,结果永远在-128——127中循环(如下图)
三元运算符
控制台输入
导入 java.util.Scanner
声明 Scanner 类型的变量
使用Scanner类中对应的函数(区分类型):
nextInt(); //获得整数
nextDouble(); //获得小数
next(); //获得字符串
next().charAt(0); //获得单个字符
注:如果输入了不匹配的数据,则会产生java.util.InputMismatchException