Java基础部分总结—01
1 类型转换
1-1基本数据类型转化
自动转换
- 将取值范围小的类型自动提升为取值范围大的类型。
转换规则
byte、short、char运算时直接提升为int。
public class Main {
public static void main(String[] args) {
int i = 1;
double d = 2.5;
System.out.println(i+d);//out 3.5
}
}
double 类型内存8个字节, int 类型内存4个字节。因此int类型的i被自动提升成了取值范围大的double。
强制类型转换
将取值范围大的类型强制转换成取值范围小的类型。
转换格式
数据类型 变量名 = (数据类型)被转换数据值
public static void main(String[] args) {
int i = 1;
double d = 2.5;
/*
*i是int类型的,d是double类型的,两者相加int类型的i会自动提升为double类型的,因此结果为double类型的
* 当用int类型的result接收的时,会产生大范围向小范围的转化,需要使用强制转换。
* */
// int result = i + d; //错误
int result = (int) (i + d);
System.out.println(result);//3
}
注意事项:
- 浮点转换为整数,直接取消小数,不是四舍五入,会造成数据精度变化。
1-2引用类型转化——<多态的转型>
与基本数据类型转换相同,引用数据类型的转换也分为两种:
向上转型:
- 多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。(同基本类型的自动转型,向大范围转换)
使用格式
父类引用指向一个子类对象的时候,就是发生了向上转型。
//父类类型 变量名 = new 子类类型();
//如:
Animal a = new Cat();
//或者通过函数调用的时候传入参数
Show(new Cat());
void Show(Animal ani){
//...代码段
}
向下转型:
- 父类类型向子类类型向下转换的过程,强制的过程。(同基本类型的强制转换类似,由大转小)
使用格式
- 在强制类型转换前要进行instanceof关键字判断,否则容易报错!
- 【在C#中用is判断,用as转换】
if(变量名 instance 变量类型)
//如果变量属于该数据类型,返回true;
//如果变量不属于该数据类型,返回false; - 子类类型 变量名 = (子类类型) 父类变量名
public static void main(String[] args) {
//Object类是所有类的父类
Object obj = "123456";
//判断是否可以转换,由于String类是Object类的子类,故父类向子类转换要进行强制转换
if (obj instanceof String) {
String Str = (String) obj;//强制转换
System.out.println(Str);
}
else {
System.out.println("转换失败!");
}
}
//输出结果为123456;
2 运算符
前++和后++的区别:
- 独立运算:
在独立运算时,二者没有区别。++i和i++最后得到的i的结果相同。
public static void main(String[] args) {
int i = 0;
int j=i;
i++;
++j;
System.out.println(i);//out i=1
System.out.println(j);//out j=1
}
唯一的区别
C++中是这样的…
i++在实现的时候,产生了一个local object,使得效率比++i低。
//++i 的版本
NT INT::operator++()
{
*this=*this+1;
return *this;
}
//i++ 的版本
const INT INT::operator ++(int)
{
INT oldvalue=*this;
*this=*this+1;
return oldvalue;
}
==可以看出i++返回的是值类型,++i返回的是引用类型,由于引用类型可以作为左值,故可以
++++i;//ok
//i++++;//err
- 混合运算
前++:先赋值给其他变量,在自增;
后++:先自增在赋值
public static void main(String[] args) {
int i = 0;
int j = i;
for (int i1 = 0; i1 < 10; i1++) {
i = i++;
j = ++j;
}
System.out.println(i);//out i=0
System.out.println(j);//out j=10
}
三目运算符
- 格式
数据类型 变量名 = 布尔类型表达式?结果1:结果2 - 应用
常常可以代替单个if-else语句,使得代码变简洁
public static void main(String[] args) {
Random r = new Random();
int i = r.nextInt(10);
System.out.println("i=" + i);
// if(i>5){
// i++;
// }
// else {
// i--;
// }
i = i > 5 ? ++i : --i; //使用三目运算符代替if-else,注意要使用++i和--i;
System.out.println(i);
}
==比较运算符
- 对于基本数据类型:比较的是值
- 对于引用数据类型:比较的是两个对象的地址值
3 数组
定义
格式
数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];
格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…};
格式
数据类型[] 数组名 = {元素1,元素2,元素3…};
数组的访问
- 采用索引来访问:索引最大值=数组长度-1;
- 数组长度 = 数组名.length;
数组的遍历
采用for(int i=0;i<数组名.length ; ++i )
或者采用foreach来实现–> for(数组类型 遍历变量:数组名)
IDEA快捷键
- 数组遍历 :数组名.fori 或数组名.iter
代码分析
public static void main(String[] args) {
//数组的定义
int[] a = new int[10];//方法一,定义了一个int类型的数组a;
int[] b = new int[]{1, 2, 3};//方法二,定义并初始化了数组b,其值为1,2,3;
int[] c = {4, 5, 6};//方法三,定义并初始化了数组c;
//对数组a遍历赋值
for (int i = 0; i < a.length; i++) {
a[i] = i;
}
//对数组a遍历输出
for (int i : a) {
System.out.println(i);
}
}