1.基本结构
1.1文件名与类名
public class HelloWorld{
public static void main(String[] args){
System.out.println("hello,world!你好,世界!");
}
}
①public class 类名
这个public
只能有一个
②文件名.java
这个文件名要和public class 类名
的类名一样;就如上面代码中类名是HelloWorld
,则该.java
文件的文件名也必须是HelloWorld
1.2main
程序执行的入口
public class HelloWorld{
public static void main(String[] args){
System.out.println("hello,world!你好,世界!");
}
}
class HelloChina{
public static void main(String a[]){
System.out.println("hello,world!你好,中国!");
}
}
①public static void main(String[] args)
是一个可执行的Java程序必须有的,因为它是执行语句的入口
②public static void main(String[] args)
其中的String[] args
可以写成String arg[]
,arg
也可以改成任意可表示数组的符号如a
等;有public
是因为它权限最大,有static
是因为它与类相关,有void
是因为它在栈帧最底部不需要返回值
③一个Java程序里可以有多个main
2.输出与输入
2.1输出
public class PrintTest{
public static void main(String[] args){
System.out.print(); //只输出,不换行
System.out.print(""+"\n"); //先输出后换行
System.out.println(); //先输出后换行
System.out.println("abc123"); //双引号里写字符串
System.out.println(123+4); //整数直接计算
System.out.println(0.1+0.2); //输出不是0.3,而是0.30000000000000004,因为现代编译器基本采用IEEE 754标准,所以不能实现每一个十进制小数对应一个二进制小数
System.out.println("Stu"+"dent"); //+(加号)为连接符
int a=1;
int b=1;
System.out.println(a==b); //==(连等号)为判断是否相等的符号
}
}
2.2输入
import java.util.Scanner; //导入Java的util包里的Scanner类
public class ScanTest{
public static void main(String[] args){
Scanner n=new Scanner(System.in); //创建Scanner类型的对象n,并使n能够获取控制台输入的功能即Scanner(System.in)
String name=n.next(); //创建String类型的对象name,把对象n的next()方法赋值给name,并开始输入name的值
System.out.println("name:"+name); //输出刚刚输入的name
}
}
3.基本数据类型
3.1 byte
{
byte b1=-128;
byte b2=127;
System.out.println(b1+"\n"+b2);
}
①byte类型的范围是-128~127
(即-2^7~2^7-1
)
②1个byte占1个字节(Byte
),8位(bit
)
3.2 short
{
short s1=-32768;
short s2=32767;
System.out.println(s1+"\n"+s2);
}
①short类型的范围是-32768~32767
(即-2^15~2^15-1
)
②1个short占2个字节(Byte
),16位(bit
)
3.3 int
{
int i1=-2147483648;
int i2=2147483647;
System.out.println(i1+"\n"+i2);
}
①int类型的范围是-2147483648~2147483647
(即-2^31~2^31-1
)
②1个int占4个字节(Byte
),32位(bit
)
3.4 long
{
long l1=-9223372036854775808L;
long l2=9223372036854775807L;
System.out.println(l1+"\n"+l2);
}
①long类型的范围是-9223372036854775808~9223372036854775807
(即-2^63~2^63-1
)
②long类型在数字的末尾要加上L或l
③1个long占8个字节(Byte
),64位(bit
)
3.5 float
{
float f1=9.999999F;
float f2=9999999F;
float f3=f2+1;
System.out.println(f1); //9.999999
System.out.println(f2); //9999999.0
System.out.println(f3); //1.0E7,这里的E7指的是10^7即10的7次方
float f4=-9999999F;
float f5=-(f4-1);
System.out.println(f4); //-9999999.0
System.out.println(f5); //-1.0E7
float f6=123123123f; //前7位数不会丢失精度,但从第8位开始就可能会出现精度丢失的情况
float f7=f6+1;
System.out.println("f6=" + f6); //f6=1.2312312E8
System.out.println("f7=" + f7); //f7=1.2312312E8
System.out.println(f6 == f7); //返回true,因为精度丢失了,它们输出一样的结果
}
①float类型的范围比较特殊,正常来说前7位都是正常的,超过7位后会出现E
来表示科学计数法;然后在前8位中有一部分也是正常的,但到了后面的部分会出现精度丢失的现象
②float类型在数字的末尾要加上F或f
③1个float占4个字节(Byte
),32位(bit
)
④Java中默认小数为double类型,所以如果要使用float类型就需要加上F或f
或者强制转换成float类型
3.6 double
double d1=0.0000001d;
System.out.println(d1); //1.0E-7,即1*(10^-7)
①double类型的范围要比float类型的要广很多,能精确到15~16
位,具体有效位数可以自行查找;但是和float类型一样,到了后面的部分也会出现精度丢失的现象
②double类型在数字的末尾要加上D或d
③1个double占8个字节(Byte
),64位(bit
)
3.7 char
{
char a1='a';
System.out.println("a1="+a1); //a1=a
char a2='1';
System.out.println("a2="+a2); //a2=1
char b1='\u0042';
System.out.println("b1="+b1); //b1=B
char b2='\t';
System.out.println("I love"+b2+"you"); //I love you
char b3='\n';
System.out.println(b3+"baby"); //(换行) baby
char c1=1;
System.out.println("c1="+c1); //c1=SOH,SOH(Start Of Headling)是ASCII码的第1个
char c2=48;
System.out.println("c2="+c2); //c2=0,ASCII码的第48个为0
System.out.println("c1+c2="+(c1+c2)); //49,1+48
System.out.println("a2+c1="+(a2+c1)); //50,49+1,a2的'1'为ASCII码的第49个
System.out.println("a2+c2="+(a2+c2)); //97,49+48
}
①char类型只能写入1个字符,字符表示Unicode(万国码)编码表中的每1个符号,每个符号使用单引号(''
)引起来,其中前128个符号和ASCII表相同,且这个字符可以是转义字符,如上面的'\u0042'
表示转义成Unicode的第42个即大写的B,'\t'
表示转义成制表符(即4个空格),'\n'
表示转义成换行符(即换1行)
Unicode转义字符 | 含义 |
---|---|
\u000a | 换行符 \n |
\u000d | 回车符 \r |
\u007b | 大括号左半部 { |
\u007d | 大括号右半部 } |
\u0008 | 退格符 \b |
\u0009 | 制表符 \t |
\u0022 | 双引号半边 " |
\u0027 | 单引号半边 ' |
\u002b | 加号 + |
\u003b | 分号 ; |
\u005c | 反斜杠 \ |
\u0041 ~ \u005a | 字符 A~Z |
\u0061 ~ \u007a | 字符 a~z |
②char类型的变量的值如果不带上单引号(''
),则只能写入数字(可以是1个,也可以是多个),表示直接把写入的变量的值视为ASCII码对应的十进制数字,如上面char c2=48;
意思是将ASCII码的第48个
(即是数字0
)赋值给c2
,所以System.out.println("c2="+c2);
这个的结果是c2=0
;而在System.out.println("a2+c1="+(a2+c1));
中,结果之所以是50
的原因是a2
和c1
在println()
中进行的是ASCII码的值的相加运算,因为a2='1'
,所以'1'
在ASCII码中的值是49
,而c1=1
,1
本来代表的就是ASCII码的值为1
,所以50=49+1
,System.out.println("c1+c2="+(c1+c2));
和System.out.println("a2+c2="+(a2+c2));
同理
③1个char占2个字节(Byte
),16位(bit
),它的取值范围是0~65535
3.8 boolean
boolean isMan=true;
if(isMan){
System.out.println("请进男厕");
}
else {
System.out.println("请进女厕");
}
①1个boolean占1位,有true
和false
这2个值,一个表示真
,一个表示假
,一般用于表示逻辑运算
②boolean类型true
和false
都不谈字节大小,但实际上会被转换成1
和0
,所以占4字节(Byte
)
4.引用数据类型
4.1 String
String str2="";
String str1="HelloChina!"; //String类型变量用""赋值,String类,属于引用数据类型,即是字符串
System.out.println(str1); //HelloChina!
int i2=128;
//String str=str1+i2-3; //报错,因为String类型表示字符串,-表示减法,所以+被视为了加法而非连接
boolean isMan=true;
//String str=isMan+i2+str1; //报错,因为布尔类型isMan开头会+会被视为加法而非连接,是错的,应该把str1放前面
String str=str2+i2; //String类型做连接运算后还是String类型
System.out.println(str); //128
String str3=i2+""; //i2=128被放进""里了得到了str3
System.out.println(str3); //128
int num=Integer.parseInt(str3); //用Integer.parseInt()把str3里的数字取出来
System.out.println(num-1); //127,128-1的结果
String str4=3.2f+"";
System.out.println(str4); //3.2
//int num0=Integer.parseInt(str4); //取不出来str4,因为Integer.parseInt()取的是纯数字的字符串
//System.out.println(num0-1);
System.out.println(3+4+"Hello"); //7Hello,遇上了"Hello"是字符串,所以后面所有只能做连接运算
System.out.println("Hello"+3+4); //Hello34
System.out.println('a'+1+"Hello"); //98Hello,先'a'+1是ASCII运算,再遇上"Hello"做连接运算
System.out.println("Hello"+'a'+1); //Helloa1
①String类型变量用""
赋值
②如果用连接运算的表达式来给String类型变量赋值,则首先不能出现-
,其次boolean的变量不能放在=
后的第一个,然后要么=
后面有String类型的变量,要么有""
5.包装类和自动装箱、拆箱
5.1
6.自动类型提升和强制类型转换
7.基本数据类型与引用数据类型(String)的区别及转换
7.1区别1:变量和值存放的位置
①基本数据类型的变量和值是一起存放在被划分的栈内存里的;而引用数据类型的变量是存放在栈内存中,但其值是存放在堆内存中的
②所以两个基本数据类型的变量的值可以是一样的;但如果两个引用数据类型的变量有相同的值,那么他们会共用同一个堆内存里的值,因为这个值的地址是唯一的,而这两个变量都指向的这个地址
7.2区别2:判断是否相等
①基本数据类型用==
和!=
来判断数据是否相等
②引用数据类型用equals()
来判断数据是否相等(因为equals()
比较的是内存地址)
7.3转换
①String类型变基本数据类型:
②基本数据类型变String类型: