一、new 关键字
当一个引用类型的变量在声明的时候,由于没有被初始化,它不指向任何对象实例。使用new关键字可以创建一个对象实例,通过赋值,为引用类型的变量设置。
new 关键字的作用:
1.为对象的实例分配内存空间,给对象实例的成员变量赋上变量相应类型的默认值;
2.如果成员变量在声明的时候有初始值,这按照成员变量初始化的顺序,为某些类成员变量赋值;
3.调用构造方法;
4.返回对象的引用。
public class Sample { int memberV1; int memberV2=1; int memberV3; public Sample() { this.memberV3=3; } public static void main(String[] args) { Sample sample=new Sample(); } }
java虚拟机执行Sample sample=new Sample()的步骤如下:
(1)为一个新的Sample实例(/对象)分配内存空间,他所有的成员变量都被分配的内存空间,并且被自动初始化为变量所对应类型的默认值;
(2)初始化memberV2的值;
(3)调用构造方法,初始化memberV3的值;
(4)返回对象的应用给sample.
二、作用域:
在同一个作用域下不能定义相同的变量,但在不同的作用域下可以定义名称相同的变量。
局部变量作用域最小化的基本规则:
1.在需要使用局部变量的时候,在去定义它。
2.使方法小而集中
三、操作符
操作符“==”:当操作符“==”两边都是引用类型变量时,这两个引用变量必须都引用同一个对象,结果才是true.对于引用类型变量,java编译器根据变量被显式声明的类型去编译。当“==”用于比较引用类型变量时,“==”两边的变量被显式的声明的类型必须是同种类型或者是有继承关系-位于一个继承分支上,否则变异出错。
equals()方法:用于比较两个对象是否相同,可以被覆盖。
一个Person类的equals()方法(cardNo一样,则相同):
class Person { private String cardNo; private String name; public Person(String cardNo,String name) { this.cardNo=cardNo; this.name=name; } public boolean equeals(Object o) { if(this==o) return true; if(!(o instanceof Person)) { return false; } else { final Person temp=(Person)o; if(this.cardNo.equals(temp.cardNo)) { return true; } else { return false; } } } }
instanceof 用于判断一个引用类型所引用的对象是否是一个类的实例。instanceof 操作符左边的操作元是一个引用类型,右边的操作元是一个类名或接口名。instanceof左边的操作元被显式的声明的类型与右边操作元必须是同种类或有继承关系,即位于继承树的同一个继承分支上。
int[] a=new int[10]; boolean c1=a instanceof int[]; //true /*编译出错 boolean c2=a instanceof long[]; */
基本数据类型的数值在做运算的时候最低的操作类型是int性、
short i1=100; short i2=10; /*错误,因为i1、i2被转为int后,才开始相加,结果是int short i3=i1+i2; */ short i3=(short)(i1+i2);
四、流程控制
switch语句:
(1)在switch(expr)语句中,expr表达式的类型必须是与int类型兼容的基本类型,所谓与int类型兼容,是指能自动转换为int类型。因此expr的合法类型包括byte,short,char,int类型。long等类型都不可以。
(2)在”case valueN“子句中,valueN表达式必须满足一下条件:
- valueN的类型必须是与int类型兼容的基本类型,如byte,short,char,int
- valueN必须是常量
- 各个case自居的valueN表达式的值不同。
- 如果switch表达式与某个case表达式匹配,或者与default情况匹配,就从这个case子句或者default子句开始执行。假如遇到break语句,就退出整个switch语句,否则依次执行switch语句中后续的case子句,不再检查case表达式的值
标号:借助使用标号可以是break或者continue语句达到特定的效果:
label1: for (int i = 0; i < 5; i++) { label2: for (int j = 0; j < 5; j++) { if (i == 2) break label1; if (i == 3) break label1; if (j == 2) continue label2; if (j == 3) break; System.out.println("i=" + i + ",j=" + j); } } 结果: i=0,j=0 i=0,j=1 i=1,j=0 i=1,j=1
在使用标号时,要注意:在语法上标号可以用以标识除变量声明之外的所有有效语句。