一.补充
jdK 1.0 后
int num=45 045 0x45
Jdk7.0 后
int num=0b0101; //二进制
System.out.println(10_10_111);//1010111 可以这样写
进制转换 二进制转十进制无需多言 八进制转十进制 无需多言
各数据类型的默认值
/**
boolean - false
char - '\u0000' [空格]
byte - 0
short int long float double
0 0 0L 0.0F 0.0引用数据类型的默认值 都是 null
*/
二.开始新的java中的运算符
1【+ - * / %】 .
+号
算数加法 追加连接
【最小的数据类型int,char+char=int】
int +int =int
char+char=int
int +char=int
int +String=String
char+String=String
double+String=String
String+String=String
总结:最小的数据类型int,String和任意类型为String,出现String类型,””+任意类型=String类型
特例
Byte x=45;
Byte y=56;
Byte z=x+y;//错误 必须强转啊 Byte z=(int)(x+y);
System.out.println(z); 最小单位是int
-号
无需多言
*号
注意一点 乘以太大的数超过类型范围时需要切换数据类型 BigDecimal
/ 号 注意的地方有两个例外
System.out.println(5.0/0.0);//Infinity 无穷
System.out.println(5/0);//报错
System.out.println(0.0/0.0);//NaN Not a Number
% 模运算 取余
最终结果符号取决于参与运算的第一个数字
5%2=1
5%-2=1
-5%2=-1
-5%-2=-1
进度条
百分号
System.out.println(512.0/1024.0*100+"%");//换成double类型可以
System.out.println(512*100/1024+"%");//利用数学方式提前*100
public class Exec2{
public static void main(String[]args){
//如何求出100以内最大的7的倍数
System.out.println(100-100%7);// 100-(100-7-7-7-7-7....)
System.out.println(100/7*7);//数学方式 /7获得多少个7 然后*7
}
}
2.+= -= *= /= %=
思考:
int num=45;
//num=45+5.5;//报错了
System.out.println(num);
如果使用 num+=5.5 就不会报错 所以这就提到了隐式类型强转了,以下书写
int y=10;
y+=5; y=y+5;;y=5+y;
int x=10;
x=x-5; x-=5;但不能等于 x=5-x;
int z=10;
z*=5; z=z*5;;
int m=10;
m=m/5;m/=5;但是不能等于 m=5/m
3.【++ -- 】自增自减
主要是两方面 取值 运算
x++ 先取值 再运算
++x 先运算 再取值
面试题 x=x++;
4.[> < >= <= ! = != ==]
System.out.println(12>'a');// false
System.out.println(98>'a');//true
“!” 取反
boolean !true =false
boolean flag=true;
If(flag=true) 可以 因为留下的是boolean类型
面试题=和==的区别:
```java
= 赋值运算符 将=右侧的值交给左侧的变量保存
== 判断运算符 判断左右两侧的值是否相等[true/false]
```
5.【&& || & |】逻辑运算符
&& & 与并且 两个条件 同时成立 为true
|| | 或者 有一个成立即可 为true
面试题:
&& 和& 之间的区别
相同点:&&和&都表示与 相当于汉文中并且的含义
不同点: && 又称短路与 具有短路特性[效率高]
短路特性:如果可以通过前面的条件获取最终的结果【false】 后面的条件不再判断
|| 和|之间的区别
相同点:||和|都表示或 相当于汉文中或者的含义
不同点:|| 又称短路或 具有短路特性[效率高]
短路特性:如果可以通过前面的条件获取最终的结果【true】 后面的条件不再判断
boolean && boolean
true 继续判断
boolean ||boolean
true 不判断了
public class Test01{
public static void main(String[] args){
int num=45;
if(num++>45&&++num<56){
System.out.println("Hello");//不打印
}
System.out.println(num);//46
if(num++>45&++num<56){
System.out.println("Hello");//打印
}
System.out.println(num);//48
}
}
6【& | ^ ~】位运算符
所谓的位运算符即 二进制计算
& 1&1=1,其他为0
| 1|1=1 1|0=1 0|1=1 0|0=0
异或 ^ 相同为0 不同为1
~ 按位取反
~45=~00101101
=11010010
按位与 & 取代%运算 必须要记住的
%2 %4 %8 %16 %2^n
&1 &3 &7 &15 %2^n -1
面试题 交换x和y的数据
1.开辟第三方空间
Int k=x;
X=y;
Y=k;
2.使用三步异或交换 相比之下开辟第三方空间更快
^交换变量的内容
Int x=45;
Int y=56;
x=x^y;
y=x^y;
x=x^y;
& 运算优先级小于==
If((num&1)==0)也可以写成if(num%2==0);
public class Test03{
public static void main(String[] args){
char c1='o';
char c2='k';
//1.开辟第三空间 交换
char c3=c1;
c1=c2;
c2=c3;
System.out.println("c1:"+c1+" c2:"+c2);
//2.使用异或 char异或以后居然是int类型
c1=(char)(c1^c2);
c2=(char)(c1^c2);
c1=(char)(c1^c2);
System.out.println("c1:"+c1+" c2:"+c2);
double d1=45.5;
double d2=56.6;
double d3=d1;
d1=d2;
d2=d3;
System.out.println("d1:"+d1+" d2:"+d2);
}
}
关于异或,并不是所有数据源类型都可以使用异或交换数据 只适合六种基本数据类型
boolean char byte short int long 可以使用异或 小数是不能使用异或的
7.【>> << >>>】
左移右移运算符 位移 二进制运算符
正数
01010101 >>1 右移变小
00101010 变小了/2 /4 /8 /16... /2^n
>>1 >>2 >>3 >>4 >>n
*2 *4 *8 *16... *2^n
<<1 <<2 <<3 <<4 <<n
面试:>> >>>区别
>>称为有符号的右移 高位补的内容看原本的符号位
01010101 >> 3=00001010
11010101 >> 3=11101010
>>>无符号的右移 高位直接补0好吧
11010101 >> 3 =00011010
8.【?:】三目运算符
boolean ? 2:3
- 第一部分永远是 boolean 类型
- 如果第一部分结果是true 那么执行第二部分
- 如果第一部分结果是false 那么执行第三部分
下面三目运算符特例:
System.out.println(45>56?’a’:65);// A
System.out.println(45<56?’a’:65539); // 65539
9.记住常用的取代
&取代%x % 2^n = x & 2^n-1<< 取代 *x * 2^n = x << n>> 取代 /x / 2^n = x >> n
三.java中的变量
java中的变量
1 java中的变量有哪些?
```java
成员变量 实例变量 属性【类体 方法体外】
局部变量 自动变量 【方法体中】
*java中没有全局变量的概念!!!
```
2 成员变量和局部变量有什么区别?【面试题】
```java
1 定义的位置不同:
成员变量:定义在类体里面 方法体外面
局部变量:定义在方法体里面
2 作用范围不同:
成员变量:也叫属性 表示对象有什么 依赖于对象而存在
当我们new对象的时候 属性随着也会创建
当对象消亡的时候 属性也会消亡
局部变量:从定义的那一行开始 一直到所在的方法结束之前可以访问
局部变量依赖于方法而存在
一旦所在的方法体执行结束 局部变量消亡
3 默认值不同:
成员变量:即使不赋值也有默认值 默认值是什么 看数据类型
局部变量:没有默认值 要求使用之前必须赋值!!!
```
3 成员变量和局部变量可以重名
```java
* : 成员变量和局部变量可以重名
如果成员变量和局部变量重名的话 直接访问该变量 默认是局部变量
如果成员变量和局部变量重名的话 想要访问成员 需要在变量的前面加 上 this.
this : 表示当前方法的调用者
```
下面是局部变量和成员变量重名时,优先获得局部变量,使用成员变量需要this
public class TestArgs2 {
public static void main(String[] args) {
Student stu = new Student();
stu.name = "zs";
stu.age = 18;
stu.show();
}
}
class Student {
String name;// zs
int age;// 18
public void show() {
// zs 18
System.out.println(name + " " + age);// 此时没有重名现象
String name = "zss";// 局部变量 - zss
System.out.println(this.name);// zs
// 重名了
System.out.println(name);// zss
}
}
局部变量使用之前要赋值 不然报错
public class TestArgs1{
// 成员变量-属性 name age
// 局部变量-方法体 stu
public static void main(String[] args){
Student stu = new Student();
stu.name = "坤坤";
stu.study("平平");
stu.show();
stu.test();
}
}
class Student{
String name;// 坤坤
int age;
double salary;
boolean flag;
// this =》 属性
public void study(String name){// 平平
// XXX和XXX一起学习
// 前提:重名了
// 直接获取 - 局部变量【就近原则】
// 获取属性 - 必须加 this.
System.out.println(this.name+"和"+name+"一起学习");
}
public void show(){
System.out.println(name);//
// System.out.println(hour);此时hour没有创建 报错:找不到符号
// int hour = 0;// 局部变量没有默认值
int hour;// 创建了
hour = 0;
System.out.println(hour);
}// hour自动消亡
public void test(){
System.out.println(name);
// System.out.println(hour);
}
}