内存分类:栈内存、堆内存、寄存器、方法构造(代码段)、池内存
栈内存:地址、基本内存的值(栈内存很小,不放对象)
堆内存:对象、地址、基本内存的值、
寄存器:运算的中间值
代码段:如构造方法等的代码
池内存:长放在内存里面的东西放在池内存里面(常驻内存)
Staff staff = new Staff () ;
执行次序:①Staff staff现在栈里面
图 1-1
publicclass Test {
publicstaticvoid main(String[] args) {
Staff staff = new Staff();
staff.id="007";
staff.name="詹姆斯.邦德";
staff.salary=10000.0F;
staff.faSalary();
}
}
publicclass Staff {
String id;
String name;
float salary;
publicvoid faSalary(){
System.out.println(salary);
}
}
编译:javac -d . Hello.java
运行:Java com.tenara.Hello
import语句可以导入不同包的class文
虚拟机先找栈,通过栈找到堆!
垃圾回收机制回收的主要是堆内存里面的东西。GC是怎么判断堆内存里面的东西已经成为垃圾可以被回收了?GC是从栈找到堆,如果堆里面的内容在栈里面没有对应的地址变元,则被视为垃圾清理掉!
import java.util.Scanner; //扫描键盘
publicclass Test2 {
publicstaticvoid main(String [] args){
Scanner sc = new Scanner(System.in);
//扫描字符串
String str=sc.next();
System.out.println("输入了"+str);
//扫描整数
int aa=sc.nextInt();
System.out.println("输入了"+aa);
//扫描double
double dd=sc.nextDouble();
System.out.println("输入了"+dd);
}
}
Operators
1、"( )"优先级高 2、"="优先级低
Assignment operators
= += -= %= *= /= <<= >>= >>>=
&= ^= |=
publicclass Test6 {
publicstaticvoid main(String [] arsg){
byte b1=2;
byte b2=3;
b1=(byte)(b1+b2); // 语句1 加法,转int
b1+=b2; //语句2 赋值,不转int
}
}
b1+=b2;是否和语句b1=b1+b2完全等价?
答案是否定的,上面程序中的语句1和语句2给出了证明。
语句1中byte类型参与运算时要先转换为int类型,因此要进行强制类型转换。而语句2中,自动进行类型转换。(我的理解:我们可以把“b11+=b2;”看做是对“b1=(byte)(b1+b2);”的优化!)
publicclass Test10 {
publicstaticvoid main(String[] args) {
byte b1=100;
byte b11=100;
byte b2=120;
b1=(byte)(b1+b2);
System.out.println(b1);
b11+=b2;
System.out.println(b11);
}
}
运行结果为:-36 -36
Comparison operators
> >= < <= instanceof
Equality operators
= = !=
Arithmetic operators
+ - * / %
import java.util.Scanner;
publicclass Test4 {
publicstaticvoid main(String [] args){
Scanner sc=new Scanner(System.in);
int second=sc.nextInt();
int hour=second/3600;
int minute=second%3600/60;
int second2=second%60;
System.out.println(second+"秒= "+hour+"小时"
+minute+"分钟"+second2+"秒");
}
}
Shift operators
>> << >>>
Bitwise operators
& | ^(按位异或) ~(按位取反)
Logic operators
&& (逻辑与) & || (逻辑或) | !(逻辑非)
&&和&都是逻辑与,它们之间的区别:&&是短路逻辑与,有短路的效果,效率更高。
||和|都是逻辑或,它们之间的区别:||是短路逻辑或,有短路的效果,效率更高。
publicclass Test8 {
@SuppressWarnings("unused")
publicstaticvoid main(String[] args) {
int i=6;
System.out.println(1>2&&(5<i++));
System.out.println(i);
int j=6;
System.out.println(1>2&(5<j++));
System.out.println(j);
int m=6;
System.out.println(2>1||(5<m++));
System.out.println(m);
int n=6;
System.out.println(2>1|(5<n++));
System.out.println(n);
}
}
运行结果: false 6 false 7 true 6 true 7
Conditional operators
? :
publicclass Test9 {
publicstaticvoid main(String[] args) {
int a=5;
int b=3;
System.out.println(a>b?a:b);
System.out.println(a>b?"ok":4);
}
}
注意第二个输出语句中"ok"和4的类型不同,有的JDK版本可能要求条件语句中这两个语句的类型必须相同,如果运行出错,可以更换JDK的版本。
Other operators
++ --
publicclass Test5 {
publicstaticvoid main(String [] args){
int i=2;
System.out.println(i++); //2
System.out.println(i); //3
int a=i++ + ++i; //3+5=8
System.out.println(a);
System.out.println(i); //5
for(int j=0;j<1000;j++){
i=i++;
}
System.out.println(i); //5
}
}
程序分析:
为什么经过1000次循环后,i=i++;的结构仍然是5?
(达内老师讲解)++的运算符优先级高于=(赋值)运算符,i++的运算结果为5,送入寄存器,这时寄存器中存放的值为5。然后i的值变为6,继续执行赋值语句,赋值时,把寄存器中的值赋5值给i,因此i的值是在5和6之间来回切换的!
(我的理解)++的运算符优先级高于=(赋值)运算符,因此这个表达式的执行顺序如下:①运算i++这个表达式的结果为5 。----> ②i的值自加1(i++先参与运算,再自加1),即i的值变为6。----> ③将i++这个表达式的值,即第①部的结果赋值给变量i。("="表达式是将右边表达式的值赋值与左边的变量,因此是将5赋于i,而不是将6赋于i)。整个循环过程i的值在5和6之间来回切换。
作业:加上scanner输入员工的id/name/sal,然后执行加薪和发薪的作业。
用两种写法输出3个数字的最大值(用scanner输入3个Int,打印出最大值)
Flow Control
if else statement
switch case statement
while loop
do while loop
for loop