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^31
  • Integer.MAX_VALUE:int类型最大值2^31 - 1
  • int 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.
posted @ 2021-08-05 23:28  MHDSG  阅读(67)  评论(0)    收藏  举报