day07-面向对象基础
面向对象编程(基础)
1.类、对象
1.1类的概念、设计类获得对象
package com.itheima.createobject;
public class Car {
// 属性(成员变量)
String name; // 名称
double price; // 价格
// 行为(方法)
public void start(){
System.out.println(name + " 价格是:" + price +", 启动成功!");
}
public void run(){
System.out.println(name + " 价格是:" + price +", 跑的很快!");
}
}
package com.itheima.createobject;
/**
目标:掌握自己设计类,并获得对象。
*/
public class Test {
public static void main(String[] args) {
// 如何去获取汽车的对象。
Car c1 = new Car();
System.out.println(c1);
c1.name = "宝马X3";
c1.price = 37.89;
System.out.println(c1.name);
System.out.println(c1.price);
c1.start();
c1.run();
System.out.println("-------------------");
Car c2 = new Car();
c2.name = "奔驰GLC";
c2.price = 39.89;
System.out.println(c2.name);
System.out.println(c2.price);
c2.start();
c2.run();
}
}
1.2定义类的补充注意事项
package com.itheima.createobject;
/**
目标:学习定义类的一些注意事项。
*/
public class Student {
// 修饰符 数据类型 变量名称 = 初始化值;
String name;
double height;
}
//class Animal{
//
//}
//
//class Cat{
//
//}
package com.itheima.createobject;
public class Test2 {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(s1.name);
System.out.println(s1.height);
Student s2 = new Student();
System.out.println(s2.name);
System.out.println(s2.height);
}
}
2.Java对象内存图
2.1多个对象的内存图
2.2两个变量指向同一个对象内存图
package com.itheima.memory;
public class Student {
String name;
char sex;
String hobby;
public void study(){
System.out.println("姓名:" + name +",性别是:" + sex
+ ",爱好是:" + hobby + "的学生在好好学习,天天向上!");
}
}
package com.itheima.memory;
public class Test {
public static void main(String[] args) {
// 目标:掌握2个变量指向同一个对象的形式
Student s1 = new Student();
s1.name = "小明";
s1.sex = '男';
s1.hobby = "睡觉、游戏、听课";
s1.study();
// 关键:把s1赋值给学生类型的变量s2
Student s2 = s1;
System.out.println(s1);
System.out.println(s2);
s2.hobby = "爱提问";
System.out.println(s2.name);
System.out.println(s2.sex);
System.out.println(s1.hobby);
s2.study();
s1 = null;
s2 = null;
System.out.println(s1.name);
}
}
3.面向对象编程案例
3.1考试系统模拟-设计对象
3.2考试系统模拟-功能实现
3.3购车系统模拟-设计对象
3.4购车系统模拟-功能实现
package com.itheima.demo;
public class Article {
String name;
double price;
int buyNumber; // 购买数量
}
package com.itheima.demo;
import java.util.Scanner;
/**
需求:模拟购物车的功能。
1、定义一个商品类:Article(属性:名称、价格)
2、定义一个数组容器存储商品对象的,代表购物车对象。
*/
public class Test {
public static void main(String[] args) {
// a、定义一个数组存储商品对象的,代表购物车对象。
Article[] shopCar = new Article[10];
// b、让用户选择功能
while (true) {
Scanner sc = new Scanner(System.in);
System.out.println("添加商品:add");
System.out.println("查看商品:query");
System.out.println("修改数量:update");
System.out.println("结算价格:pay");
System.out.println("请您选择要操作的功能:");
String command = sc.next();
switch (command) {
case "add":
// 把商品加入到购物车中去。
addArticle(shopCar);
break;
case "query":
// 查看购物车中的商品信息
queryArticle(shopCar);
break;
case "update":
updateArticle(shopCar);
break;
case "pay":
calcPayMoney(shopCar);
break;
default:
System.out.println("当前命令输入有误!");
}
}
}
private static void calcPayMoney(Article[] shopCar) {
queryArticle(shopCar);
// 准备一个double类型的变量统计总金额
double money = 0;
for (int i = 0; i < shopCar.length; i++) {
Article a = shopCar[i];
if(a != null){
money += (a.price * a.buyNumber);
}else {
break;
}
}
System.out.println("本次商品购买的总价为:" + money);
}
public static void updateArticle(Article[] shopCar) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请您输入要修改数量的商品名称:");
String name = sc.next();
Article a = getArticleByName(name , shopCar );
if(a != null){
System.out.println("请您输入修改后购买的数量:");
int buyNumber = sc.nextInt();
a.buyNumber = buyNumber;
System.out.println("该商品的购买数量修改了!");
break;
}else {
System.out.println("购物车中没有该商品信息");
}
}
}
public static Article getArticleByName(String name , Article[] shopCar){
for (int i = 0; i < shopCar.length; i++) {
Article a = shopCar[i];
if(a != null && a.name.equals(name) ){
return a;
}
}
return null;
}
public static void queryArticle(Article[] shopCar) {
System.out.println("商品名称\t商品价格\t商品的购买数量");
// 展示购物车的商品信息
for (int i = 0; i < shopCar.length; i++) {
Article a = shopCar[i];
if(a != null){
System.out.println(a.name +"\t" + a.price + "\t" + a.buyNumber);
}else {
return;
}
}
}
public static void addArticle(Article[] shopCar) {
Scanner sc = new Scanner(System.in);
System.out.println("请您输入商品的名称:");
String name = sc.next();
System.out.println("请您输入商品的价格:");
double price = sc.nextDouble();
System.out.println("请您输入购买商品的数量:");
int buyNumber = sc.nextInt();
// 创建一个商品对象,封装这些数据
Article a = new Article();
a.name = name;
a.price = price;
a.buyNumber = buyNumber;
// 遍历这个购物车数组对象,看哪个位置是null,如果是null ,把商品对象添加进去
for (int i = 0; i < shopCar.length; i++) {
if(shopCar[i] == null){
shopCar[i] = a; // 把商品对象添加到这个位置了
break;
}
}
System.out.println("添加成功!");
}
}
4.构造器
package com.itheima.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;
}
}
package com.itheima.constructor;
/**
目标:明白构造器的作用和分类。(开发的人,理解能力好)
*/
public class ConstructorDemo {
public static void main(String[] args) {
Car c = new Car();
// c.name = "";
// c.price
System.out.println(c.name);
System.out.println(c.price);
Car c2 = new Car("奔驰GLC", 39.78);
System.out.println(c2.name);
System.out.println(c2.price);
}
}
5.this关键字
package com.itheima.thisdemo;
/**
目标:说出this关键字的作用,并学会其使用。
*/
public class ThisDemo {
public static void main(String[] args) {
Car c = new Car("宝马X3", 37.89);
System.out.println(c);
System.out.println(c.name);
System.out.println(c.price);
c.goWith("奔驰GLC");
}
}
package com.itheima.thisdemo;
public class Car {
String name;
double price;
public void goWith(String name){
System.out.println(this.name +"正在和:" + name +"比赛!");
}
/**
无参数构造器(默认存在的)
*/
public Car(){
System.out.println("无参数构造器被触发执行~~~");
}
/**
有参数构造器
*/
public Car(String name, double price){
System.out.println("有参数构造器被触发执行~~~");
System.out.println(this);
this.name = name;
this.price = price;
}
}
6.封装
package com.itheima.encapsulation;
/**
目标:学会面向对象的三大特征:封装的形式、作用。
*/
public class Test {
public static void main(String[] args) {
Student s = new Student();
// s.age = -23;
s.setAge(-23);
System.out.println(s.getAge());
}
}
package com.itheima.encapsulation;
public class Student {
// private私有的成员变量,只能在本类访问。
private int age;
public int getAge(){
return age;
}
public void setAge(int age){
if(age >= 0 && age <= 200){
this.age = age;
}else {
System.out.println("年龄数据有问题,应该不是人的年龄!");
}
}
}
7.标准 JavaBean 开始
package com.itheima.javabean;
public class Test {
public static void main(String[] args) {
User user = new User();
user.setName("二狗");
user.setHeight(163);
user.setSalary(50000);
user.setAddress("中国");
user.setPhone("13141314520");
// String name = user.getName();
// System.out.println(name);
System.out.println(user.getName());
System.out.println(user.getHeight());
System.out.println(user.getSalary());
System.out.println(user.getAddress());
System.out.println(user.getPhone());
System.out.println("--------------------");
User user1 = new User(176, "黑马吴彦祖", 30000, "黑马", "110");
System.out.println(user1.getName());
System.out.println(user1.getHeight());
System.out.println(user1.getSalary());
System.out.println(user1.getAddress());
System.out.println(user1.getPhone());
}
}
package com.itheima.javabean;
public class User {
private double height;
private String name;
private double salary;
private String address;
private String phone;
public User() {
}
public User(double height, String name, double salary, String address, String phone) {
this.height = height;
this.name = name;
this.salary = salary;
this.address = address;
this.phone = phone;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
8.使用标准JavaBean改造面向对象案例
package com.itheima.demo;
public class Article {
private int id; //编号
private String name;//名称
private double price;//价格
private int buyNumber; // 购买数量
public Article(){
}
public Article(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;
}
}
package com.itheima.demo;
import java.util.Scanner;
/**
需求:模拟购物车的功能。
1、定义一个商品类:Article(属性:名称、价格)
2、定义一个数组容器存储商品对象的,代表购物车对象。
*/
public class Test {
public static void main(String[] args) {
// a、定义一个数组存储商品对象的,代表购物车对象。
Article[] shopCar = new Article[10];
// b、让用户选择功能
while (true) {
System.out.println("请算账如下命令进行操作:");
Scanner sc = new Scanner(System.in);
System.out.println("添加商品:add");
System.out.println("查看商品:query");
System.out.println("修改数量:update");
System.out.println("结算价格:pay");
System.out.println("请您选择要操作的功能:");
String command = sc.next();
switch (command) {
case "add":
// 把商品加入到购物车中去。
addArticle(shopCar ,sc);
break;
case "query":
// 查看购物车中的商品信息
queryArticle(shopCar);
break;
case "update":
//修改商品的购买数量
updateArticle(shopCar ,sc) ;
break;
case "pay":
//结算金额
calcPayMoney(shopCar);
break;
default:
System.out.println("当前命令输入有误!");
}
}
}
private static void calcPayMoney(Article[] shopCar) {
queryArticle(shopCar);
// 准备一个double类型的变量统计总金额
double money = 0;
//2.遍历购物车数组中的全部商品对象, 累加单价* 数量
for (int i = 0; i < shopCar.length; i++) {
Article a = shopCar[i];
if(a != null){
money += (a.getPrice() * a.getBuyNumber());
}else {
break;
}
}
System.out.println("本次商品购买的总价为:" + money);
}
public static void updateArticle(Article[] shopCar , Scanner sc) {
// 让用户输入要修改商品的id 根据id查询出要修改的商品对象
while (true) {
System.out.println("请您输入要修改数量的商品id:");
int id = sc.nextInt();
Article a = getArticleById(shopCar , id);
if(a == null){
//没有该商品
System.out.println("对不起,购物车中没有该商品");
}else {
// 说明存在该商品对象,可以修改它了
System.out.println("请输入:" + a.getName() + "商品最新购买数量:");
int buyNumber = sc.nextInt();
a.setBuyNumber( buyNumber);
System.out.println("修改完成!");
queryArticle(shopCar);
break;
}
}
}
public static Article getArticleById(Article[] shopCar , int id){
for (int i = 0; i <shopCar.length ; i++) {
Article a = shopCar[i];
if (a != null) {
if(a.getId() == id){
return a;
}
}else {
return null;//找完了全面的商品,都没有找到
}
}
//代表找完100个商品都没找到id一样的商品
return null;
}
/**
查询购物车从商品对象信息,并展示出来
*/
public static void queryArticle(Article[] shopCar) {
System.out.println("================查询购物车信息如下=============");
System.out.println("编号\t\t名称\t\t\t价格\t\t\t购买数量");
// 展示购物车的商品信息
for (int i = 0; i < shopCar.length; i++) {
Article a = shopCar[i];
if(a != null){
System.out.println(a.getId() +"\t\t"+a.getName() +"\t\t\t" + a.getPrice() + "\t\t\t" + a.getBuyNumber());
}else {
break;//遍历结束
}
}
}
/**
完成商品添加到购物车的功能
*/
public static void addArticle(Article[] shopCar , Scanner sc) {
//1.录入用户输入的购买商品的信息
//Scanner sc = new Scanner(System.in);
System.out.println("请您输入商品的编号(不重复):");
int id =sc.nextInt();
System.out.println("请您输入购买商品的名称:");
String name = sc.next();
System.out.println("请您输入购买商品的数量:");
int buyNumber = sc.nextInt();
System.out.println("请您输入商品的价格:");
double price = sc.nextDouble();
// 创建一个商品对象,封装这些数据
Article a = new Article();
a.setId(id);
a.setName(name);
a.setBuyNumber(buyNumber);
a.setPrice(price);
// 遍历这个购物车数组对象,看哪个位置是null,如果是null ,把商品对象添加进去
for (int i = 0; i < shopCar.length; i++) {
if(shopCar[i] == null){
shopCar[i] = a; // 把商品对象添加到这个位置了
break;
}
}
System.out.println("你的商品:" + a.getName()+"添加到购物车完成!");
}
}
9.补充知识:成员变量、局部变量区别
package com.itheima.javabean;
public class User {
//1.成员变量需要私有化 private 修饰
private double height;
private String name;
private double salary;
private String address;
private String phone;
// 3.无参数构造器是默认的
public User() {
}
public User(double height, String name, double salary, String address, String phone) {
this.height = height;
this.name = name;
this.salary = salary;
this.address = address;
this.phone = phone;
}
// 2.需要提供setter getter 方法
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
package com.itheima.javabean;
public class Test {
public static void main(String[] args) {
//1.创建对象封装数据:无参数构造器
User user = new User();
user.setName("二狗");
user.setHeight(163);
user.setSalary(50000);
user.setAddress("中国");
user.setPhone("13141314520");
// String name = user.getName();
// System.out.println(name);
System.out.println(user.getName());
System.out.println(user.getHeight());
System.out.println(user.getSalary());
System.out.println(user.getAddress());
System.out.println(user.getPhone());
// 2.创建对象封装数据:有参构造器
System.out.println("--------------------");
User user1 = new User(176, "黑马吴彦祖", 30000, "黑马", "110");
System.out.println(user1.getName());
System.out.println(user1.getHeight());
System.out.println(user1.getSalary());
System.out.println(user1.getAddress());
System.out.println(user1.getPhone());
}
}