Java类的构造方法

来自CloudWiki
(重定向自Java的构造方法
跳转至: 导航搜索

思考

  • 在Java中,对象是怎么创造出来的 ?
  • 在这一过程中,构造方法发挥了什么作用 ?

什么是构造方法

除了上文说的普通方法之外,Java类还包括一种特殊的方法,叫做构造方法。

构造方法的作用是创建一个对象并对其完成初始化。

构造,英文名construction ,是建造、创造的意思。每次在创建实例变量,对类中的所有变量都要初始化是很乏味的。如果在一个对象最初被创建时就把对它的设置做好,程序将更简单并且更简明。所有我们引入了构造方法。

具体说来,我们创建一个对象的时候,都要用到new语句,比如Consumer c= new Consumer();这个时候new语句都会调用一个构造方法,完成对象的初始化工作。调用的这个构造方法的名称必须与类同名,比方说,类名叫Consermer,构造方法名也叫Consumer()


public class Consumer {
    String name ;
    int age;
    String job;
    public Consumer(){
    	
    }
   public static void main(String[] args) {
		// TODO Auto-generated method stub
        Consumer c= new Consumer();
   }

}
每个类都有构造方法,没有例外。如果没有显式地为类定义构造方法((像上一节一样)。Java编译器将会为该类提供一个默认构造方法,只是我们看不到罢了:

700px

构造方法的多样性

无参数的构造方法

 /默认的构造方法需要显性的写出来	
 //空构造方法	
   public Noodles(){
		
    }
	
    	

有参数的构造方法

  //带参的构造方法来初始化属性 
   public Noodles(String n) {
		this.name = n;
	}
	public Noodles(String n,float p) {
		this.name = n;
		this.price = p;
	}
	public Noodles(String n,float p,int num) {
		this.name = n;
		this.price = p;
		this.num = num;
	}
	public float getPrice( ){
	    System.out.println("该商品的价格为 : " + price); 
	    return price;
	} 


构造方法的调用

在main方法中添加如下代码:

Noodles n1= new Noodles();//声明一个Noodle类的对象n1
        n1.name="家常手擀面";//给变量赋值
        n1.price = 10;//给变量赋值
        n1.num = 2;//给变量赋值
        System.out.println(n1.toString());//打印变量
        System.out.println("第二份订单:");
        Noodles n2= new Noodles("老北京牛肉面",15.0f,3);
        System.out.println(n2.toString());//打印变量 

构造方法的特点

  • 它的作用是创建对象并初始化成员变量。
  • 构造方法一般都用 public来声明,这样才能在程序任意位置创建对象。
  • 它的名字必须与它所在的类的名字完全相同。
  • 不返回任何数据类型,也不需要使用void声明。
  • 在创建对象时,系统会自动调用类的构造方法。
  • 每个类至少有一个构造方法。如果不写构造方法,Java 将提供一个默认的不带参的方法体为空的构造方法。
  • 构造方法定义格式:
[访问权限] 类名称([参数1,参数2,……]) {
     //程序语句 ;
     //构造方法没有返回值
 }

【经验】

  • 如果类中显性的定义了构造方法,那么系统不再提供默认的不带参的方法体为空的构造方法。若对一个已完成的程序进行扩展,因某种需要而添加了一个类的构造方法,由于很多其他类原先使用默认构造方法,这势必会导致找不到构造方法的错误。解决的方法就是把默认的构造方法显性的写出来。
  • 当构造方法定义完毕后就可以通过创建对象来对属性进行初始化操作。一般情况下需要结合new实例化操作,使用传递实参的形式进行。

案例:商苑面馆

以下程序中使用了两个构造方法,一个有参的、一个无参的。

import java.util.Scanner;

public class Noodles {
	//商品的名称
	public String name;
	//商品的价格
	public float price;
	//商品的数量,
	public int num;
	
	//空构造方法	
	public Noodles(){
		
    }
	public Noodles(String n) {
		this.name = n;
	}
	public Noodles(String n,float p) {
		this.name = n;
		this.price = p;
	}
	public Noodles(String n,float p,int num) {
		this.name = n;
		this.price = p;
		this.num = num;
	}
	public float getPrice( ){
	    System.out.println("该商品的价格为 : " + price); 
	    return price;
	}
	public void setPrice(float p) {
		this.price =p;
	}
	public String toString() {
		String str ="您点的是"+this.name+ 
				    " 价格:"+this.price+
				    " 数量:"+ this.num;
		return str;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	 System.out.println("商院面馆欢迎您!");
	 Scanner sc = new Scanner(System.in);
         System.out.println("请问您需要几碗面?");
         String str = sc.nextLine();
         int num = Integer.parseInt(str);
        
         Noodles n1= new Noodles();//声明一个Noodle类的对象n1
         n1.name="家常手擀面";//给变量赋值
         n1.price = 10;//给变量赋值
         n1.num = 2;//给变量赋值
         System.out.println(n1.toString());//打印变量
         System.out.println("第二份订单:");
         Noodles n2= new Noodles("老北京牛肉面",15.0f,3);
         System.out.println(n2.toString());//打印变量 
        
        
	}

}


Java练习题

1.完成课本P32后面的选择题和填空题

2.为创新题目”顺鸟驿站快递管理平台”定义一个类Delivery(汉语意思:快递),为这个类创建构造方法、成员变量和成员方法,并创建类的对象调用它们。

3.为“倍添利小微金融管理平台”定义一个类Fin_product(汉语意思:理财产品),为这个类创建构造方法、成员变量和成员方法,完成之后创建类的对象调用它们。要求:1.创建类方法getRate(查询收益率)、getTime(查询理财周期)能为方法product_Info(产品介绍)所调用;2.将product_Info(产品介绍)设定为static修饰的静态方法,不通过对象也能调用它。


练习题答案

1.课本第1章习题答案(计1 黄飞 提供):

一、1.B   2.A   3.D
二、1.J2EE   J2ME
    2.java
    3.Java Virtual Machine   Java Runtime Environment
      Java Development Kit
    4.javac  java

2.(根据计2 刘永星 计1 徐洁的代码改编)

public class Delivery {

       String bid; // 快递编号

       String place; // 快递发往地

       String name; // 快递接收人

       long tel; // 接收人电话
       float price;

       public Delivery(){                 

        }
       public Delivery(String bid,String place,String name long tel,float price){                 
             this.bid =bid;
             this.place = place;
             this.name = name;
             this.tel = tel;
             this.price = price;
        }

      public void setPrice( float p){
	      price = p;
	  }
	 
	public float getPrice( ){
	      System.out.println("价格为 : " + price);
	      return price;
	}
	

       public static void main(String[] args) {

              // TODO Auto-generated method stub
              String mybid="001",String myplace="山东济南",String myname="某某" ,long mytel=12345678912l;
              float myprice=12.5f;
              Delivery d1= new Delivery (mybid,myplace,myname,mytel,myprice);

              System.out.println("产品编号:"+d1.bid);

              System.out.println("产品发往地:"+d1.place);

              System.out.println("产品接收人:"+d1.name);

              System.out.println("接收人电话:"+d1.tel);
  
              float p=18f;
	     d1.setPrice(p);
	     float now_price = d1.getPrice();
             d1.getInfo();

          }

 

       }