一、什么是面向对象编程
- 面向就是拿或找的意思
- 对象就是东西的意思
- 面向对象编程就是拿或找东西过来编程
二、设计类和对象、定义类注意事项
1、如何定义类
public class 类名{
1、成员变量(代表属性,一般是名词)
2、成员方法(代表行为,一般是动词)
3、构造器
4、代码块
5、内部类
}
2、如何得到类的对象
类名 对象名 = new 类名();
Car c = new Car();
3、如何使用对象
- 访问属性:对象名.成员变量
- 访问行为:对象名.方法名()
4、自己设计对象并使用
1)Car.java
public class Car { //属性(成员变量) String name; double price; //行为(方法) public void start(){ System.out.println(name+",价格是:"+price+"启动了"); } public void run(){ System.out.println(name+",价格是:"+price+"启动了"); }
2)Test.java
public class Test { public static void main(String[] args) { //类名 对象名 = new 类名(); Car c = new Car(); c.name = "奔驰"; c.price = 39; System.out.println(c.name); System.out.println(c.price);
c.start();
c.run(); }
5、定义类的注意事项
- 成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值; 一般无需指定初始化值,存在默认值
- 类名首字母建议大写,且有意义,满足“驼峰模式”
- 一个java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名
- 实际开发中建议还是一个文件定义一个class类
三、购物车案例
1、Goods.java
package com.hello.object; public class Goods { int id; // 编号 String name; // 名称 Double price; // 价格 int buyNumber; // 购买数量 }
2、ShopCarTest.java
package com.hello.object; /* 目标:面向编程训练,购物车模块模拟 */ import java.util.Scanner; public class ShopCarTest { public static void main(String[] args) { //1、定义商品类,用于后期创建商品对象 //2、定义购物车对象,使用一个数组对象表示。(严格来说不应该使用数组的,因为不确定长度) //现在数组要装商品对象,类本身也是类型 Goods[] shopCar = new Goods[100]; //3、搭建操作架构 while (true) { System.out.println("请您选择如下命令进行操作:"); System.out.println("添加商品到购物车:add"); System.out.println("查询商品到购物车:query"); System.out.println("修改商品购买数量:update"); System.out.println("结算购买商品的金额:pay"); Scanner sc = new Scanner(System.in); String command = sc.next(); switch (command){ case "add": //添加商品到购物车 addGoods(shopCar,sc); break; case "query": //查询商品到购物车 queryGoods(shopCar); break; case "update": //修改商品购买数量 updateGoods(shopCar,sc); break; case "pay": //结算购买商品的金额 pay(shopCar); break; default: System.out.println("没有该功能!"); } } } public static void pay(Goods[] shopCar) { queryGoods(shopCar); //1、定义一个求和变量累加金额 double money = 0; //2、遍历购物车数组中的全部商品对象,累加单价*数量 for (int i = 0; i < shopCar.length; i++) { Goods g = shopCar[i]; if(g != null){ money+=(g.price* g.buyNumber); }else { break; } } System.out.println("订单总金额:"+money); } public static void updateGoods(Goods[] shopCar,Scanner scanner) { //让用户输入要修改商品的id,根据id要修改的商品对象 while (true) { System.out.println("请您输入要修改的商品id:"); int id = scanner.nextInt(); Goods g = getGoodsById(shopCar,id); if(g == null){ //没有该商品 System.out.println("对不起,没有购买该商品"); }else { //说明存在该商品对象,可以修改它了 System.out.println("请您输入:"+g.name+"商品最新购买数量:"); int buyNumber = scanner.nextInt(); g.buyNumber = buyNumber; System.out.println("修改完成 "); queryGoods(shopCar); break; } } } public static Goods getGoodsById(Goods[] shopCar, int id){ for (int i = 0; i < shopCar.length; i++) { Goods g = shopCar[i]; if(g != null){ //判断这个商品对象的id是否是我们要找的 if(g.id==id){ return g; } } else { return null;//找完了全面存在的商品,都没有找到 } } return null;//代表找完了100个商品都没有找到id一样的商品 } /** 查询购物车中的商品对象信息,并展示出来 */ public static void queryGoods(Goods[] shopCar) { System.out.println("========查询购物车信息如下============"); System.out.println("编号\t\t名称\t\t\t价格\t\t\t购买数量"); //shopCar = [g1,g2,g3] for (int i = 0; i < shopCar.length; i++) { Goods g = shopCar[i]; if(g != null){ //展示这个商品对象 System.out.println(g.id+"\t\t"+g.name+"\t\t\t"+g.price+"\t\t\t"+g.buyNumber); }else { //遍历结束 break; } } } /** 完成商品添加到购物车的功能 */ //main方法已经new了一个扫描器对象了,在它调用addGoods方法时可以把对象当作参数传进入,此时addGoods方法需要用一个形参scanner接收 public static void addGoods(Goods[] shopCar,Scanner scanner) { //1、录入用户输入的购买商品的信息 System.out.println("请您输入购买商品的编号(不重复)"); int id = scanner.nextInt(); System.out.println("请您输入购买商品的名称:"); String name = scanner.next(); System.out.println("请您输入购买商品的数量:"); int buyNumber = scanner.nextInt(); System.out.println("请您输入购买商品的价格:"); double price = scanner.nextDouble(); //2、把这个购买商品的信息封装成一个商品对象 Goods g = new Goods(); g.id = id; g.name = name; g.buyNumber = buyNumber; g.price = price; //3、把这个商品对象添加到购物车数组中去 //shopCar = [null,null,null] for (int i = 0; i < shopCar.length; i++) { if(shopCar[i]==null){ //说明此位置没有元素存入,把我们新买的商品添加到此处即可 shopCar[i] = g; break;//结束,因为商品已经成功存入了,不需要继续找位置了 } } System.out.println("您的商品:"+ g + "已经添加到购物车"); } }
四、面向对象语法:构造器、this
1、构造器
1)Car.java
package com.hello.constructor; public class Car { String name; double price; //无参数构造器 public Car(){ System.out.println("无参数构造器被触发执行"); } //有参数构造器 public Car(String n,double p){ System.out.println("有参数构造器被触发执行"); name = n; price = p; } }
2)Test.java
package com.hello.constructor; /** * 目标:说出对象是通过构造器初始化出来的,并理解构造器的分类和区别 * 一、构造器的作用:用于初始化一个类的对象,并返回对象的地址 Car c = new Car(); * 二、构造器的定义格式 修饰符 类名(形参列表){} * 三、构造器的分类: * 1、无参数构造器(默认存在的):初始化的对象时,成员变量的数据均采用默认值 * 2、有参数构造器:在初始化对象的时候,同时可以为对象进行赋值 * 四、注意事项: * 1、任何类定义出来,默认就自带了无参数构造器,写不写都有 * 2、一旦定义了有参数构造器,无参数构造器就没有了,此时就需要自己写一个无参数构造器了 */ public class Test { public static void main(String[] args) { Car c = new Car();//调用无参数构造器 Car c2 = new Car("宝马",80);//调用有参数构造器 } }
2、this关键字
1)Car.java
package com.hello.constructor; public class Car { String name; double price; //this出现在有参数构造器中的用法 public Car(String name,double price){ System.out.println("有参数构造器被触发执行"); /**当局部变量跟成员变量的名称一样时,以下赋值是赋给局部变量 name = name; price = price; 比如调用 Car c = new Car("奔驰",45) c.name; //该值为空,因为调的是成员变量的名称,而上面的赋值是赋给了局部变量 */ this.name = name; this.price = price; } //this出现在成员方法中的用法 public void goWith(String name){ //this.name取的是成员变量的值,name取的是局部变量的值 System.out.println(this.name + "正在和" + name + "一起比赛"); } }
2)Test.java
package com.hello.constructor; /** * 目标:this关键字 * 一、作用:出现在成员方法、构造器中代表当前对象的地址,用于访问当前对象的成员变量、成员方法 * 二、掌握this出现在有参数构造器中的用法 和 this出现在成员方法中的用法 */ public class Test { public static void main(String[] args) { //调用有参数构造器,给成员变量赋值 Car c = new Car("宝马",80); //调用成员方法,给成员方法的局部变量赋值 //最终的输出结果是:宝马和奔驰一起比赛 c.goWith("奔驰"); } }
五、三大特征之一:封装、Javabean
package com.hello.javabean; public class Student { /* 面向对象的三大特征:封装、继承、多态 一、封装:隐藏实现细节,暴露出合适的访问方式(合理隐藏、合理暴露) 二、封装的实现步骤 1、一般对成员变量使用private(私有)关键字修饰进行隐藏,private修饰后该成员变量就只能在当前类中访问 2、提供public修饰的公开的getter、setter方法暴露其取值和赋值 三、封装的好处 1、加强了程序代码的安全性 2、适当的封装可以提升开发效率,同时可以让程序更容易理解与维护 */ /* 以下是把age做了封装 */ /* private int age; //取值的方法:getAge public int getAge(){ return age; } //赋值的方法:setAge public void setAge(int age){ if(age>=0&&age<=200){ this.age = age; }else { System.out.println("年龄非法"); } } */ /*目标:理解JavaBean,并学习其定义规范 一、JavaBean:可以理解成实体类,其对象可以用于在程序中封装数据 实体类:在现实世界中能够找到实际的个体,比如老师、学生(创建学生对象可以封装学生数据,创建汽车对象可以封装汽车数据) 二、标准JavaBean须满足以下要求: 1、成员变量使用private修饰 2、提供每一个成员变量对应的setXxx() / getXxx() 3、必须提供一个无参构造器 */ //1、成员变量私有 private String name; private double height; private double salary; //3、必须有无参数构造器(默认的) public Student() { } //4、有参数构造器(不是必须的,可以选择) public Student(String name, double height, double salary) { this.name = name; this.height = height; this.salary = salary; } //2、必须提供成套的getter 和 setter方法暴露成员变量的取值和赋值 public String getName() { return name; } public void setName(String name) { this.name = name; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }
六、JavaBean改造购物车
1、Goods.java
package com.tech.testcase; public class Goods { private int id;//编号 private String name;//名称 private double price;//价格 private int buyNumber;//购买数量 public Goods() { } public Goods(int id, String name, double price, int buyNumber) { this.id = id; this.name = name; this.price = price; this.buyNumber = buyNumber; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getBuyNumber() { return buyNumber; } public void setBuyNumber(int buyNumber) { this.buyNumber = buyNumber; } }
2、ShopCarTest.java
package com.tech.testcase; import java.util.Scanner; /* 目标:面向编程训练,购物车模块模拟——javabean改造购物车案例 */ public class ShopCarTest { public static void main(String[] args) { //1、定义商品类,用于后期创建商品对象 //2、定义购物车对象,使用一个数组对象表示。(严格来说不应该使用数组的,因为不确定长度) //现在数组要装商品对象,类本身也是类型 Goods[] shopCar = new Goods[100]; //3、搭建操作架构 while (true) { System.out.println("请您选择如下命令进行操作:"); System.out.println("添加商品到购物车:add"); System.out.println("查询商品到购物车:query"); System.out.println("修改商品购买数量:update"); System.out.println("结算购买商品的金额:pay"); Scanner sc = new Scanner(System.in); String command = sc.next(); switch (command){ case "add": //添加商品到购物车 addGoods(shopCar,sc); break; case "query": //查询商品到购物车 queryGoods(shopCar); break; case "update": //修改商品购买数量 updateGoods(shopCar,sc); break; case "pay": //结算购买商品的金额 pay(shopCar); break; default: System.out.println("没有该功能!"); } } } public static void pay(Goods[] shopCar) { queryGoods(shopCar); //1、定义一个求和变量累加金额 double money = 0; //2、遍历购物车数组中的全部商品对象,累加单价*数量 for (int i = 0; i < shopCar.length; i++) { Goods g = shopCar[i]; if(g != null){ money+=(g.getPrice()* g.getBuyNumber()); }else { break; } } System.out.println("订单总金额:"+money); } public static void updateGoods(Goods[] shopCar,Scanner scanner) { //让用户输入要修改商品的id,根据id要修改的商品对象 while (true) { System.out.println("请您输入要修改的商品id:"); int id = scanner.nextInt(); Goods g = getGoodsById(shopCar,id); if(g == null){ //没有该商品 System.out.println("对不起,没有购买该商品"); }else { //说明存在该商品对象,可以修改它了 System.out.println("请您输入:"+g.getName()+"商品最新购买数量:"); int buyNumber = scanner.nextInt(); g.setBuyNumber(buyNumber); System.out.println("修改完成 "); queryGoods(shopCar); break; } } } public static Goods getGoodsById(Goods[] shopCar, int id){ for (int i = 0; i < shopCar.length; i++) { Goods g = shopCar[i]; if(g != null){ //判断这个商品对象的id是否是我们要找的 if(g.getId()==id){ return g; } } else { return null;//找完了全面存在的商品,都没有找到 } } return null;//代表找完了100个商品都没有找到id一样的商品 } /** 查询购物车中的商品对象信息,并展示出来 */ public static void queryGoods(Goods[] shopCar) { System.out.println("========查询购物车信息如下============"); System.out.println("编号\t\t名称\t\t\t价格\t\t\t购买数量"); //shopCar = [g1,g2,g3] for (int i = 0; i < shopCar.length; i++) { Goods g = shopCar[i]; if(g != null){ //展示这个商品对象 System.out.println(g.getId()+"\t\t"+g.getName()+"\t\t\t"+g.getPrice()+"\t\t\t"+g.getBuyNumber()); }else { //遍历结束 break; } } } /** 完成商品添加到购物车的功能 */ //main方法已经new了一个扫描器对象了,在它调用addGoods方法时可以把对象当作参数传进入,此时addGoods方法需要用一个形参scanner接收 public static void addGoods(Goods[] shopCar,Scanner scanner) { //1、录入用户输入的购买商品的信息 System.out.println("请您输入购买商品的编号(不重复)"); int id = scanner.nextInt(); System.out.println("请您输入购买商品的名称:"); String name = scanner.next(); System.out.println("请您输入购买商品的数量:"); int buyNumber = scanner.nextInt(); System.out.println("请您输入购买商品的价格:"); double price = scanner.nextDouble(); //2、把这个购买商品的信息封装成一个商品对象 Goods g = new Goods(); g.setId(id); g.setName(name); g.setBuyNumber(buyNumber); g.setPrice(price); //3、把这个商品对象添加到购物车数组中去 //shopCar = [null,null,null] for (int i = 0; i < shopCar.length; i++) { if(shopCar[i]==null){ //说明此位置没有元素存入,把我们新买的商品添加到此处即可 shopCar[i] = g; break;//结束,因为商品已经成功存入了,不需要继续找位置了 } } System.out.println("您的商品:"+ g.getName() + "已经添加到购物车"); } }