商苑面馆 :Java知识串讲

来自CloudWiki
Cloud17讨论 | 贡献2019年4月16日 (二) 10:53的版本 继承
跳转至: 导航搜索

任务二 JAVA程序开发基础

2.1变量和表达式

  • Java控制台输入:
import java.util.Scanner; 
 
public class Test {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 从键盘接收数据
 
        // next方式接收字符串
        System.out.println("next方式接收:");
               
        String str1 = scan.next();
        String str2 = "刀削面";
        if(str1.equals(str2)){
        	System.out.println("您选择的是:" + str1);     
        }
           
        scan.close();
    }
}

2.2智能决策:选择结构

三目运算符

package demo1;
import java.util.Scanner;
public class happy08 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//int a = 10 ;int b = 20;
		//System.out.println(a==b);
		Scanner sc = new Scanner(System.in);
		System.out.println("客官,您是堂吃还是外卖?1.堂吃; 2.外卖");
		String s = sc.next();
		String s2 = (s.equals("1")) ? "堂吃一位" : "外送一位";
		System.out.println(s2);

	}

}

if条件语句

第一种形式:

public class Hello123 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// TODO Auto-generated method stub
		float mian = 10.0f;//面的价格
		float suan = 2.0f;//酸梅汤
		float total_pay =0f;//总钱数
		Scanner sc = new Scanner(System.in);
		//问用户要几碗面?
		System.out.println("请问您要几碗面?");
		int num = sc.nextInt();
		total_pay = num * mian;
		        
		 //问顾客需不需要饮料(饮料2元一杯)
		
		 System.out.println("请问您是否需要饮料?Y/n");
		 String s = sc.next( );
		 if( s.equals("y")){
			 total_pay = total_pay + num * suan;
		 }
		 
		 System.out.printf("您一共消费了%f元",total_pay);
		 sc.close();
	}

}

第2种形式:

package demo1;
import java.util.Scanner;
public class Tangchi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("客官,请问您是堂吃还是外送?"
        		+"1.堂吃/2.外送");
        String s = sc.next();
        if(s.equals("1")){
        	System.out.println("堂吃一位!");
        }else{
        	System.out.println("外送一位!");
        }
	}

}

第3种形式:

package demo1;
import java.util.Scanner;
public class MianType {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("客官,您几位?");
        int num = sc.nextInt();
        System.out.println("请问你们吃什么面?");
        System.out.println("a.老北京炸酱面;b.刀削面"
        		          +"c.油泼面");
        String s = sc.next();
        if(s.equals("a")){
        	System.out.printf("老北京炸酱面%d碗",num);
        }else if(s.equals("b")){
        	System.out.printf("刀削面%d碗",num);
        }else if(s.equals("c")){
        	System.out.printf("油泼面%d碗",num);
        }else{
        	System.out.println("不好意思,您需求的面我们这里没有");
        
        }
	}

}


if语句的嵌套

询问顾客吃什么面,并询问其是否加蛋、加油渣 ?将结果反馈给后台。

if语句的多条件

import java.util.Scanner;
public class happy09 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        float price ;boolean fenqi;boolean firstpay;
        System.out.println("老板,请问手机多少钱?");
        Scanner sc = new Scanner(System.in);
        price = sc.nextFloat();
        System.out.println("老板,请问支不支持分期?");
        fenqi = sc.nextBoolean();
        System.out.println("老板,请问支不支持零首付?");
        firstpay = sc.nextBoolean();
        
        if(price <=1000 && fenqi == true && firstpay == true) {
        	System.out.println("小Case!");
        }else {
        	System.out.println("太贵了,买不起~");
        }
	}

}

switch语句

package test;
import java.util.Scanner;
public class a7 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner sc = new Scanner (System.in);
		while (true){
		System.out.println("客观,请问您需要什么面:");
		System.out.print("1.刀削面\n2.蛋黄面\n3.玉米面\n4.牛筋面\n5.幸福小丸仔面\n");
		int m = sc.nextInt();
		switch (m){
		case 1:
			System.out.println("您选择的是刀削面");
			break;
		case 2:
			System.out.println("您选择的是蛋黄面");
			break;
		case 3:
			System.out.println("您选择的是玉米面");
			break;
		case 4:
			System.out.println("您选择的是牛筋面");
			break;
		case 5:
			System.out.println("您选择的是幸福小丸仔面");
			break;
		default:
			System.out.println("对不起 输入错误");
			break;
		}
		}

	}

}

2.3重复迭代:循环结构

while循环

package test;
import java.util.Scanner;
public class a7 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner sc = new Scanner (System.in);
		while (true){
		  System.out.println("客观,请问您需要什么面:");
		  System.out.print("1.刀削面\n2.蛋黄面\n3.玉米面\n4.牛筋面\n5.幸福小丸仔面\n");
		  int m = sc.nextInt();
		  switch (m){
		     case 1:
			System.out.println("您选择的是刀削面");
			break;
		     case 2:
			System.out.println("您选择的是蛋黄面");
			break;
		     case 3:
			System.out.println("您选择的是玉米面");
			break;
		     case 4:
			System.out.println("您选择的是牛筋面");
			break;
		     case 5:
			System.out.println("您选择的是幸福小丸仔面");
			break;
		     default:
			System.out.println("对不起 输入错误");
			break;
		 }
		}

	}

}

for循环

public class test02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        //String a ="hello";
		String [] menu = {"阳春面","油泼面","鸡汤面","火鸡面","安徽板面"};
		for(int i=0;i <5;i++){
			System.out.println(menu[i]);
		}
		
	}

}

循环的嵌套

public class test03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String [] menu = {"阳春面","油泼面","鸡汤面","火鸡面","安徽板面"};
		String [] drink = {"可乐","啤酒","雪碧"};
		for(int i=0;i<5;i++){
			for(int j=0;j<3;j++){
				System.out.println(menu[i]+"+"+drink[j]);
			}
		}
	}

}

2.4 数据的存储--数组

Java一维数组

  • 面馆老板现在需要重新定义一份菜单,使用一维数组,他有几种方法呢 ?
public class HelloWorld {
    public static void main(String []args) {
       //System.out.println("Hello World!");
	   String menu = new String[5];
	   menu[0] = "炸酱面";
	   menu[1] = "刀削面";
	   menu[2] = "安徽板面";
	   menu[3] = "葱油拌面";
	   menu[4] = "兰州拉面";
	   
	   
	  
    }
}

Java二维数组

  • 面馆老板现在需要根据周一到周五,每天推出三款特价面,利用二维数组,他该怎么做呢 ?

public class erweishuzu {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//double [][] priec = new double [4] [3];
		String [][] price = {{"炸酱面","方便面","版面"},{"刀削面","拉面","炒面"},{"牛肉面","鸡汤面","红烧面"},{"炒面","拉面","刀削面"},{"牛肉面","红烧面","鸡汤面"}};
		
		for(int i=0;i<5;i++) {
			System.out.println("周"+(i+1));
			for(int j = 0;j<3;j++) {
				System.out.println(price[i][j]);
			}	
		}
	}

}

Javva for语句循环遍历数组

  • 面馆老板用foreach语句遍历打印每一种面。

任务三 JAVA面向对象程序编程(一)

3.1类和对象

类和对象

类表示一个有共同性质的对象群体,而对象指的是具体的实实在在的物体。

类与对象的关系就如模具和铸件的关系,类是创建对象的模具,而对象则是由类这个模板制作出来的铸件

  • 举例来说,面馆按产品分类,可以分为几类?
 面类,饮料类,小吃类
  • 每一类有什么具体的产品(对象)?
 面类的对象: 火鸡面,炸酱面,刀削面,油泼面
 饮料类对象: 可乐,雪碧,芬达,啤酒,江小白
 小吃类对象: 炸串,卤蛋,麻辣烫,辣白菜

类的成员变量和成员方法

类一般由三部分组成:成员变量,成员方法和构造方法。

  • 类的成员变量是用来描述属性信息的,因此大部分成员变量是以名词的形式出现
  • 类的方法又被称为成员方法(函数),用来描述动作、行为和功能,是一段完成某种功能或操作的代码段
  • 构造方法的作用是创建一个对象并对其完成初始化。

以面馆的面类产品为例:

面类:

  名称;
  类别:(干面,汤面,炒面)
  价格;
  份量;
  口味;
  数量

  预定订单;
  取消订单;
  查看订单;
  修改订单;
  投诉店家;
 
  • 面馆老板建立Noodle类,为它设计成员变量和成员方法
package 小马哥面馆;

public class Noodle {
	//成员变量
	//名称
	public String name;
	//价格
	public double price;
	//数量
	public int num;
	
	/*构造方法*/
	public Noodle(){
		
	}
	public Noodle(String name,double price,int num){
		this.name = name;
		this.price = price;
		this.num = num;
	}
	//成员方法
	//预定订单;
	public void buy(String name,int num){
		this.name =name;
		this.num = num;
		
	}
	//取消订单;
	public void cancel(String name,int n){
		this.name =name;
		this.num = this.num -n;
	}
	//查看订单;
	public String  lookup( ){
		String s ="您订购的面是:\r\n"; 
		s     = "品名:"+ this.name 
				+" 价格:"+ this.price
				+" 数量: "+ this.num;
		return s;
	}   

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Noodle n1= new Noodle();
        n1.name="手擀面";
        n1.price = 10;
        n1.num = 2;
        System.out.println("您订的面是"+n1.name);
        System.out.println("价格:"+n1.price);
        System.out.println("数量"+ n1.num);
        
        Noodle n2 = new Noodle("炸酱面",12,3);
        System.out.println("您订的面是"+n2.name);
        System.out.println("价格:"+n2.price);
        System.out.println("数量"+ n2.num);
        
        Noodle n3 = new Noodle();
        n3.buy("油泼面",2);
        n3.cancel("油泼面",1);
        String s2 =n3.lookup();
        System.out.println(s2);
        
	}

}

练习:怎样设计小吃类和饮料类 ?

3.2 成员变量的完善

封装只是为了对类中的属性更好进行控制,因此要实现封装需要属性私有化,这样可以保证属性不会被其他类改动。然后使用公有方法把私有的属性暴露出去,

所以说封装分为三步:用private修饰变量,建立读方法、建立写方法

例:为刚才的面类成员变量进行封装:(

package happy0319;

public class Noodle {
	//成员变量
	//名称
	private String name;
	//价格
	private double price;
	//数量
	private int num;
	
	/*构造方法*/
	public Noodle(){
		
	}
	public Noodle(String name,double price,int num){
		this.name = name;
		this.price = price;
		this.num = num;
	}
	//成员方法
	public String getName(){
		return this.name;
	}
	public double getPrice(){
		return this.price;
	}
	public int getNum(){
		return this.num;
	}
	//写方法
	public boolean setName(String s){
		this.name = s;
		return true;
	}
    public boolean setPrice(double p){
    	this.price = p;
    	return true;
    }
    public boolean setNum(int n){
    	this.num = n;
    	return true;
    }
   
    public String toString(){
       	return "名称:" +this.name+"价格:"+
               this.price + "数量: " + this.num;
    }

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		        
        Noodle n2 = new Noodle("炸酱面",12,3);
        System.out.println("您订的面是"+n2.getName());
        System.out.println("价格:"+n2.getPrice());
        System.out.println("数量"+ n2.getNum());
        
        n2.setName("老北京炸酱面");
        n2.setPrice(15);
        n2.setNum(2);
        
        System.out.println("订单变更:");
        System.out.println("您订的面是"+n2.getName());
        System.out.println("价格:"+n2.getPrice());
        System.out.println("数量"+ n2.getNum());
        
	}

}

任务四 对象数组

对象数组

在我们学了类和对象之后,其实对象也可以创建数组,我们将它称作对象数组。

声明和创建对象数组的语法与基本类型值数组创建语法相同,例如:

Book[] books=new Book[5];

下面我们在测试类的main方法中建立了一个Noodle类的对象数组,并将其初始化。:

package test2;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Noodle [] nl = new Noodle[3];
        nl[0] = new Noodle("炸酱面",12.0,3);
        nl[1] = new Noodle("臊子面",14.0,2);
        nl[2] = new Noodle("刀削面",10.0,5);
        
        for(int i=0;i<3;i++){
        	if(nl[i].getName().equals("臊子面")){
        		System.out.println(nl[i].toString());
        	}
        	
        }
	}

}

现在,我们新建立一个新类FoodSet,表示食物仓库:在它里面可以建立一个Noodle类的对象数组


public class FoodSet {
    private Noodle[] n;//食物数组
    private int num;//数组的个数
    
    public FoodSet(Noodle[] n,int num ){
    	this.n = n;
    	this.num = num;
    }
    public String toString(){
    	String s="";
    	for(int i=0;i<num;i++){
    		s += n[i].toString()+"\r\n";
    	}
    	return s;
    }
    public static void main(String[] args) {
		// TODO Auto-generated method stub
	Noodle [] nl = new Noodle[3];
        nl[0] = new Noodle("炸酱面",12.0,3);
        nl[1] = new Noodle("臊子面",14.0,2);
        nl[2] = new Noodle("刀削面",10.0,5);
        FoodSet  f = new FoodSet(nl,3);
        System.out.println(f.toString());
	}

}

思考题:如何为FoodSet类建立查询方法 ?根据面名去查询特定产品的价格和数量。

字符串

package happy0319;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        String s1 = "意大利空心面";
        String s2 = new String("老北京炸酱面");
        
        //获取字符串的长度
        System.out.println(s1.length());
        //比较字符串是否相等
        if(s1.equals(s2)) {
        	System.out.println("这两个字符串相等");
        }
        //获取指定位置的字符
        System.out.println(s1.charAt(3));
        
        //获取字符第一次出现的位置
        System.out.println(s2.indexOf("炸酱面"));
        //获取字符串的某个子串
        System.out.println(s2.substring(2,4));
        //拆分字符串
        String s3="主食 炸酱面";
        String [ ] data = new String[2];
        data = s3.split(" ");
        System.out.println(data[0]);
        
        String s6 = s2.replace("老北京","老济南");
        System.out.println(s2+"一碗!");
        System.out.println(s6+"一碗!");
        
        
	}

}

任务五 JAVA面向对象编程(二)

方法重载

在这一个类FoodSet中,我们重载了两个方法:search(String s)和search(double price),分别实现按名称搜和按价格搜。

public class FoodSet {
    private Noodle[] n;//食物数组
    private int num;//数组的个数
    
    public FoodSet(Noodle[] n,int num ){
    	this.n = n;
    	this.num = num;
    }
    //按名称搜
    public Noodle search(String s){
    	for(int i=0;i<this.n.length;i++){
    		if(n[i].getName().equals(s)){
    			return n[i];
    		}
    	}
    	return null;
    	//return new Noodle();
    }
    
    //按价格搜
    public Noodle search(double price){
    	
    	for(int i=0;i<this.n.length;i++){
    		if(n[i].getPrice() <price){
    			return n[i];
    		}
    	}
    	return null;
    	//return new Noodle();
    }
    public String toString(){
    	String s="";
    	for(int i=0;i<num;i++){
    		s += n[i].toString()+"\r\n";
    	}
    	return s;
    }
   
    public static void main(String[] args) {
		// TODO Auto-generated method stub
	    Noodle [] nl = new Noodle[3];
        nl[0] = new Noodle("炸酱面",12.0,3);
        nl[1] = new Noodle("臊子面",14.0,2);
        nl[2] = new Noodle("刀削面",10.0,5);
        FoodSet  f = new FoodSet(nl,3);
        System.out.println(f.toString());
        
        //按名称搜索
        Noodle n01 = f.search("刀削面");
        if(n01 != null) {
           System.out.println("叫刀削面的餐品为:"+n01.toString());
	    }else {
	    	System.out.println("对不起,我们店现在没有这种面");
	    }
        
        //按价格搜索
        Noodle n02 = f.search(12);
        if(n02 != null) {
           System.out.println("价格低于12的面为:"+n02.toString());
	    }else {
	    	System.out.println("对不起,我们店现在没有这种面");
	    }
    }

}

继承

Food类:

public class Food {
	//成员变量
	//名称
	private String name;
	//价格
	private double price;
	//数量
	private int num;
	
	/*构造方法*/
	public Food(){
		
	}
	public Food(String name,double price,int num){
		this.name = name;
		this.price = price;
		this.num = num;
	}
	
	//成员方法
	public String getName(){
		return this.name;
	}
	public double getPrice(){
		return this.price;
	}
	public int getNum(){
		return this.num;
	}
	//写方法
	public boolean setName(String s){
		this.name = s;
		return true;
	}
	public boolean setPrice(double p){
	    this.price = p;
	    return true;
	}
	public boolean setNum(int n){
	    this.num = n;
	    return true;
	}
	   
	public String toString(){
	    return "名称:" +this.name+"价格:"+
	               this.price + "数量: " + this.num;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}


面条类:

public class Noodle extends Food {
	
	/*构造方法*/
	public Noodle(){
		
	}
	public Noodle(String name,double price,int num){
		super(name,price,num);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		        
        Noodle n2 = new Noodle("炸酱面",12,3);
        System.out.println("您订的面是"+n2.getName());
        System.out.println("价格:"+n2.getPrice());
        System.out.println("数量"+ n2.getNum());
        
        n2.setName("老北京炸酱面");
        n2.setPrice(15);
        n2.setNum(2);
        
        System.out.println("订单变更:");
        System.out.println("您订的面是"+n2.getName());
        System.out.println("价格:"+n2.getPrice());
        System.out.println("数量"+ n2.getNum());
        
	}

}



小吃类:


public class SmallEat extends Food{

    private String flavor;
    SmallEat(){
    	
    }
    SmallEat(String name,double price,int num){
    	super(name,price,num);
    }
public String toString(){
	    return "名称:" + getName()+"价格:"+
	               getPrice() + "数量: " + getNum() + "口味:"+ flavor;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        SmallEat s = new SmallEat("鹌鹑蛋",3,2);
        System.out.println(s.toString());
	}

}


多态

Food类:

public String toString(){
	    return "名称:" +this.name+"价格:"+
	               this.price + "数量: " + this.num;
	}


Drink类:

    public String toString(){
	    return "名称:" + getName()+"价格:"+
	               getPrice() + "数量: " + getNum() + "容量:"+volume;
	}

SmallEat类:

    public String toString(){
	    return "名称:" + getName()+"价格:"+
	               getPrice() + "数量: " + getNum() + "口味:"+floavor;
	}

在Food类的main方法里调用:

 Food [] f = new Food[3];
		f[0] =  new Noodle("炸酱面",12,3);
		f[1] =  new Drink("酸梅汤",3,2);
		f[2] = new SmallEat("鹌鹑蛋",3,2);
		
		System.out.println(f[0].toString());
		System.out.println(f[1].toString());
		System.out.println(f[2].toString());