这篇博客将会解答以下几个问题:
1、普通方法和构造方法的区别
2、构造方法在什么时候会给调用?
3、每个类都有一个默认的无参的构造方法,重新定义构造方法后,原来的无参构造方法会被替代
4、方法重载是什么?它和方法重写的区别?
5、this的用法
一、普通方法和构造方法的对比
格式
普通方法
public+返回值类型+方法名(参数类型 参数名,……){
方法体
}
构造方法
public+方法名(必须与类名同名)(参数类型 参数名,……){
方法体
}
从以上对比我们可以看出,构造方法没有返回值,但普通方法必须要有返回值(void代表空返回值,空返回值也是返回值),且构造方法的方法名必须与类名同名。
用法
构造方法是用来创建类的对象的方法。
比如说我现在创建了一个Student类,并创建了一个新的构造方法,传入学生的名字和分数作为参数。
public class Student{
public String name;
public int score;
public Student(String name,int score){
this.name=name;
this.score=score;
}
}
下面我用Student类创建了一个名叫李华,分数为88的对象。
Student lh=new Student("lihua",88);
等号后面的 new Student(“lihua”,88) 就是在调用构造方法,可以看出,构造方法的作用是创建类的对象,并且可以在创建对象的同时设置对象的初始属性。
而普通方法的作用是在方法体中进行一定的操作和运算,并返回一个返回值。
二、默认的无参构造方法
我们在编写代码的过程中会发现,创建类的时候并不一定要在类中编写构造方法,这是因为每个类都有一个默认的无参的构造方法,但当我们重新定义构造方法后,原来的无参构造方法就会被替代。
比如说在上述的Student类中,我们只写入了一个构造方法Student(String name,int score),那么原来的Student()就被替代了,此时若要创建新的Student对象便不能使用 Student lh=new Student()该语句。
但如果我们想同时保留有参数和没有参数的构造方法,可以使用方法重载,在下面将会讲到。
三、方法重载
想要更好理解方法重载,我们可以与之前学过的方法重写进行对比。
1、方法重写一定发生在子类继承父类时,在子类中编写与父类中同名的方法;方法重载只发生在一个类的内部,与原方法同名但参数类型或参数个数不相同。
2、方法重写后原来的方法被覆盖,子类对象只能调用重写后的方法;方法重载可以用于编写多个构造方法,且可以通过传入不同参数调用不同的方法。
比如在以下这段代码中,就可以使用三种构造方法创建对象。可以使用无参构造方法Student()创建对象,并且不设置初始值;也可以使用Student(String name,String gender)创建对象,并设置对象的姓名和性别初始值;也可以使用Student(String name,int score)创建对象,并设置对象的姓名和分数初始值。
public class Student{
public String name,gender;
public int score;
public Student(){
}
public Student(String name,String gender){
this.name=name;
this.gender=gender;
}
public Student(String name,int score){
this.name=name;
this.score=score;
}
}
四、this的用法
在上述举例的代码中,我们多次使用了this,this代表本类对象,或者说指向当前调用的对象。比如说我用Student lh=new Student()创建了一个对象lh,那在这里this代表的就是lh这个对象;如果创建的是其他对象,那this就代表创建的其他对象。
这里使用this是为了区分变量和参数。
this.变量名=参数名;
变量是在类中创建的变量,参数是通过构造方法传入的参数。
五、构造方法应用实例
创建Shape类用于保存画板中的图形
public class Shape {
public int xa,ya,xb,yb;
public String name;
public Color c;
//保存图形的左上角坐标xa,ya和右下角坐标xb,yb,以及图形的名字、图形的颜色
public Shape(int xa,int ya,int xb,int yb,String name,Color c){
this.xa=xa;
this.ya=ya;
this.xb=xb;
this.yb=yb;
this.name=name;
this.c=c;
}
创建shape类是为了收集界面中的图形,然后重写JFrame的paint方法,使得每次重绘窗口的时候再重绘这些图形,从而达到保留笔迹的效果。具体实现方法将在下一篇博客讲到。