Java
******个人学习Java总结(3)******
一、JDK、JRE和JVM三者的关系
1、JDK(Java Development Kit):Java开发工具,包含JRE和开发工具两部分组成。
2、JRE(Java Runtime Environment):Java运行环境,包含JVM和核心类库两部分组成。
3、JVM(Java Virtual Machine):Java虚拟机,实现跨平台操作的根本。
如:图1-1,JDK、JRE和JVM三者的关系图。
二、变量与数据类型
1、变量
1-1、变量的分类
1、变量分为:成员变量和局部变量。
(1)成员变量分为:类变量和实例变量。【若成员变量没有被“static”修饰,则为实例变量且存于堆内存(Heap)中;成员变量被“static”修饰,则为类变量且存于内存中的静态区。】
(2)局部变量分为:方法、代码块局部变量和形参。【若局部变量没有被“static”修饰,则存于栈内存(Stack)中;局部变量被“static”修饰,则存于内存中的静态区。】
变量的具体内容,如:图2-1-1,变量具体图。
1-2、变量的使用顺序
1、就近原则:当需要使用某个变量时,优先从局部变量中查找,若没有查找到,则才会从类中的成员变量进行查找。
2、因为存于内存不同区域,所以局部变量和成员变量可以重名。
2、数据类型
2-1、数据类型分类
1、基本数据类型可以分为:整数型、浮点型、字符型和布尔型。如:图2-2-1,基本数据类型图。
2、引用数据类型可以分为:类(class)、数组(array [ ])、枚举(enum)、接口(interface)和注解类型(@interface)。【PS:后续会单独对每个引用数据类型详细个人小结!】
注意:
(1)字符串(String)属于引用数据类型(String实质是一个类)。
(2)引用数据类型的默认值为:null(空)。
(3)布尔型——虽然占用内存大小实际为1位(bit),但由于计算机处理数据或者最小存储单位是1字节(Byte),则也可算作占用内存大小为1字节(Byte)。
2-2、基本数据类型之间的转换
1、基本数据类型转换分为:隐式转换(自动)和强制转换。其中,隐式(自动)转换:数据范围小的基本数据类型自动转换位数据范围大的基本数据类型。强制转换:数据范围大的基本数据类型强制转换数据范围小的基本数据类型。如:图2-2-2,基本数据类型转换图。
注意:
(1)强制转换要在被强制转换数据前加上(),且()内位要转换的数据类型。
(2)数据类型的转换,可能造成精度损失、数值溢出(溢出时会以二进制进位)等数值上的变化。
(3)布尔型——虽然占用内存大小实际为1位(bit),但由于计算机处理数据或者最小存储单位是1字节(Byte),则也可算作占用内存大小为1字节(Byte)。
(4)byte与char,short与char不能自动转换。
(5)int向byte、short和char转换时,若int类型数据的范围与所要转的数据类型的范围相同(或在所要转的数据类型的范围内),就会隐式转换(自动转换)。
(6)当要强制转换数据类型时,一定要清楚被强转数据的大小和范围。【切记!——在实际开发中。】
三、运算(运算符)
3-1、自加( + + )与自减( - - )
1、区别“ i++ ”(右 ++)与“ ++i ”(左 ++)
(1)“ i++ ” 先赋值再自加。
(2)“ ++i ” 先自加再赋值。
2、区别“ i–”(右 --)与“ --i ”(左 --)
(1)“ i-- ” 先赋值再自减。
(2)“ --i ” 先自减再赋值。
注意:
(1)要将“ i++ ”看作是由一个i++的整体和一个i变量两部分共同构成。其他的 --与 ++一样这样去理解。
(2)优先级高于普通的运算符,多用于循环结构中。
public class Test {
public static void main(String[] args) {
//Test1
int a = 3;
System.out.println("a++的结果:" + a++);//先赋值——“a++”=a=3,再自增——a=a+1=3+1=4
int b = 3;
System.out.println("++b的结果:" + ++b);//先自增——b=b+1=3+1=4,再赋值——“++b”=b=4
int c = 3;
System.out.println("c--的结果:" + c--);//先赋值——“c--”=c=3,再自减——c=c-1=3-1=2
int d = 3;
System.out.println("--d的结果:" + --d);//先自减——d=d-1=3-1=2,再赋值——“d--”=d=2
//Tset2
int i = 3;
int result = i++ + ++i - i-- + --i;
/*
* 注意:++(--)优先级高于普通运算符。
* 第一步:先赋值——“i++”=i=3,再自增——i=i+1=3+1=4
* 第二步:先自增——i=i+1=4+1=5,再赋值——“++i”=i=5
* 第三步:先赋值——“i--”=i=5,再自减——i=i-1=5-1=4
* 第四步:先自减——i=i-1=4-1=3,再赋值——“--i”=d=3
* 最终:result = 3 + 5 - 5 + 3 = 6
*/
System.out.println("i++ + ++i - i-- + --i的结果:" + result );
}
}
3-2、位运算及注意事项
1、将数值转换为二进制进行计算。该计算的效率最高,性能最好。如:图3-2-1,位运算及注意事项图。
3-3、逻辑运算
1、逻辑与(“ && ”,“ & ”)和逻辑或(“ || ”,“ | ”)
的相关事项:
注意:
(1)“ && ”和“ || ”具有短路功能,“ & ”和“ | ”不具备。
(2)“ && ”比“ || ”优先级高。
(3)常用逻辑运算符的优先级顺序:
【!(逻辑非)】 > 【&& ,&(逻辑与)】 > 【|| ,|(逻辑或)】
/*
* 判断&&与||优先级
* (1) 若&&与||同级或&&优先级低于||,
* 则先执行(true || true)→ture,再执行(true && false)→false
* (2) 若&&优先级高于||,
* 则先(true && false)→false,再执行e执行(false || true)→ture
* (3) 最终运行结果:false,即(2)成立
*/
System.out.println(true || true && false);//结果:ture
/*
* 证明&&或||具有短路功能,&或|没有短路功能
* 1、&&与&
* (1) a>4为false, ++a==4为true,两者&&结果为false;
* 而通过打印输出a的值为3,则说明++a并没有执行,否则输出a的值该为4。
* 【即:&&具有短路功能(前部分为false)。】
* (2) b>4为false, ++b==4为true,两者&结果为false;
* 而通过打印输出b的值为4,则说明++b执行,,否则输出b的值该为3。
* 【即:&没有短路功能。】
* 2、||与|
* (1) c>4为true, ++c!=5为false,两者||结果为true;
* 而通过打印输出c的值为4,则说明++c并没有执行,否则输出c的值该为5。
* 【即:||具有短路功能(前部分为true)。】
* (2) d>4为true, ++d!=5为false,两者|结果为true;
* 而通过打印输出d的值为5,则说明++d执行,,否则输出d的值该为4。
* 【即:|没有短路功能。】
*/
int a = 3, b = 3, c = 4, d = 4;
//Test(1)
System.out.println(a>4 && ++a==4);
System.out.println(a);//结果:3
//Test(2)
System.out.println(b>4 & ++b==4);
System.out.println(b);//结果:4
//Test(3)
System.out.println(c<5 || ++c!=5);
System.out.println(c);//结果:4
//Test(4)
System.out.println(d<5 | ++d!=5);
System.out.println(d);//结果:5