一、设计对象并使用
1.定义类,创建对象并使用
在Java中,必须先设计类,才能获得对象。
类(设计图):是对象共同特征的描述; 对象:是真实存在的具体实例。
如何定义类
public class 类名 {
1、成员变量(代表属性,一般是名词)
2、成员方法(代表行为,一般是动词)
3、构造器 (后面学习)
4、代码块 (后面学习)
5、内部类 (后面学习)}
public class Car { } String name; double price; // 属性 (成员变量) // 行为(方法) public void start(){ } public void run(){ }
如何得到类的对象
类名 对象名 = new 类名();
Car c = new Car();
如何使用对象
访问属性: 对象名.成员变量
访问行为: 对象名.方法名(…)
2.定义类的补充注意事项
成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值; 一般无需指定初始化值,存在默认值。
类名首字母建议大写,且有意义,满足“驼峰模式”。
一个Java文件中可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。 实际开发中建议还是一个文件定义一个class类。
对象的成员变量的默认值规则
数据类型 明细 默认值
基本类型 byte、short、char、int、long 0
float、double 0.0
boolean false
引用类型 类、接口、数组、String null
二、对象内存图
1.多个对象的内存图
1.对象放在哪个位置?
堆内存中
2. Car c = new Car(); c变量名中存储的是什么?
存储的是对象在堆内存中的地址。
3. 成员变量(name、price)的数据放在哪里,存在于哪个位置?
对象中,存在于堆内存中。
2.两个变量指向同一个对象内存图
public class base { public static void main(String[] args) { Student s1 = new Student(); s1.name = "小明"; s1.sex = '男'; s1.hobby = "游戏、睡觉、听课"; s1.study(); System.out.println("-------------------"); // 把学生类型的s1变量赋值给学生类型的s2变量 Student s2 = s1; s2.hobby = "爱提问"; System.out.println(s2.name); System.out.println(s2.sex); System.out.println(s1.hobby); s2.study(); System.out.println("-------------------"); s1.study(); } }
由此可见:
s2.hobby = "爱提问"; 改变了堆内存的值,导致:
s1.study();和第一次输出的不一样
3.垃圾回收
注意:当堆内存中的类对象或数组对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。
Java存在自动垃圾回收器,会定期进行清理。
三、面向对象编程案例
购车系统模拟
需求
模拟购物车模块的功能,需要实现添加商品到购物车中去,同时需要提供修改商品的购买数量,结算商品价格功能(请使用面向对象编程来解决)
分析
购物车中的每个商品都是一个对象,需要定义一个商品类。
购物车本身也是一个对象:可以使用数组对象代表它。
完成界面架构,让用户选择操作的功能。
商品类
public class Goods { int id; String name; double price; int buyNumber; }
import java.util.Scanner; public class base { public static void main(String[] args) { Goods[] goods=new Goods[100]; Scanner scanner = new Scanner(System.in); while (true) { System.out.println("请输入你的操作:add(添加商品) query(查询购物车) update(修改购物车) pay(支付)"); System.out.println("-----------------------------------"); String command = scanner.next(); switch (command){ case "add": //添加 add(goods,scanner); break; case "query": //查询 query(goods,scanner); break; case "update": //修改 update(goods,scanner); break; case "pay": //支付 pay(goods,scanner); break; default: System.out.println("你输入的命令有误"); break; } } } private static void pay(Goods[] goods, Scanner scanner) { double money=0; for (int i = 0; i < goods.length; i++) { Goods g = goods[i]; if (g!=null){ money+=(g.price*g.buyNumber); } else break; } System.out.println("购物车商品价格为:"+money); } private static void update(Goods[] goods, Scanner scanner) { System.out.println("请输入要修改的商品编号"); int id = scanner.nextInt(); Goods date = getupdate(goods, id); if (date==null){ System.out.println("没有找到改商品"); }else { System.out.println(date.name+"修改后的数量:"); date.buyNumber=scanner.nextInt(); System.out.println("修改成功"); query(goods,scanner); } } private static Goods getupdate(Goods[] goods,int id){ for (int i = 0; i < goods.length; i++) { Goods g=goods[i]; if (g!=null){ if (g.id==id){ return g; } } return null; } return null; } private static void query(Goods[] goods, Scanner scanner) { System.out.println("-----------------------------------"); System.out.println("编号\t\t名称\t\t价格\t\t数量"); for (int i = 0; i < goods.length; i++) { Goods g=goods[i]; if (g!=null){ System.out.print(g.id+"\t\t"); System.out.print(g.name+"\t\t"); System.out.print(g.price+"\t\t"); System.out.println(g.buyNumber+"\t\t"); }else { break; } } } private static void add(Goods[] goods, Scanner scanner) { Goods g = new Goods(); System.out.println("侵害输入商品的编号"); g.id=scanner.nextInt(); System.out.println("请输入商品的名称"); g.name=scanner.next(); System.out.println("请输入商品的价格"); g.price=scanner.nextDouble(); System.out.println("请输入商品的数量"); g.buyNumber=scanner.nextInt(); for (int i = 0; i < goods.length; i++) { if (goods[i]==null){ goods[i]=g; System.out.println(g.name + "添加成功"); break; } } } }