Java系列分享
【测开技能】Java语言系列(十五)break和continue
正文
上一片,分享了方法,包括方法的定义,方法的传参,用了set get方法,实现了如何正常添加参数,更新字段。这次接着来分享构造方法。
在初始化实例的时候,经常需要初始化对应的字段。
public static void main(String[] args) {
Food food=new Food();
food.setBirthcity("beijing");
food.setPrice(1);
}
但是如果没有调用set方法,去get的时候,是获取不到数据的。必须先set,然后才能进行get。但是,很多时候,更想在实例的时候,就传递了,而不是示例后去给字段赋值。就用到了构造方法。我们在food初始化的时候,就传递参数。看下代码
public class main {
public static void main(String[] args) {
Food food = new Food("beijing", 1);
System.out.println(food.getBirthcity());
System.out.println(food.getPrice());
}
}
class Food {
private String birthcity;
private float price;
public Food(String birthcity, float price) {
this.birthcity = birthcity;
this.price = price;
}
public String getBirthcity() {
return birthcity;
}
public void setBirthcity(String birthcity) {
this.birthcity = birthcity;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
其实构造方法的名称就是类名。构造方法的参数没有限制,在方法内部,也可以编写任意语句。但是,和普通方法相比,构造方法没有返回值(也没有void),调用构造方法,必须用new操作符。
看下执行结果
其实构造方法的实现还是很简单的。就是定义一个public 名称和类名一样,然后传递参数,在里面给参数初始化,这样在调用get的时候,就可以获取到类初始化传递的字段的值,不用再实例化后调用set才能get,不然不会有想要的数据。
默认构造方法
是不是任何class都有构造方法?是的。在我们定义后,会执行自定义的构造方法。
在创建构造方法的时候,可以创造有参数的,也可以增加带无参数的。
public class main {
public static void main(String[] args) {
Food food = new Food();
Food food1=new Food("beijing", 1);
}
}
class Food {
private String birthcity;
private float price;
public Food(){
}
public Food(String birthcity, float price) {
this.birthcity = birthcity;
this.price = price;
}
public String getBirthcity() {
return birthcity;
}
public void setBirthcity(String birthcity) {
this.birthcity = birthcity;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
public class main {
public static void main(String[] args) {
Food food = new Food();
Food food1=new Food("beijing", 1);
}
}
class Food {
private String birthcity;
private float price;
public Food(){
}
public Food(String birthcity, float price) {
this.birthcity = birthcity;
this.price = price;
}
public String getBirthcity() {
return birthcity;
}
public void setBirthcity(String birthcity) {
this.birthcity = birthcity;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
这样两个的构造方法都在,在实例化的时候,不传递参数也不会有问题的。那么没有传递参数的字段,打印下,看下对应的get方法能获取到数据吗
public class main {
public static void main(String[] args) {
Food food = new Food();
Food food1=new Food("beijing", 1);
System.out.println(food.getBirthcity());
System.out.println(food.getPrice());
System.out.println("---------");
System.out.println(food1.getBirthcity());
System.out.println(food1.getPrice());
}
}
执行下,看下数据
没有在构造方法中初始化字段时,引用类型的字段默认是null,数值类型的字段用默认值,int类型默认值是0,布尔类型默认值是false
在定义方法的时候,也可以去字段定义自行进行初始化,比如
private String birthcity="beijing";
private float price=1;
在定义类字段的时候,就给字段初始化的值,这样,在后续再传递就是传递的新值。看下如下的代码
public class main {
public static void main(String[] args) {
Food food = new Food();
Food food1=new Food("beijing1", 2);
System.out.println(food.getBirthcity());
System.out.println(food.getPrice());
System.out.println("---------");
System.out.println(food1.getBirthcity());
System.out.println(food1.getPrice());
}
}
class Food {
private String birthcity="beijing";
private float price=1;
public Food(){
}
public Food(String birthcity, float price) {
this.birthcity = birthcity;
this.price = price;
}
public String getBirthcity() {
return birthcity;
}
public void setBirthcity(String birthcity) {
this.birthcity = birthcity;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
有了初始化的定义的字段,看下执行结果
在有初始化传递参数的,根据传递的参数展示实例化真正的传递值,如果没有传递对应的参数的值,那么实例化后的对应的字段是默认的初始化的值。
在后续去使用的时候,经常会用到这样的定义方式。比如在实现的时候,初始化值有了,不传递也可以进行调用,在其他地方,根据调用的需要去传递不一样的参数即可。
在之前我们定义了不同的构造参数,其实可以有多个构造方法。比如
class Food {
private String birthcity="beijing";
private float price=1;
public Food(){
}
public Food(String birthcity, float price) {
this.birthcity = birthcity;
this.price = price;
}
public Food( float price) {
this.price = price;
}
public Food(String birthcity) {
this.birthcity = birthcity;
this.price = price;
}
public String getBirthcity() {
return birthcity;
}
public void setBirthcity(String birthcity) {
this.birthcity = birthcity;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
定义了多个的构造方法,但是参数传递不一样,会如何?我们去实现一个方法去看下
public class main {
public static void main(String[] args) {
Food food = new Food();
Food food1=new Food("beijing1", 2);
Food food2=new Food( 2);
Food food3=new Food( "beijing2");
System.out.println(food.getBirthcity());
System.out.println(food.getPrice());
System.out.println("---------");
System.out.println(food1.getBirthcity());
System.out.println(food1.getPrice());
System.out.println("---------");
System.out.println(food2.getBirthcity());
System.out.println(food2.getPrice());
System.out.println("---------");
System.out.println(food3.getBirthcity());
System.out.println(food3.getPrice());
}
}
运行结果
可以看到,不同的构造方法传递不一样的参数,如果在实例化的时候没有传递,就会使用定义的字段默认的初始化的值。初始化的时候,传递不一样的参数,就会根据传递,调用不同的构造方法。 编辑器会给我们有提示的。
根据传递的类型,去匹配不一样的字段。