1、构造方法与方法重载:
构造方法:构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。如果构造方法中有什么语句内容,那么当我们创建对象时这个语句就会执行。
在下面的这个例子中,我们没有写构造方法,但也可以创建类对象。原因是,如果我们没有写任何构造方法,那么编译器将会默认赠送一个构造方法,这个构造方法是无参构造,方法体内部什么都没有,这个构造方法就与图2等价
但是此时我们在图2中编写了一个构造方法,那么编译器还会赠送吗?显然是不会的,有了构造方法,编译器就就会按照你编写的构造方法执行。那么,假如我们在构造方法中写一个语句,这个语句在我创建对象时会不会输出呢?
我们将这个代码运行一下,得到的运行结果是:
public class Build_Method2 {
public Build_Method2(){
System.out.println("我是构造方法!");
}
void buy(String thing){
System.out.println("买了一个"+thing);
}
public static void main(String[] args) {
Build_Method2 method = new Build_Method2();
method.buy("香蕉");
}
}
所以,在创建对象时,构造方法内部的语句会率先执行一遍。
说完了无参构造,那我们来说一说有参构造。在说之前,先来了解一下什么叫方法重载,注意是重载不是覆盖重写,这俩经常搞混。所谓的方法重载就是,两个或者多个方法,共用同一个方法名,但是参数不同。方法重载要具备以下要素:
1、方法名相同。2、参数个数不同。3、参数类型不同。
与方法重载的不相关因素:
1、与参数名称无关。2、与参数返回值类型无关
那么构造方法的重载与之同理,区别是构造方法没有返回值。因此所谓的有参构造就是对构造方法增加不同的参数,以区别创建的不同对象。方法重载优点:方法名是相同的可以根据需要来选择应的功能实现。
编写构造方法的注意事项:
1、构造方法的名称必须和类名保持完全一致
2、构造方法不要写返回值,连void都不要写
this关键字的用法
当方法的局部变量和类中成员变量重名的时候,根据“就近原则”优先使用局部变量。
如果该方法中有变量和成员变量冲重名,那么将成员变量加上this做份区分。
public class UseThis {
String name;
public void sayHello(String name){
System.out.println(name+",你好我是"+this.name);
}
public static void main(String[] args) {
String name = "二狗";
UseThis th = new UseThis();
th.name = "狗子";
th.sayHello(name);
}
}
运行结果是:
sayHello方法中的this的地址,和对象th的地址值是相同的。比如,我们将刚才的代码修改一下,将th也当做参数传给sayHello函数,再比较两个地址值 this.name == th.name .根据之前的叙述,毫无疑问,结果应该是true。以下是运行结果。
但是,this是否能够用在static修饰的静态方法中呢?我们可以看一下编译情况。
很明显,标红了。这是为什么呢?
首先我们知道,静态方法只能通过对象来调用非静态方法。因为在运行时先加载的是静态方法,动态方法在没有被调用的情况下是不会进入我们的栈内存中的,所以,当我们在静态方法中直接使用非静态方法时,计算机并不知道我们说的方法是个啥,也不知道他在哪。因此必须要有调用者。
通过上面的例子我们可以看到,this代表的就是对象th,那也就是说其实this也是一个对象。并且this这个变量不包含在我们静态方法的变量池中,我们在静态方法中使用this就相当于在静态方法中使用非静态方法,并且this也不知道他的起始地址是谁,就等于说是方法没有调用者。
this除了可以调用成员变量和成员方法之外,还可以调用构造方法。当调用构造方法时,必须是写在方法体的首行。用thi()调用构造方法的好处的就是,当构造方法需要修改参数时,我们不用动原来的构造方法,直接重载一个就行。把this()写在新的构造方法首行,避免了代码重复,并且不会影响到之前的构造方法的使用,十分简便。举个代码例子:
public class This_Method {
public This_Method(){
System.out.println("这是一个构造方法");
}
public This_Method(int num){
this();
System.out.println("这是第"+num+"个构造方法");
}
public This_Method(int num,String again){
this(2);
System.out.println("这是第"+num+"个构造方法");
}
public static void main(String[] args) {
//This_Method me = new This_Method(2);
This_Method me1 = new This_Method(3,"again");
}
此时只要创建第三个构造方法的对象就可以运行所有构造方法的内容。