Java任务:经营范围拓展

来自CloudWiki
跳转至: 导航搜索

任务描述:经营范围拓展

原来面馆的业务一直是面品堂食销售,现在要扩大经营范围,商品不仅仅是面条,还有其他商品,比如黄焖鸡米饭等米饭食品。所有商品都有一些共同的特性,如名称、价格、数量等。本次任务是编写商品类,然后继承商品类编写米饭类,实现商品类代码的重用。

任务实现

定义公共父类--商品类

注:此题有两种解法:一是可以将原先的商品类(如面条类)作为父类,然后衍生出两个子类,如 男装、女装,二是可以重新定义一个父类商品类Goods ,原先的面条类和新增的米饭类作为它的子类。这两种方法都可以,根据你网站自身的经营范围。

可以把一些通用的变量和方法放到父类中,实现代码的重复使用。

注意,父类的成员变量要想被子类访问,前面的修饰符需由private变为protected.

package entity;

public class Goods {
	protected  String name;//名称
	protected  float price;//价格
	protected  int num;//数量
	
	public Goods() {
		
	}
	public Goods(String n,float p,int num) {
		this.name = n;
		this.price = p;
		this.num = num;
	}
	public float getPrice( ){//价格的读方法
	    return this.price;
	}
	
	public void setPrice(float p) {//价格的写方法
		if(p<=0) {
			System.out.println("价格必须为正!");
		}else {
		    this.price =p;
		}
	}
	public int getNum() {//num的读方法
	    return this.num; 
	}
	public void setNum(int num) {
		if(num<0) {
			System.out.println("数量不能为负!");
		}else {
			this.num=num;
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}



定义新的子类

类名后面声明extends关键字

由于很多变量和方法,可以直接继承自父类,因此子类代码大幅度减少。

package entity;

public class Rice extends Goods{
        //父类的成员变量,子类都可以使
        //isBig是子类独有的变量
	private boolean isBig;//是大份还是小份
        
        //父类的成员方法,子类都可以使
        //showWeight是子类独有的方法
        public void showWeight() {
		if(isBig==true) {
			System.out.println("该份是小份米饭");
		}
	} 
	
	

}


编写子类构造方法

编写子类构造方法,

在构造方法中,可以用super关键字,直接调用父类的构造方法

       public Rice(){
    	super("黄焖鸡米饭",15,1);//调用父类构造方法Goods(String n,float p,int num)
		this.isBig=false;
      }
	
	public Rice(String n,float p,int num,boolean isBig) {
		super(n,p,num);//调用父类构造方法Goods(String n,float p,int num)
		this.isBig=isBig;
	}

创建子类对象,进行验证

由于引入了继承,因此子类对象既可以调用本类的变量和方法,也可以直接调用父类的成员变量和方法,

达到了代码复用的效果。

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Rice r2= new Rice("黄焖鸡米饭",20.0f,3,true);
		System.out.print("餐品的名称为:");
		System.out.println(r2.name);//调用父类成员变量
		System.out.print("餐品的数量为:");
		System.out.println(r2.getNum());//调用父类成员方法
		System.out.print("餐品是否为大份:");
		System.out.println(r2.isBig);//调用本类成员方法
		r2.showWeight();//调用本类成员方法
		System.out.println(r2.toString());//调用toString方法   
	}

完整代码

父类:Goods

package entity;

public class Goods {
	protected  String name;//名称
	protected  float price;//价格
	protected  int num;//数量
	
	public Goods() {
		
	}
	public Goods(String n,float p,int num) {
		this.name = n;
		this.price = p;
		this.num = num;
	}
	public float getPrice( ){//价格的读方法
	    return this.price;
	}
	
	public void setPrice(float p) {//价格的写方法
		if(p<=0) {
			System.out.println("价格必须为正!");
		}else {
		    this.price =p;
		}
	}
	public int getNum() {//num的读方法
	    return this.num; 
	}
	public void setNum(int num) {
		if(num<0) {
			System.out.println("数量不能为负!");
		}else {
			this.num=num;
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
 

子类:Rice

package entity;

public class Rice extends Goods{

	private boolean isBig;//是大份还是小份
	
	public void showWeight() {
		if(isBig==true) {
			System.out.println("该份是小份米饭");
		}
	}
    public Rice(){
    	super("黄焖鸡米饭",15,1);
		this.isBig=false;
    }
	
	public Rice(String n,float p,int num,boolean isBig) {
		super(n,p,num);
		this.isBig=isBig;
	}
	
	public String toString() {
		String s="";
		s= "名称:"+this.name+"; 价格:"+this.price 
		  +"; 数量:"+this.num+";大/小份:"+this.isBig;
		return s;
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Rice r2= new Rice("黄焖鸡米饭",20.0f,3,true);
		System.out.print("餐品的名称为:");
		System.out.println(r2.name);//调用父类成员变量
		System.out.print("餐品的数量为:");
		System.out.println(r2.getNum());//调用父类成员方法
		System.out.print("餐品是否为大份:");
		System.out.println(r2.isBig);//调用本类成员方法
		r2.showWeight();//调用本类成员方法
		System.out.println(r2.toString());//调用toString方法   
	}

}

子类:Noodles

package entity;

public class Noodles extends Goods{
    String flavor;
    
	//空构造方法	
	public Noodles(){
		
    }
	
	public Noodles(String n,float p,int num) {
		super(n,p,num);//调用父类的构造方法
		this.flavor ="不辣";
	}
	public Noodles(String n,float p,int num,String f) {
		super(n,p,num);//调用父类的构造方法
		this.flavor= f;
	}
	public String getFlavor() {
		return this.flavor;
	}
	public void setFlavor(String f) {
		this.flavor =f;
	}
	public String toString() {//重写父类的方法

		String str ="名称:"+this.name+ 
				    " 价格:"+this.price+
				    " 数量:"+ this.num +
				    " 口味:"+this.flavor;
		return str;
	}
	
	public static void main(String[] args) {                
		        System.out.println("第一份商品:");
                Noodles n1= new Noodles();//声明一个Noodle类的对象n1
                n1.setName("炸酱面"); //调用父类方法
                n1.setPrice(10);//调用父类方法
                n1.setNum(2);//调用父类方法
                n1.setFlavor("不辣");//调用本类方法
                
                System.out.println(n1.toString());//调用重写了的父类方法                              
                System.out.println();
                
                System.out.println("第二份商品:");
                Noodles n2= new Noodles("刀削面",15.0f,3,"微辣");
                System.out.println(n2.toString());////调用重写了的父类方法 
        
        
	}

}