一、一切都是对象
1.引用操控对象
java中一切都是对象,对像的操控是通过引用实现的。就如同电视是一个对象,遥控器是引用,通过遥控器来操控电视。
String str ;
str就是String的引用。
String s = new String("a");
通过new String()来创建String对象,通过引用s来实现对对象String的操控。
2.对象存储
寄存器:位于处理器的内部,是最快的存储区。
堆栈:位于RAM中。堆栈指针下移,分配新内存,堆栈指针上移,释放内存。一般对象的引用存在此处。
堆:也位于RAM中。存放所有的java对象。当执行new方法时才会在堆中分配内存。
常量存储:存入ROM只读内存中。
非RAM区:一般用于流对象和持久化对象。
3.基本类型
基本类型 | 大小 | 最小值 | 最大值 | 包装类 |
boolean | - | - | - | Boolean |
char | 16bit | Unicode0 | Unicode2^16 -1 | Char |
byte | 8bits | -128 | 127 | Byte |
short | 16bits | -2^15 | 2^15 | Short |
int | 32bits | -2^31 | 2^31 | Integer |
long | 64bits | -2^63 | 2^63 | Long |
float | 32bits | IEEE754 | IEEE754 | Float |
double | 64bits | IEEE754 | IEEE754 | Double |
void | - | - | - | Void |
4.类的相关信息
1)作用域
java中作用域由花括号位置决定
{
int a =1;
{
int b =2;
//a,b 都可用
}
//仅a可用
}
2)方法签名
方法签名(唯一的标示出某一个方法):方法名+参数列表
3)基础成员默认值
class A{
int a ;
void add(){
int b;
//a 可以直接使用,类的基础成员变量有默认值
//b不能直接使用,局部变量需要初始化
}
}
4)staic关键字
类字段:占用一份存储空间,多个对象共同共享。
class A{
static int i =10;
static void add(){}
}
A a1 = new A();
A a2 = new A();
a1,a2共享一个i
类方法:可以通过类.方法名来对方法调用,而不用创建对象。
A.add();
二、操作符
+,-,*,/,% , > ,>= ,<,<=
&& 短路 A&&B&&C 当B为 false时,C不再计算
|| 短路。E|F|G. 当F为true时,G不再计算
不短路:& 按位与 , | 按位或 ,^异或,~按位非。 &= ,|= , ^=
“=” 赋值
“==” 等于
“!=” 不等于
“==” “!=” 用于比较对象的引用
注意:基本类型存储了实际的数值,而非指向一个对象的引用,所以在为其赋值时,是直接将一个地方的内容复制到另一个地方。
public class TypeName {
int level;
}
public static void main(String[] args){
TypeName t1 = new TypeName();
t1.level=10;
TypeName t2 = new TypeName();
t2.level=20;
System.out.println("t1:"+t1.level);
System.out.println("t2:"+t2.level);
t1=t2;
System.out.println("t1:"+t1.level);
System.out.println("t2:"+t2.level);
t1.level=30;
System.out.println("t1:"+t1.level);
System.out.println("t2:"+t2.level);
}
t1:10
t2:20
t1:20
t2:20
t1:30
t2:30
赋值是操作一个对象的引用,所以当:t1=t2时,t1,t2引用同时指向t2的引用,当这个引用对象的值改变时,t1,t2对应的值也会改变。
++x,--x 操作符位于变量前面或表达式的前面
x++,--x 操作符位于变量后面或表达式后面
{
int i = 10;
System.out.println("++i:"+(++i));
System.out.println("i++:"+(i++));
}
++i:11
i++:11
比较:equals() 与 “==”区别
equals():不适用于基本类型,用于比较对象的内容是否相等
== :比较两个对象引用是否相同
public class TypeName {
int level;
}
TypeName t1 = new TypeName();
t1.level=10;
TypeName t2 = new TypeName();
t2.level=10;
boolean b = t1.equals(t2);
System.out.println("t1.equals(t2):"+b);
System.out.println("t1.level.equals(t2.level):"+(t1.level==t2.level));
t1.equals(t2):false
t1.level==t2.level:true
Integer i1 = 10;
Integer i2 = 10;
System.out.println("i1.equlas(i2):"+(i1.equals(i2)));
i1.equlas(i2):true
equals默认是比较引用,如果要实现内容的比较需要覆盖equals(),Integer 实现了equals() 方法的覆盖,TypeName 没实现对equals()方法的覆盖,所以Integer比较的是内容,TypeName比较的是引用。
三、控制执行流程
1.基本语法
1) if () {} else if(){}else{}
2) while(){}
do{}while(){}
3) for(int i=0;i<10;i++){}
for(String s:str){}
4) switch(c){
case 'a': xxx break;
case 'b': xxx break;
default:
}
2.关键字
return:返回值,并退出。如果是void,直接退出。
break:跳出当前的循环,不执行循环中剩余的语言。
continue:退出当前循环,然后退回循环起始处,执行下一次循环。
for(int i=0;i<5;i++){
for(int j=i+1;j<5;j++){
if(i*j%3==0){break;}
System.out.println(i);
System.out.println(j);
System.out.println("i*j:"+(i*j));
}
}
}
1
2
i*j:2
for(int i=0;i<5;i++){
for(int j=i+1;j<5;j++){
if(i*j%3==0){continue;}
System.out.println(i);
System.out.println(j);
System.out.println("i*j:"+(i*j));
}
}
}
1
2
i*j:2
1
4
i*j:4
2
4
i*j:8
可见break只是退出当前循环,同时不再执行该循环的后续操作。continue,只是退出该一次循环,而不是整个循环。
int i = 0;
outer:
for (;true;){
inner:
for(;i<10;i++){
System.out.println("i=="+i);
if(i==2){
System.out.println("continue");
continue ;
}
if (i==3){
System.out.println("break");
i++;
break ;
}
if(i==7){
System.out.println("continue outer");
i++;
continue outer;
}
if(i==8){
System.out.println("break outer");
break outer;
}
for(int k=0;k<5;k++){
if(k==3) {
System.out.println("continue inner");
continue inner;
}
}
}
}
}
i==0
continue inner
i==1
continue inner
i==2
continue
i==3
break
i==4
continue inner
i==5
continue inner
i==6
continue inner
i==7
continue outer
i==8
break outer