构造方法:首先构造方法是类的一种特殊方法,用来初始化类的一个新对象,在创建对象(new运算符)之后会自动调用。
关键点:
1.构造方法是一种特殊方法,他的名字必须与他所在的类的名字完全相同,且没有类型。
2.允许一个类中编写若干个构造方法,但必须保证他们的参数不同,即参数的个数不同,或者是参数的类型不同。
3.构造方法的作用是在创建对象时使用,主要是用来初始化各个成员变量以便给类所创建的对象一个合理的初始状态。
三种构造方法:
class B{
public B(){
}
public B(int aa){
a =aa;
}
public B(B bb){
a=bb.a;
}
int a=3;
}
三种构造方法用于给对象初值(创建对象时自动调用初始化对象),如果没有写其他的构造方法,则默认系统会自动写第一种(不显示的)。如果写了其他的那么第一种要自己加,第一种括号内无参数无默认值,第二种给初值,第三种复制另一个对象的值(构造一个新对象a属性和bb的a一样)。
实例方法和类方法:
类体中的方法分为实例方法和类方法两种,其中用static修饰的是类方法。当类的字节码文件被加载到内存时,类的实例方法不会被分匹配入口地址,当这个类创建了对象之后,类中的实例方法才会分配入口地址,从而实例方法可以被类创建的任何对象调用执行。
需要注意的是实例方法的入口地址是被所有的对象共享的,也就是说创建第一个对象的时候类中的实例方法就分配了入口地址,再创建新的对象时不会再次分配,直到所有的对象都不存在时,方法的入口地址才被取消。而相比之下类方法是在类被加载到内存的时候就会分配相对应的入口地址,由此可以理解为在实例方法中可以调用其他实例方法以及类方法,而类方法分配入口地址时其他实例成员变量暂未分配内存,所以类方法中不可调用实例方法(也就是说类方法中出现的成员变量必须是类变量,类方法不能操作实例变量)。
无论是类方法还是实例方法,被调用执行的时候,方法的局部变量才被分配内存空间,调用完毕会被立即释放,再次调用又再次分配,如此。(记得区分这里的局部变量和上一段说得类方法不能操作实例变量,我初学的时候一开始读这句话没分清局部变量和实例变量,局部变量是定义在方法中的,实例变量是定义在类中的)。
This:
this是java的一个关键字,this可以出现在实例方法和构造方法中,但不能出现在类方法中,我个人的理解是实例方法和构造方法都是有具体对象的调用,this有所指,指向调用或者被创建的对象,而类方法是可以通过类名执行的,this无所指故不可使用。
class A{
int x;
static int y;
void f(){
this.x=100;
A.y=200;
}
}
上述this关键字代表使用方法f的当前对象 ,所以this.x就表示当前对象的变量x,当对象调用方法f时,将100赋值给这个对象的变量x。而类变量和其他对象共享所以可以省略this直接写A.y。当然通常情况下可以省略成员变量名字前面的this以及类变量的类名。上述代码可以写成如下:
class A{
int x;
static int y;
void f(){
x=100;
y=200;
}
}
但是当实例成员变量名字和局部变量相同时,成员变量前面的this或者类名就不能省略,此时的this.名字就代表实例变量,如:
class A{
int x;
static int y;
void f(int x){
this.x=x;
y=200;
}
}