java学习资源
https://www.bilibili.com/video/av37413483
1.关键字
关键字的特点: 全部小写(不允许出现大写)
保留字: goto const
2.标识符
组成规则: 大小写字母 数字 $_
命名规则:
类和接口:大驼峰命名法
变量和方法: 小驼峰命名法
包: 全部小写 域名倒置 用.连接
常量: 全部大写 用_连接
3.常量,进制和进制转换
常量分为字面值常量和自定义常量;
整数 小数 字符串 字符 布尔等
所有的常量在计算机中以二进制存储的,但是这种语言人无法理解,因此需要其他表现形式
二进制 0b 八进制0 十六进制 0x
原反补的区别:
原码:就是二进制表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
补码出现是为了解决负数的计算问题
在计算机底层,减法运算做的也是加法运算 都先换算成补码 运算完后再求原码
如byte类型运算 12+(-24)
12的原码为 0000 1100 反码和补码都为0000 1100
-24的原码为 1001 1000 反码为1110 0111 补码为 1110 1000
0000 1100
+ 1110 1000 // 就按照加法运算 0+1为1 1+1为2 进一位后原位变0
= 1111 0100 这是补码 反码为 1111 0011 原码为1000 1100 结果为-12
4.变量的定义 赋值 声明
变量的定义(包含了赋值和声明)
数据类型 变量名 = 初始化值;
变量的赋值
变量名= 值;
变量的声明
数据类型 变量名 ;
局部变量:定义在方法或方法的参数列表上的变量称为局部变量,局部变量不赋初值不能使用
成员变量:定义在类中方法外,成员变量有默认值
5.数据类型和类型转换
java本身是一种强类型语言 他对类型的要求是非常高的
数据类型:
引用数据类型 :
数组 类 接口
基本数据类型:
byte short int long float double boolean char
整型出现这么几种类型的原因时减少内存的消耗,按照定义分配内存
整 型: byte(1个字节 8位) short(2个字节 16位) int(4个字节 32位) long (8个字节)
java中默认情况下 所有的整数都是int类型
小数类型: float(单精度 4个字节) double(双精度 8个字节)
java中默认的小数都是double类型的
字符类型:char(2个字节)
布尔类型:boolean true false
类型大小关系 byte short char < int < long < float < double
类型转换:
小变大:完全没问题
float a = 123; //正确 int转float 小变大
float b= 123L;//正确 long转float 小变大
int a = ‘a’; //正确 将char转为int 小变大 此时接受的是ASKII码表中 a对应的数
大变小:看等号右边是否包含变量
如果等号右边都是常量,只要在范围内就可以直接赋值
byte d = 23; 大转小,int转byte,由于23在byte范围内,所以不报错
但是小数除外
float a = 12.3; 大转小,double转float大转小,也在范围内,但不能转;
如果不在范围就需要强转,有精度损失,强转的具体过程见下;
float d = (float)12.3; //正确,强转
float d = 12.3f; //正确,注明是float类型
byte a = 200; //报错,int转byte,超出范围
byte a = (byte) 200;// 强转 精度损失
如果等号右边是变量则必须进行强转();
byte a=1,b=2,c; //这种定义方式 等同与 byte a=1; bye b =2; byte c; 一般不推荐这样写
c=1+2; //正确,等号右边是常量
c = a+b; //报错,因为c为byte类型,a和b为byte但运算后会为int类型,由于其为变量,就有可能出现大变小造成精度损失;
c=a+1; //报错;a是变量 byte类型 转为int时会由可能超出范围;
强转的具体计算过程:先将数转为二进制,求其补码,然后按照位数去掉多余的前几位,然后求原码代表的值;
byte a = (byte) 200;// -56
int类型(32位)的200,其二进制的原码为 0000 0000 0000 0000 0000 0000 1100 1000 补码相同,用补码去进行强转
转为byte(8位)只保留后8为 为1100 1000 此时为补码 反码为1100 0111 原码为 1011 1000 结果为 -56
byte b = -300; //报错
byte b = (byte) -300;// -44
int类型(32位)-300的二进制的原码为 1000 0000 0000 0000 0000 0001 0010 1100
反码为 1111 1111 1111 1111 1111 1110 1101 0011
补码为 1111 1111 1111 1111 1111 1110 1101 0100
转为byte(8位)只保留后8为 为1101 0100 此时为补码 反码为 1101 0011 原码为10101100 结果为 -44
char类型参与运算,是按照其ASKII码表对应的数字进行的;
char ch = '中';
System.out.println(ch);//中 直接使用的时候,用的是字符
char ch1 = 'b';
System.out.println(ch1 +1);//99, 参与运算时使用对应的数字
System.out.println('z' + 0);//122
char ch2 = 97; //虽然赋值右边是int类型 但ch2是以char接受的,此时ch2代表的是其对应的字符
System.out.println(ch2);//a
char ch3 = '\u0061';//16进制,转成10进制也是97,所以代表是a 6*16^1+1*16^0=97
System.out.println(ch3);//a
课后题
- 求出123、-10对应的原码,反码和补码
没有给出具体类型 默认是int类型 下面按照byte和int分别算下,只作为练习
123是byte 8位 二进制原码为 0111 1011 反码补码都相同
int 32位 二进制原码为 0000 0000 0000 0000 0000 0000 0111 1011;反码补码都相同
-10是byte 8位 原码1000 1010
反码1111 0101
补码1111 0110
是int 32位 原码为 1000 0000 0000 0000 0000 0000 0000 1010
反码为 1111 1111 1111 1111 1111 1111 1111 0101
补码为 1111 1111 1111 1111 1111 1111 1111 0110
```
2. 判断下列输出是否正确,如果正确得到结果应该是什么
```
System.out.println('a'+1); //98
System.out.println("5+5="+5+5); //先得到5+5=5 -> 再得到5+5=55 按从左往右顺序,字符串拼接
byte a = 3;
int b= 4;
System.out.println(a+b);//7 直接打印int
byte c = a + b; //错误 包含变量 int转byte 大转小,需要强转
System.out.println(c);//错误 c没有生成
int j = a + b;//正确 int接收int
System.out.println(j);//正确
float f = 123.45;//错误,加f或者强转
float f = 120;//正确
long a = 888888888888;//错误,加L
char ch = '\u0061';//'a'-----97------\u0061 三种格式都行
System.out.println(ch);
/*char类型的默认值为 \u0000----表现形式是一个空格,但对应的数字是0 */
```
以下能作为char类型的字面值的有( B D )
A. "e" B. 'f' C. '\u12' D. '\u0012' E. '\n'
以下选项中正确的有(A C D )
A. int i = 32; B. float f = 45.32; C. double d=3.2; D. double d=9.21D;
相关例题
1. 输入:用户在终端上输入自己的名字,比如 "凤姐"
输出:在控制台上打印 :
凤姐好美
凤姐好坏
凤姐公认是人见人爱
```
import java.util.Scanner;
/**
输入:用户在终端上输入自己的名字,比如 "凤姐"
输出:在控制台上打印 :
凤姐好美
凤姐好坏
凤姐公认是人见人爱
*/
public class Tesst1 {
public static void main(String[] args) {
Scanner input= new Scanner(System.in); //固定的键盘录入格式
System.out.println("请输入名字");
String name = input.next(); //next用于接受字符串
System.out.println(name+"好美");
System.out.println(name+"好坏");
System.out.println(name+"人见人爱");
}
}
```
1. 接收输入:用户在控制台输入两个数字,比如先输入一个3,再输入一个5
运行结果:在控制台上打印: "相加的结果是:8" 相减、相乘、相除分别打印
```
import java.util.Scanner;
public class Tesst1 {
//接收输入:用户在控制台输入两个数字,比如先输入一个3,再输入一个5
//运行结果:在控制台上打印: "相加的结果是:8" 相减、相乘、相除分别打印
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字");
double a = input.nextDouble();
System.out.println("请输入第二个数字");
double b = input.nextDouble();
System.out.println("相加的结果是:"+(a+b));
System.out.println("相加的结果是:"+a+b); //此时a+b没有括号,按照从左到右进行字符串拼接,输出结果与预期不符
System.out.println("相减的结果是:"+(a-b));
// System.out.println("相减的结果是:"+a-b);//报错,按照字符串拼接,但字符串没有减法
System.out.println("相乘的结果是:"+a*b);
System.out.println("相除的结果是:"+a/b);
}
}
```