java语言中的字面值
1.什么是字面值?
一眼看上去就知道是多少的数据,就是字面值
2.字面值的本质
字面值是有数据类型的:
整形 100
浮点型 3.14
布尔型 true/false
字符型 ‘中’
字符串型 “ABC”
字面值就是内存中的一块空间,这块空间有类型,有值。
缺点:只有字面值内存无法得到重复利用。
Java语言中的变量
1.java中如何定义变量,语法:
数据类型 变量名;
2.如何给变量赋值,语法:
变量名=字面值;
3.变量的本质是什么?
变量是内存中的一块空间,这块空间有”类型”,”名字”,”值”
System.out.print(10);
System.out.print(10);
//申请两块不同的内存空间
int a=10;
System.out.print(a);
System.out.print(a);
//共用一个内存单元,通过变量名去访问那块内存
int i=10;//申请一块int类型的空间,起名i,并赋值10
变量可以重新赋值,但不能重复声明(在一个域中,变量名不能重复)
java语言中的变量必须先声明,再初始化,才能使用,不初始化变量,编译会报错
int i1,i2,i3=4;
//声明3个变量i1,i2,i3,类型都是int类型,i1,i2两个变量没有赋值,只有i3变量赋值
4.根据变量出现的位置可以分为两种:
1.局部变量:在方法体中声明的变量叫局部变量,包括形式参数列表
2.成员变量:在类体中,方法之外声明的变量统称成员变量。
成员变量声明之后如果不初始化,会自动初始化为对应类型的默认值
byte,short,int,long 0;
double,float 0.0;
String null;
boolean false;
char 0对应的unicode编码 ‘\u0000’,把它转换为int类型为0
关于char类型
char是字符类型,java中采用UNICODE编码
底层占用两个字节
char类型涉及到字符编码方式:
1.字符编码方式是实现现实世界中的文字和计算机的表示方式的转换规则
ASCII
'a' 97
'A' 65
'0' 48
ISO-8859-1
GB2312<GBK<GB18030
unicode UTF-8 UTF-16 UTF-32
2.字符如果采用的编码和解码不一致的话,会出现乱码。
汉字占2个字节,所以java中的char可以存储一个汉字
在命令行窗口输入: native2ascii 回车
汉字 回车
可以将汉字转化为对应的unicode编码
CTRL+C 结束
关于递归方法的调用
1.方法的递归调用就是方法自身调用自身
2.以下程序因为递归没有结束的条件,所以一直压栈,没有弹栈,
导致栈内存溢出错误,所以递归必须要有结束条件。
public class RecursionTest{
public static void main (String []args){
m1();
}
public static void m1(){
m1();
}
}
/*递归求n的阶乘*/
public class RecursionTest{
public static void main (String []args){
int n=5;
int retValue=m1(n);
System.out.print(retValue);
}
public static int m1(int n){
if(n==1)
return 1;
else
return n*m1(n-1);
}
}
递归方法求数组和
public class Test{
//定义数组并初始化
static int [] a = {5,3,3,-3,4,-6};
public static void main(String [] args){
//定义初始化下标
int index=a.length-1;
//调用m1方法并输出
System.out.println(m1(index,a));
}
/*
*通过递归方法求数组和
*/
//定义两个方法参数下标index和数组int [] a
public static int m1(int index,int [] a){
//结束条件判断
if(index==0)
return a[0];
else
//递归方法调用
return a[index]+m1(index-1,a);
}
}
public class Test02{
public static void main(String [] args){
//定义初始下标
int index = 0;
//声明并初始化数组
int [] a = {6,3,5,-2,-6,6};
//创建一个Test02实例
Test02 t=new Test02();
//调用m1方法并输出
System.out.println(t.m1(index,a));
}
/*
*通过递归方法求数组和
*/
//定义两个方法参数下标index和数组int [] a
public int m1(int index,int [] a){
//结束条件判断
if(index==(a.length-1))
return a[a.length-1];
else
//递归方法调用
return a[index]+m1(index+1,a);
}
}
数据类型
整数的默认数据类型是int
如果整数没有超出byte,short,char的取值范围,
可以直接将这个整数赋值给byte,short,char
byte -128~127
short -32768~32767
char 65535即’\uFFFF’
基本类型的转换规则
在java中基本数据类型可以相互转换,boolean类型比较特殊不可以转换成其他类型
转换分为默认转换和强制转换
1.默认转换:容量小的类型会默认转换为容量大的类型
byte->short->int->long->float->double
char->//char类型和short类型在相同位置
byte、short、char之间计算不会互相转换,首先先转换成int
2.强制转换:将容量大的类型转换成容量小的类型,需要进行强制转换
编译虽然通过,运行期可能损失精度,谨慎使用
只要不超出对应的范围可以将整数型值赋值给byte、short、char
在多种类型混合运算过程中,首先将所有数据转换成容量最大的那种,再运算
byte b1=10;
short s1=20;
byte b2=b1+s1;//编译报错,编译阶段只是知道b1+s1的结果是int类型,int类型不能直接赋值给byte类型
java程序分编译期和运行期,编译阶段只知道运算结果是什么类型,运行阶段才知道结果
基本赋值运算符和扩展赋值运算符的区别
byte i = 10;
i = i+10;//编译无法通过,前面的i是byte类型10是int类型
i += 10; //扩展赋值运算符不改变运算结果类型,虽然编译通过,可能损失精度
原因:编译的时候不知道i多大,可能+10之后超过127造成精度缺失
switch
switch(int类型){
case int类型:
java语句;
java语句;
break;
case int类型:
java语句;
java语句;
break;
default:
java语句;
}
注意:break语句可以没有,如果没有则发生case穿透现象
default语句也可以没有
switch后面的括号可以填写byte/short/char类型,因为可以自动转换成int
break,return和continue
break语句:
1.可以用在switch语句中,结束分支语句
2.break;语句可以出现在循环当中,默认情况下结束离它最近的一个循环
return;语句结束的是整个方法
continue语句:结束当前这次循环,直接进入下一次循环继续执行
注意:break;语句和continue;语句可以跳出指定循环,语法如下:
outFor:for(int i=0;i<5;i++){
for(int i=0;i<5;i++){
break outFor;//continue outFor;
}
}
方法重载
优点:
1.程序员只需要记忆很少的方法名
2.代码更加美观
什么时候会发生方法重载?
1.发生在同一个类中
2.方法名相同
3.参数列表不同(类型,个数,顺序)
4.和返回值类型无关
5.和方法的修饰符列表无关
分析System.out.println();这个println()方法是否构成了方法的重载?
System.out是SUN提供的PrintStream类型
println()是PrintStream类型的方法,该方法已经构成了重载
面试题:一个类里可以多个main方法吗?
可以,方法名相同,参数列表不同,构成重载
main(String [] args)这个方法是入口函数/方法,其他重载方法都要在这个方法里调用
示例如下:
public class Test{
public static void main(int a){
System.out.println(a);
}
public static void main(String [] args){
main(10);
}
}
方法的执行原理:
方法的执行原理如下图所示