常见的进制
十进制 1010
二进制 满二进一 0B10101010 (JDK1.6是可以这样的)
八进制 满8进一,数字在0_7之间 077 078(error)
十六进制 满16进一,数字在0-9 A B C D E F 0x开头,x不区分大小写,0x0010 0XAABB
计算机中,所有的内容在内存中都是二进制表示的
'A'-->它的ASII 65 1000001
进制的转换
==十进制转成二进制
6-->110
21-->10101
==二进制转十进制
10101-->1*2^0+0*2^1+1*2^2+0*2^3+1*2^4=21
==二进制转八进制
10101010001010111---->010 101 010 001 010 111==0252127
==二进制转十六进制
10101010001010111 --->0001 0101 0100 0101 0111==0x15457
计算机中,一个二进制位是一个比特位(bit), 8个比特位是一个字节
1024个字节,就是1k
1024k是1M
1024M是1G
1024G是1T
1024T是1p
你好 4个字节
101010101010101001
4/1024==2/512 1/256
负数在内存中表现的形式:是正数的按位取反+1
3 -3
byte a=3; //1个字节
0000 0011
1111 1100
+ 1
==================
1111 1101 -3
可以看出,正数的符号是0,负数的符号是1
1 把 34 ,32,9,13,26 转成2进制, 8进制,16进制
32 16 8 4 2 1 0b100010 042 0x22
2 把 010010 , 10100101 转成 10进制,8进制,16进制
010010 18 022 0x12
3 把0x1F, 0712, 076 转成 10进制,二进制
0001 1111 31
4 写出 short a=-8 在内存中的表现形式 (提示:short是2个字节的长度)
8
00000000 00001000
11111111 11110111
+ 1
======================
11111111 11111000 -8
2 标识符
规定函数的名称,变量的名称,类的名称,包的名称等符号规则 由字母(a-zA-Z),数字,下划线_ 或$ 组成,数字不可以放在第一位 不能与关键字相同,(public class static void....)' 严格区分大小写,汉字也可以 name, 9username, Name,user_name ,$name , _name, user name , publicName, public ,name999,#name, L9, 中国
3 变量
java中变量的类型 有两大类 (基本数据类型 引用数据类型)
基本数据类型 8 种
整型
byte 1个字节 有符号整数-128到127
byte a=127; //ok
byte a=-129; //error
short 2个字节 有符号整数 32767到-32768
short a=125; //ok
short a=32769; //error
int 4个字节 有符号整数 2147483647 到 -2147483648 之间
long 8个字节 有符号整数 9223372036854775807 到 -9223372036854775808 之间
long a=9; //ok java中整数的默认类型int类型,给long是没有任何问题
long a=9.0; //error,9.0是浮点型
long a=9L; //ok long型,可以在后面加一个L,大小写不区分
浮点型
float 4个字节 有符号浮点数 (又称为单精度) 8位有效数字,会发现最后一位会进行4舍5入原则
float a=3.14; //error 3.14默认是double类型,
float a=3.14f; //ok;
float a=40; //ok
double 8个字节 有符号浮点数(又称为双精度) 16为有效数字
double a=1.5; //ok
double a=1.5d; //ok
double a=1; //ok
字符型
char 2个字节 ,可以装下一个汉子吗? 一个汉子是一个字符
char的数字范围是多少之间?0-65535
char a='A';
char x='中';
char x='中国'; //error
char x='ab'; //error
char x="中"; //error
char x=90; //ok 能书写数字
char x=65536; //error
char x=''; //不可以
char x=' '; //ok
char x='u0000'; //ok 代表一个空值
//例一
char可以直接当数字进行计算
char a='A';
int b=5;
System.out.println(a+b); //70
//例二
两个char相加
char a='A';
char b='B';
System.out.println(a+b); //131
布尔型
boolean 一个字节
只有两个取值范围 true 和 false
说明:
整数的默认类型是int
90 -->int 90
小数的默认类型是double
3.14 --> double 3.14
例子
float a=3.14; //error
float a=3.14f;
或
double a=3.14;
long num=99999999999999;// error 原因:因为整数默认类型是int类型,但是99999999999999;超过了int,所以编译器在编译期报错
long num=99999999999999L; //ok
byte a=127;
//原因,因为byte127到-128,然后编译器在编译期的时候,是认识常量的,又因为byte能装下,所以没问题
引用数据类型
类 对象 接口 数组.....
4 运算符 (算数运算符 赋值运算符 逻辑运算符 关系运算符 位运算符 条件运算符)
===算数运算符 + - * / % ++ --
15000/10000*10000 -->10000
1) / 使用
两个整数相除,结果保留整数位
double a=15000/10000--> 1.0 //15000和10000默认是整数int,相除得1,但是赋值给double,变成1.0
double a=15000f/10000f; -->1.5
2) %
5%3=2
3%5=3
3) ++ -- 在原来的基础上加一或者减一
int a=10;
a++; //a=a+1; 在a的基础上进行加一
System.out.println(a); //11
也可以这样写 ++a,也是让a自加
++ 在前面和在后面有什么区别?
//++在后面的例子
int a=10;
int b=a++; //++在后面,要先赋值,此时b为10,在a++;此时a为11
System.out.println(a); //11
System.out.println(b); //10
//++在前面的例子
int a=10;
int b=++a; //++在前面,要先自加,此时a为11,在赋值;此时b为11
System.out.println(a); //11
System.out.println(b); //11
--和++一个意思,只是做了减去一
4) 字符串相加
String str="1+2"+"3+4"; //此时的+是字符串连接符,并不是算数中的+
如果两个不同类型的数进行计算,会把两个类型变成相同类型的,把小的变成大的
String str="1+2="+1+2;
System.out.println(str); //1+2=12
原因:"1+2"是字符串,而1是整数,类型不同,需要把小的int变成大的String,所以它们中间的+,就是字符串连接符,所以即是这个结果
String str2=1+2+"1+2=";
System.out.println(str2); //31+2=
String str="1+2="+(1+2);
System.out.println(str); //1+2=3
几个常用的转义字符
转义字符
"""-->"
n 换行
r 回车 //在window中,就是把光标移动到下一行
t 制表符,相当于tab
//通常在window系统中 换行符 rn linux是n
=====赋值运算符
//例一
byte a=10;
int b=a; //ok 小类型往大类型放,没问题
//例二
byte a=10+5; //ok
//例三
byte a=10;
a=a+5; //error ,第一点:a是变量,编译器不认识变量,认为a+5很可以超过byte,所以java不让
第二点:a是byte,5是int,所以a+5最后是int类型,赋值给byte,不行
//例四
short a=10;
a=a+5; //不行,和上面原因一样
//例五
int a=10;
a=a+5; //行
实验发现:上例子对byte和short都会报错,只有int没有,因为byte和short类型结果容易越界,所以
java中规定对含有它们的变量进行计算的时候,不能再用byte和short去接受
//例六 类型转换
byte a=90;
int b=a; //ok
int a=10;
byte b=a; //不行,如果非得行,就要强制类型转换
int a=10;
byte b=(byte)a; //强制类型转换,当byte型可以装下的时候
强调:强转的时候,要注意,不要超过低类型的范围
如果超过低类型范围
int a=128;
byte b=(byte)a;
System.out.println(b); //-128
问:有没有那么一种可能,原数值+1<原数值,存在,原数值是此类型最大值
//例七 关于+=的操作
byte a=90;
a+=10; //a=a+10 -= *= /= %= a+=10操作是比a=a+10快,并且有强制转换的含义a=(byte)(a+10)
System.out.println(a);
======关系运算符
< > <= >= != == instanceof
关系运算符的结果都是boolean类型的
======逻辑运算符
& 与 两边都成立的时候,才为真,有一个为假,结果就为假
a>b & b>c
| 或 两边只要有一个成立的,结果就为真
1>2 | 2>1
^ 异或
两边相同,结果为假,两边不同,结果位真
true^false true
true^true false
false^false false
! 非
&& 短路与
|| 短路或
&和&&有什么区别? !!!!
前者左边不成立,右边还是会继续判断,
后者左边不成立,右边就不会再进行判断了
1>2 || 2>1 && 3>2 true
&&优先级||
======位运算符
& 按位与
00000001
00000010
========
00000000
| 按位或
00000001
00000010
========
00000011
~ 按位取反运算符
~5=-6
00000101
11111010 -6
负数=正数取反+1
正数取反=负数-1 正数取反=11111001
正数=取反(正数取反) 正数=00000110 6
^ 异或
相同为0,不同为1
00000001
00000010
========
00000011
附:一个数值和另一个数值,进行两次异或操作,将得到原来的值
int a=90;
a^=58; //a=a^58;
System.out.println(a);
System.out.println(a^58);
<< //算数左移,逻辑左移
算数左移和逻辑左移一样都是右边补0
例子 数字6
0000 0110 6
左移一次
0000 1100 12
发现:左移一次相当于成2
(面试题: 如何快速算出2*8,让 2<<3)
ps:这种成倍关系只有当左移被舍弃的高位不含有1的时候
>> //算数右移,逻辑右移
逻辑右移:只要将二进制整体右移,左边补0即可
例如:00001100 逻辑右移 00000110
相当除2
ps:30>>12=0
算数右移:符号位要一起移动,并且在左边补上符号位,如果符号位是1,就补1,是0就补0
如果:11100算数右移一次,11110,(符号位进行补全)
=====条件运算符 (三元表达式也叫做三目运算符)
格式:
条件表达式?表达式一:表达式二;
执行流程:先判断条件表达式是true还是false,如果为true,那么结果为表达式一,否则为表达式二
//例子 获取两个数据最大值
int a=10;
int b=12;
int max=a>b?a:b;
//例子 如果工作天数>30天,给5000元,否则是1000
int day=29;
int 钱数=day>30?5000:1000; //int 钱数=5000;
//例子 如果工作天数>30天,"继续努力",否则是"开除了"
int day=29;
String str=day>30?"继续努力":"开除了";
//例子
int day=29;
String str=day>30?System.out.println("继续努力"):System.out.println("开除了"); //编译报错
5 流程控制语句的几种结构
1) 顺序结构 略
2) 选择结构
3) 循环结构
==选择结构
if
if...else
多重if
嵌套if
//例子 if
int age=12;
if(age>20){
System.out.println("年龄大于20");
}
System.out.println(" 大专栏 java运算符、流程控制语句年龄小于20");
或者
int age=19;
if(age>20)
System.out.println("年龄大于20"); //离if最近的语句是if中的语句,不建议
System.out.println("年龄小于20");
//例子 if...else
int age=19;
if(age>20){
System.out.println("年龄大于20");
}
System.out.println("我什么时候执行?"); //if和else中间不能有任何语句
else{
System.out.println("年龄小于20");
}
//多重if
public static void main(String[] args){
int month=10;
if(month==1){
System.out.println("一月");
}else if(month==2){
System.out.println("二月");
}else{
System.out.println("其他月份");
}
if(month==3){
System.out.println("三月");
}
}
//嵌套if
public static void main(String[] args){
String today="周末";
String weather="晴朗";
if(today.equals("周末")){ //String类型进行比较用equals("")
if(weather.equals("晴朗")){
System.out.println("去户外活动");
}else{
System.out.println("去室内活动");
}
}else{
System.out.println("上班");
}
}
======switch 选择语句
格式
switch(表达式){ //byte short int char Enum(枚举类型) String(jdk1.7之后实现的)
case 值1:
执行语句;
break;
case 值2:
执行语句;
break;
case 值3:
执行语句;
break;
default:
执行语句;
break; //最后一个break可以省略
}
//例子
int a=2;
switch(a){
case 1:
System.out.println("a");
break;
case 2:
System.out.println("b");
//break; 如果这里不加break,则下面的语句还会还行,直到遇到break,才结束switch
case 3:
System.out.println("c");
break;
default:
System.out.println("其他");
//break;
}
//例子
public static void main(String[] args){
int a=2;
int b=3;
char ch='+';
switch(ch){
case '+':
System.out.println(a+"+"+b+"="+(a+b));
break;
case '-':
System.out.println("a-b="+(a-b));
break;
case '*':
System.out.println("a*b="+(a*b));
break;
case '/':
System.out.println("a/b="+(a/b));
break;
default:
System.out.println("其他");
//break;
}
//例子
//需求 根据用户指定的月份,打印出所属的季节
int a=2;
switch(a){
case 1:
case 2:
case 12:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
default:
System.out.println("输入有误");
}
//switch语句速度比if快
// if(a==2){
}else if(a==1){
}else if(a==3){
}
switch(a){
case 1:
....
case 2:
....
}
//例子
从键盘输入一个月份,判断他是第几季度
import java.util.Scanner;
class Hello{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
int month=scan.nextInt();
if(month>=1 && month<=3){
System.out.println("第一季度");
}else if(month>=4 && month<=6){
System.out.println("第二季度");
}else if(month>=7 && month<=9){
System.out.println("第三季度");
}else if(month>=10 && month<=12){
System.out.println("第四季度");
}else{
System.out.println("月份有误");
}
scan.close();
System.out.println("程序结束");
}
}
====循环结构
下周见
//练习
1.把今天的例子都写一遍,然后保存起来
2.输入一个成绩
0-20 分之间:这孩子完蛋了
21-40 之间:这孩子太操心了
41-60 之间:赶紧救救吧
61-80 之间:祖国的希望
81-100 之间:开什么玩笑,一定是抄的
public static void main(String[] args) {
/*
* 输入一个成绩 0-20 分之间:这孩子完蛋了 21-40 之间:这孩子太操心了 41-60 之间:赶紧救救吧 61-80 之间:祖国的希望
* 81-100 之间:开什么玩笑,一定是抄的
*/
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个分数");
int score = scan.nextInt();
if (score >= 0 && score <= 20) {
System.out.println("这孩子完蛋了");
} else if (score >= 21 && score <= 40) {
System.out.println("这孩子太操心了");
}else if(score >= 41 && score <= 60){
System.out.println("赶紧救救吧");
}else if(score >= 61 && score <= 80){
System.out.println("祖国的希望");
}else if(score >= 81 && score <= 100){
System.out.println("开什么玩笑,一定是抄的");
}else{
System.out.println("数字有误!");
}
scan.close();
}
3.输入两个整数,一个符号
然后进行加减乘除操作
public static void main(String[] args) {
/*
* 3.输入两个整数,一个符号 然后进行加减乘除操作
*/
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个整数");
int num1 = scan.nextInt();
System.out.println("请输入第二个整数");
int num2 = scan.nextInt();
System.out.println("请输入一个符号");
String str = scan.next(); // "+"
char ch=str.charAt(0); //'+'
switch (ch) { // char '+' '-'
case '+':
System.out.println(num1+"+"+num2+"="+(num1+num2));
break;
case '-':
System.out.println(num1+"-"+num2+"="+(num1-num2));
break;
case '*':
System.out.println(num1+"*"+num2+"="+(num1*num2));
break;
case '/':
System.out.println(num1+"/"+num2+"="+(num1/num2));
break;
default:
System.out.println("您输入的符号有误");
break;
}
scan.close();
}
4.输入一个年份和一个月份,得到当前月份一共多少天
Scanner scan = new Scanner(System.in);
System.out.println("请输入月份");
int month = scan.nextInt();
System.out.println("请输入年份");
int year = scan.nextInt();
switch (month) { // char '+' '-'
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(year+"年的"+month+"月有31天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println(year+"年的"+month+"月有30天");
break;
case 2:
//能被4整除并且不能被100整除 或者 能被400整除的数
if((year%4==0 && year%100!=0) || year%400==0){
System.out.println(year+"年的"+month+"月有29天");
}else{
System.out.println(year+"年的"+month+"月有28天");
}
break;
default:
System.out.println("输入的月份有误");
break;
}
scan.close();
12345678910111213141516171819202122 | 1. 定义一个类名字叫person,类中有主方法,方法中有几个类型变量 第一个是byte类型变量,变量名(9age,age)任选一个作为名称,表示年龄,给9岁 第二个是short类型,变量名(fa age,$fage)任选一个作为变量名称,给30; 第三个是int类型,变量名a 给50; 第四个是long类型,名称b 给100; 第五个是float类型,名称给f,给4.0 第六个是double类型,名称d 给6.87 第七个是char类型,名称c 给40; 第八个是char类型,名称c1 给'中' 第九个是char类型,名称c2 给'国' 分别输出第一个加第二个值 int af=age+$fage; 输出第六个加第五个值 输出第四个加第三个加第七个值 输出第八个加上第九个 看到结果 age+fa_age=??? System.out.println("age+fa_age="+af); byte age=9; short $fage=30; |
附:
next()和nextLine()区别?
nextLine()遇到回车,即为结束,
next()遇到无效字符,即为结束