J1 java基本数据类型
1.java数据类型
1.1基本数据类型
- byte(1Byte)
- short(2Byte)
- int(4Byte)
- long(8Byte)
- float(4Byte)
- double(8Byte)
- char(1Byte)
- boolean(1Byte或4Byte)
1.2引用数据类型
1.3自定义数据类型
2.java存储空间
2.1寄存器空间
- java不能操作寄存器
2.2栈空间
- 栈空间存取数据的效率高,仅次于寄存器
- 栈中数据按照"先进后出"的方式管理
- 栈空间存储空间较小,不能存放大量的数据
- JVM将基本数据类型存放在栈空间
2.3堆空间
- 堆空间存区数据的效率最低
- 数据存放位置随机分配
- 堆空间可以存放大量数据,可存放大容量数据
3.java变量
3.1变量命名规则
- 首字母是英文字母,$或下划线,由字母,数字,下划线组成
- 变量命名遵循见名知义原则
- 驼峰命名法
3.2变量作用域
- java用一对大括号作为语句块的范围,成为作用域
- 作用域内变量不能重复定义
- 离开作用域,变量所分配的内存空间将被JVM回收
3.2.1示例
- 如有以下代码,其中name变量在同一作用域内被重复定义,会报错
package com.hq.ch01;
public class test03 {
public static void main(String[] args){
String name = "张三";
String name = "李四";
}
}
- 同理,上述代码修改如下,由于前一个name作用域在大括号内部,后一个在大括号外部,二者不在同一个作用域内部,故不会报错.JVM会首先执行前者,在执行完毕后将其内存空间回收,再执行后者
package com.hq.ch01;
public class test03 {
public static void main(String[] args){
{
String name = "张三";
System.out.println(name);
}
String name = "张三";
System.out.println(name);
}
}
- 再来一个示例,此时会报错,说重复的局部变量名称.因为前者的作用域(在整个main函数中)大于后者作用域,故报错
package com.hq.ch01;
public class test03 {
public static void main(String[] args){
String name = "张三";
System.out.println(name);
{
String name = "张三";
System.out.println(name);
}
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Duplicate local variable name
at com.hq.ch01.test03.main(test03.java:8)
4.包装类
4.1java包装类
| 包装类的类型 | 说明 |
|---|---|
| Byte类 | byte类型的包装类 |
| Short类 | short类型的包装类 |
| Integer类 | int类型的包装类 |
| Long类 | long类型的包装类 |
| Float类 | float类型的包装类 |
| Double类 | double类型的包装类 |
| Character类 | char类型的包装类 |
| Boolean类 | boolean类型的包装类 |
4.2为啥有包装类
- 包装类中封装了一些很实用的方法和常量.例如Byte.MIN_VALUE是Byte类中的一个常量,存放了byte类型的最小值
- 包装类在集合中用来定义集合元素的类型
4.3包装类中常用的方法
Integer.MIN_VALUE:int类型最小值-2^31Integer.MAX_VALUE:int类型最大值2^31 - 1int Integer.parseInt(String sInteger)可将字符串类型的整数转为int数据类型String Integer.toBinaryString(int value)可将十进制数转换为二进制,返回String类型String Integer.toHexString(int value)可将十进制数转换为十六进制,返回String类型
5.二进制补码
5.1java数据存储方式
- 计算机系统内以二进制形式存储数据
- 在java程序中输入的十进制数据都会被自动转换为二进制,java内部也已二进制来进行数值运算,但返回的结果仍然是十进制
5.2补码
- 在计算机系统中,数值一律用二进制的补码来存储
- 二进制的最高位是符号位,0为正数,1为负数
- 正数的值是其本身,负数的值是最高位(符号位)不变,其他位逐位取反再加1
如二进制的1101,其最高位为1,为负数
再将其按位取反得到0010,加1后为0011,十进制为-3
- 两个数相加,若最高位(符号位)有进位,则进位被舍弃
如4位二进制补码中5-3的结果为2,可看成5+(-3)
对应二进制为0101+1101=0010(2)
5.3补码好处
- 可将符号位和其他位统一处理
- 最高位不再表示数值,而是符号,将数值折半,一半为0至正数,一半为负数.例如4位二进制数有16个数,用补码表示一半为07,一半为-1-8
- 减法可按照加法处理
5.4补码运算特征
- 计算机中正数与负数之间的关系是正数取反后加1即为补码
- 补码运算是封闭的,运算结果保留在补码范围之内,超范围则溢出
四位二进制补码运算中计算5+4的结果
即0101+0100=1001(-7)
6.java控制台输入
6.1概念
- Scanner类用于扫描从控制台输入的数据,可接收字符串和基本数据类型的数据
- Scanner类位于java.util.Scanner包中
6.2常用方法
String next(),接收控制台输入的一个字符串String nextLine(),接收控制台输入的一个字符串int nextInt(),接收控制台输入的一个int类型的数据double nextDouble(),接收控制台输入的一个double类型数据boolean nextBoolean(),接收控制台输入的一个boolean类型数据- 输入char类型数据
Scanner类没有提供直接输入char类型的方法,可以通过
charAt()方法从next()或者nextLine()获取输入的字符
char String.charAt(int index),用来从字符串中获取指定的下标字符,下标从0开始
x.示例
x.1变量使用
- 需求:保存中间结果,用分步骤计算简化复杂运算计算(sqrt(20)+sqrt(10)/(sqrt(20)-sqrt(10)),要求显示结果保留小数点后1位,即对小数点后第2位四舍五入
- 代码
package com.hq.ch01;
public class test01 {
public static void main(String[] args){
System.out.println("(sqrt(20)+sqrt(10))/(sqrt(20)-sqrt(10))="+
Math.round(10*(Math.sqrt(20)+Math.sqrt(10))/(Math.sqrt(20)-Math.sqrt(10)))/10.0);
double sqrt20 = Math.sqrt(20);
double sqrt10 = Math.sqrt(10);
double result = (sqrt20 + sqrt10) / (sqrt20 - sqrt10);
result = Math.round(result * 10) / 10.0;
System.out.println("(sqrt(20)+sqrt(10))/(sqrt(20)-sqrt(10))="+result);
}
}
- 执行结果
(sqrt(20)+sqrt(10))/(sqrt(20)-sqrt(10))=5.8
(sqrt(20)+sqrt(10))/(sqrt(20)-sqrt(10))=5.8
x.2变量存放值
- 需求:不同类型的变量存放对应类型的数据,变量的值可以改变
- 代码
package com.hq.ch01;
public class test02 {
public static void main(String[] args){
String name = "张三";
char sex = '男';
short age = 35;
String type = "帅气";
System.out.println("嗨,大家好,我叫"+name+",今年"+age+"岁,我是一个"+type+"的"+sex+"士");
name = "李四";
sex = '男';
age = 25;
type = "牛逼";
System.out.println("嗨,大家好,我叫"+name+",今年"+age+"岁,我是一个"+type+"的"+sex+"士");
}
}
- 执行结果
嗨,大家好,我叫张三,今年35岁,我是一个帅气的男士
嗨,大家好,我叫李四,今年25岁,我是一个牛逼的男士
x.3包装类使用
- 需求:获取byte类型的最大值,最小值,并测试
Byte.parseByte方法;获取int类型最大值,最小值,并测试Integer.parseInt,Integer.toBinaryString等方法 - 代码
package com.hq.ch01;
public class test04 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Byte.MIN_VALUE+"~"+Byte.MAX_VALUE);
System.out.println(Byte.parseByte("108")+10);
System.out.println(Integer.MIN_VALUE+"~"+Integer.MAX_VALUE);
System.out.println(Integer.parseInt("1000")+10);
System.out.println(Integer.toBinaryString(16));
System.out.println(Integer.toHexString(16));
}
}
- 执行结果
-128~127
118
-2147483648~2147483647
1010
10000
10
x.4从控制台输入
- 需求:从控制台输入字符
- 代码
package com.hq.ch01;
import java.util.Scanner;
public class test05 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
System.out.println("姓名:");
String name = scanner.next();
System.out.println("性别:");
char sex = scanner.next().charAt(0);
System.out.println("年龄:");
int age = scanner.nextInt();
System.out.println("身高:");
double hight = scanner.nextDouble();
System.out.println("性格:");
String type = scanner.next();
System.out.println("大家好,我叫"+name+",今年"+age+"岁.身高"+hight+"米,性格"+type+".");
}
}
- 执行结果
姓名:
hanqi
性别:
boy
年龄:
21
身高:
173
性格:
aaa
大家好,我叫hanqi,今年21岁.身高173.0米,性格aaa.

浙公网安备 33010602011771号