数据类型
标识(zhi)符:包,类,变量,方法的名
标识符定义规则:
1、四个可以:数字,字母(英汉日俄均可),下划线_,美元符号$
2、两个不可以:不可以以数字开头;不可以使用Java中的关键字
3、见名知意:增加可读性
4、大小写敏感:int a;与 int A;不同
5、遵照驼峰命名法
类名:首字母大写,其余遵循驼峰命名
方法名、变量名:首字母小写,其余遵循驼峰命名
包名:全部小写,不遵循驼峰命名
6、长度不限制,但不建议太长
关键字
常量
字面常量
整型常量:123,33
实型常量:3.1415926
//字符常量:‘a’(可能有误)
逻辑常量:true false;逻辑常量就只有true和false两个值
字符串常量:“helloworld”
字符常量:使用final修饰的PI等称为符号常量
变量
1、如果你只定义一个变量,但没有给变量赋值的话,那么这个变量相当于没有定义(可以通过反编译看出来)
2、变量如果没有进行赋值的话,那么使用的时候会报错(尚未初始化变量)
3、反编译后发现变量名字随机分配,无关紧要
4、变量不可以重复定义,名字必须不一样
Java是一个强类型的语言,只要声明变量就必须定义类型
public class Test{
public static void main(String args[]){
int a=10;
int b=20;
int c=a+b;
}
}
对上述代码进行 反编译过程/反汇编过程 javap -v Test.class
常量池
变量的内存:内存只占用一块空间
System.out.println("num1="+num1);
int age=19,age2=20;
+加号的作用就是拼接
变量的作用域:作用范围就是离它最近的{}
局部变量:定义在方法中
成员变量:定义在类中,方法外
定义在方法中的变量是局部变量,定义在类中但是在方法外的变量叫成员变量
//以下代码错误,不能运行,仅供理解变量的作用域
public class Test{
int b=20;
public static void main(String[] args){
System.out.println(a);//no
int a=10;
System.out.println(a);//yes
System.out.println(b);//yes
{
int c=40;
System.out.println(c);//yes
int a=50;//no,属于变量的重复定义
}
}
public void eat(){
System.out.println(b);//yes
System.out.println(a);//no
int a=30;//因为在不同的方法中,所以a不是重复定义
System.out.println(a);//yes
}
}
整数类型:常量和变量
public class Var{
public static void main(String[] args){
int num1=12;//默认情况下赋值就是十进制的情况
System.out.println(num1);
int num2=012;//前面加上0,这个值就是八进制
System.out.println(num2);
int num3=0x12;//前面加上0x或者0X,这个值是十六进制
System.out.println(num3);
int num4=0b10;//前面加上0b或0B,这个值就是二进制
System.out.println(num4);
byte b=129;//超范围赋值会报错
long num5=12345678910;//报错
//整数类型默认是int型的,所以12345678910是一个int类型的整数,对于int来说,它超出范围了
//要想把一个属给long类型,那么后面得加上L或l
long num5=12345678910L;
}
}
整数类型默认是int型的,所以12345678910是一个int类型的整数,对于int来说,它超出范围了
要想把一个属给long类型,那么后面得加上L或l,推荐大写L,防止认成l
注意:只有这个数超出int类型的范围后面才需要加上L,否则无需加L也可以赋值给long类型
浮点类型
常量:1、十进制形式
2、科学计数法形式。如:314e2;314E2;314E-2
有效数字:指的是从左开始第一个不为0的数到最后一个数
float a=0.2f;
编码与字符集:
GB2312:中文两个字节,兼容ASCII码,ASCII还是用自己的7位,前面不补0
GBK所面临的落实问题:首位是0,就看成一个字节;首位是一,就看出两个字节
Unicode真实:UTF-8 UTF-16 UTF-32
UTF-8最多可以用6个字节表示
我们用的最多的就是UTF-8
字符类型:
Java中无论字母,数字,符号,中午都是字符类型的常量,占用2个字节
字符类型:单引号引起来的单个字符
public class Varchar{
public static void main(String[] args){
char ch1='v';
System.out.println(ch1);
char ch2='S';
System.out.println(ch2);
char ch3='中';
System.out.println(ch3);
char ch4='^';
System.out.println(ch4);
char ch5='8';
System.out.println(ch5);
char ch6=' ';
System.out.println(ch6);
System.out.println("---------------------");
char ch7='\n';
System.out.println("aaa"+ch7+"222");
//两句话效果相同
System.out.println("aaa\nbbb");
System.out.println("aaa\tbbb");// \t 制表符 距离第一个8位
System.out.println("aaa\bbbb");//输出aabbb,第三个a被擦除
System.out.println("aaa\rbbb");//输出bbb,回车将光标回到开头再录入bbb
System.out.println("\"java\"");//输出 “java”
// \"将双引号原样输出 \’将单引号原样输出 \\ 将\原样输出
}
}
public class Varchar{
public static void main(String[] args){
char ch1='A';
System.out.println(ch1);
System.out.println(ch1+90);//输出155
char ch2='中';
int num1=(int)ch2;
System.out.println(num1);//输出20013
char ch=(char)20013;//输出 中
int num1='中';
char ch5=20013;
面试题:
char ch6='2'+2;
System.out.println(ch6);// 输出的是 字符 '4'------>4
}
}
char类型我的看到的是A,但在底层计算的时候,实际上是用码计算的,这个码是ASCII
按Unicode码表存储但是Unicode兼容了ASCII
控制台乱码问题: 记事本用UTF-8编码,控制台用GBK解码,所以乱码
用记事本编码的时候,编码方法一般要选择为ANSI,获取当前操作系统的编码格式:GBK
布尔类型
public class Varboolean{
public static void main(String[] args){
boolean flag1=true;
boolean flag2=false;
boolean flag3= 5==9;
System.out.println(flag3);//false
}
}
基本数据类型转换问题
有两种:自动转换和强制转换
多种数据类型参与运算时,整数,浮点,字符类型都可以参与运算,唯独布尔类型不可以参与运算
类型级别:byte short,char,int,long,float,double
级别用来做什么?当一个表达式中有多种数据类型的时候,要找出当前表达式中级别最高的类型,然后其余的类型都转换为当前表达式中级别最高的类型计算
在进行运算时,
左=右:直接赋值
左<右:强转
左>右:直接自动转换
以下情况属于特殊情形:对于byte,short,char类型来说,只要在他们的表述范围内,赋值的时候不需要进行强制转换,直接赋值即可
public class Varchange{
public static void main(String[] args){
double d=6;// int--->double 自动转化
System.out.println(d);//输出6.0
int i=6.5;// double--->int
System.out.println(i);//报错
int i=(int)6.5;// 强制double--->int,输出6,不存在四舍五入 强制转换
在同一个表达式中,有多个数据类型时,应该如何处理
double d2=12+1294L+8.5F+3.81+'a'+true;//多种数据类型参与运算时,整数,浮点,字符类型都可以参与运算,唯独布尔类型不可以参与运算
double d3=12+1294L+8.5F+3.81+'a';
=12.0+1294.0+8.5+3.81+97.0;
System.out.println(d3);//1415.31
int i2=(int)(12+1294L+8.5F+3.81+'a');//1415,括号要全部加上
以下情况属于特殊情形:对于byte,short,char类型来说,只要在他们的表述范围内,赋值的时候不需要进行强制转换,直接赋值即可
byte b=12;
System.out.println(b);
byte b2=(byte)270;
System.out.println(b2);//输出14
}
}
练习:实现功能,求圆的周长和面积
public class Circle{
public static void main(String[] args){
double c=2*3.14*5;//小数在参与运算时,结果可能不准
System.out.println("周长为:"+c);
double s=3.14*5*5;
System.out.println("面积为:"+s);
}
}
提取变量就是为了一劳永逸,以后只要改变变量的值只要用到变量的地方取值都会发生变化
import java.util.Scanner;//在java.util下将Scanner拿过来用,没有这句话,会报错,找不到Scanner
public class Circle{
public static void main(String[] args){
//提取变量
final double PI=3.1415926;
//拿来一个扫描器
Scanner sc=new Scanner(System.in);
//让扫描器扫描键盘录入的int类型的数据
System.out.print("请录入一个半径");
int r=sc.nextInt();
//int r=5;
double c=2*PI*r;
System.out.println("周长为:"+c);
PI=6.12;//报错,无法为最终变量pi分配值
double s=PI*r*r;
System.out.println("面积为:"+s);
}
}
一个变量被final修饰,这个变量就变成了一个常量,这个常量的值就不可变了,这个常量就是我们所说的字符常量
约定俗成的规定:字符常量的名字全部大写
如何从控制台输入东西?见上述代码块8行
加深对Scanner的理解
重点看:
import java.util.Scanner;
public class table{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.print("请输入年龄:");
int age=sc.nextInt();
System.out.print("请输入身高:");
double hight=sc.nextDouble();
System.out.print("请输入姓名:");
String name=sc.next();//没有nextString,直接next就好
System.out.print("请输入性别:");
String sexStr=sc.next();
char sex=sexStr.charAt(0);//字符串转为char类型
//合为一句char sex=sc.next().charAt(0);
}
}