第09天 面向对象
我们回想一下,这几天我们完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现。一步一步去实现,而具体的每一步都需要我们去实现和操作。这些步骤相互调用和协作,完成我们的需求。
在上面的每一个具体步骤中我们都是参与者,并且需要面对具体的每一个步骤和过程,这就是面向过程最直接的体现。
那么什么是面向过程开发呢? 面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。
面向过程的代表语言:C语言
当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了,这时就开始思索,能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想。
面向对象的思维方式在Java代码中表现为类的定义与对象的使用。理清类与对象的概念与关系是面向对象的重点。
类是具有相同特征(属性)和行为(功能)的一类事物的抽象。
我们将现实事物的特征抽象为类中的成员变量,现实事物的行为功能抽象为类中的成员方法。
注意:实际上所属关系是直接属于类的,均称为成员,如成员变量、成员方法、后边学习的成员内部类,并不单指成员变量。
类在Java中代码的体现形式:
public class 类名{
private 数据类型 变量名1;
private 数据类型 变量名2;
…其他成员变量
public 返回值类型 方法名(参数类型 参数名,参数类型 参数名2…) {
方法体;
}
每个属性对应的get/set方法,使用this区分成员变量与局部变量
}
如:人类
public class Person {
private String name;
private int age;
public void eat() {
System.out.println(“吃了”);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge (int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
类的使用非常简单,一般分为两个动作:创建对象与调用方法。
类的定义是现实事物的抽象,真正使用的是类创建的对象。通常使用对象来调用方法。
对象创建格式:
数据类型 对象名= new 数据类型();
对象方法的调用:
无返回值:
对象名.方法名(参数);
有返回值:
返回值类型 变量名 = 对象名.方法名(参数);
直接定义在类中的变量称为成员变量,在面向对象思想设计上,是类的组成部分。
成员变量通常使用private修饰,阻止本类以外的其他类访问。
成员变量不能重名,局部变量不能重名,成员与局部变量可以重名,但是需要使用this区分。
使用this访问的为成员变量,直接访问的为局部。在方法内访问变量,如果没有该名称的局部变量会自动查找是否有该名称的成员变量。
正常定义成员方法时,一般是不需要添加static修饰符的。static修饰符会在后边详细简介。
成员方法一般可分为两类
package cn.javahelp;
/*
* 定义自定义类型 Person类
*
* 属性(成员变量)
* 姓名 String
* 年龄 int
* 行为(成员方法)
* 吃饭
* 睡觉
* 打豆豆
*
* 为成员变量赋值/获取成员变量的值的方法
*
* private 修饰的成员(成员变量,成员方法) 让外界无法直接访问 内部可以访问
*
* this区分成员变量与局部变量(注意:这是定义时所展现出来的功能,其功能本质,一会单独说)
*
* 成员方法 一般不使用static修饰
* 分为两种
* 1.get/set方法
* 2.属于类的功能的方法
*/
public class Person {
//定义成员变量
private String name;
private int age;
private String sex;
//吃饭
public void eat(){
System.out.println(name+"吃了");
}
//睡觉
public void sleep(){
System.out.println(name+"睡了");
}
//打豆豆
public void hitBeanBean(){
System.out.println(name+"打了,爽了,敲代码了!");
}
//为name赋值的方法 方法名 setName 参数 String name 返回值 void
public void setName(String name){
this.name=name;
}
//获取name的值的方法 方法名 getName 参数 无 返回值 String name
public String getName(){
return name;
}
//为age赋值的方法 方法名 setAge 参数 int age 返回值 void
public void setAge(int age){
this.age=age;
}
//获取age的值的方法 方法名 getAge 参数 无 返回值 int age
public int getAge(){
return age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
package cn.javahelp;
/*
* 测试Person类
*
* 导包 在同一个文件夹下不需要导包
* 创建对象 数据类型 变量名 = new 数据类型()
* 调用方法
* 返回值类型 新变量名 = 变量名.方法名(实际参数);
*
*
* 方法调用时,用static修饰的方法调用其他方法时,其他方法必须使用static修饰
* 指的是
* 在同一个类中,直接调用其他方法时,其他方法必须使用static修饰
* 如果使用对象名.方法名()这种方式 其他方法一般不使用static修饰
*/
public class Test {
public static void main(String[] args) {
//创建对象
Person p= new Person();
//调用方法
p.setName("柳岩");
p.setAge(38);
//因为age用private修饰了 所以外界不能直接访问了
//p.age = -1;
//如果使用对象名.方法名()这种方式 其他方法一般不使用static修饰
p.eat();
p.sleep();
p.hitBeanBean();
String name = p.getName();
System.out.println(name);
System.out.println(p.getAge());
//main方法直接调用method方法 method方法必须使用static修饰
//method();
}
public void method(){
System.out.println("我是一个方法");
}
}
public class DemoVariable {
int x;
public void show() {
int y = 0;
System.out.println(x);
System.out.println(y);
}
}
类是抽象概念,对象是类的具体实例。我们通常真正使用的是某个类的实例对象,进而调用该对象的方法。
一个类可以有多个对象,一个对象只属于一个类(在讲完多态后会有不同的理解)。
可以说创建对象并调用方法是类最主要的使用方式。
public class Student {
public void study() {
System.out.println("好好学习,天天向上");
}
}
public class Teacher {
public void test(Student s) {
s.study();
}
}
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = new Student();
t.test(s);
}
}
public class Student {
public void study() {
System.out.println("好好学习,天天向上");
}
}
public class Teacher {
public Student getStudent() {
Student s = new Student();
return s;
}
}
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = t.getStudent();
s.study();
}
}
在第6天自定义类型基础上,我们可以将现实生活中的任何事物抽象成一个更为完整的类,请自定义并使用一种数据类型。如人类、动物类、汽车类、衣服类、玩具类等
/*
* 定义自定义类型 Person类
*
* 属性(成员变量)
* 姓名 String
* 年龄 int
* 行为(成员方法)
* 吃饭
* 睡觉
* 打豆豆
*
* 为成员变量赋值/获取成员变量的值的方法
*
* private 修饰的成员(成员变量,成员方法) 让外界无法直接访问 内部可以访问
*
* this区分成员变量与局部变量(注意:这是定义时所展现出来的功能,其功能本质,一会单独说)
*
* 成员方法 一般不使用static修饰
* 分为两种
* 1.get或set方法
* 2.属于类的功能的方法
*
*
*
*
*/
public class Person {
//定义成员变量
private String name;
private int age;
private String sex;
//吃饭
public void eat(){
System.out.println(name+"吃了");
}
//睡觉
public void sleep(){
System.out.println(name+"睡了");
}
//打豆豆
public void hitBeanBean(){
System.out.println(name+"打了,爽了,敲代码了!");
}
//为name赋值的方法 方法名 setName 参数 String name 返回值 void
public void setName(String name){
this.name=name;
}
//获取name的值的方法 方法名 getName 参数 无 返回值 String name
public String getName(){
return name;
}
//为age赋值的方法 方法名 setAge 参数 int age 返回值 void
public void setAge(int age){
this.age=age;
}
//获取age的值的方法 方法名 getAge 参数 无 返回值 int age
public int getAge(){
return age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
/*
* 测试Person类
*
* 导包 在同一个文件夹下不需要导包
* 创建对象 数据类型 变量名 = new 数据类型()
* 调用方法
* 返回值类型 新变量名 = 变量名.方法名(实际参数);
*
*
* 方法调用时,用static修饰的方法调用其他方法时,其他方法必须使用static修饰
* 指的是
* 在同一个类中,直接调用其他方法时,其他方法必须使用static修饰
* 如果使用对象名.方法名()这种方式 其他方法一般不使用static修饰
*/
public class Test {
public static void main(String[] args) {
//创建对象
Person p= new Person();
//调用方法
p.setName("柳岩");
p.setAge(38);
//因为age用private修饰了 所以外界不能直接访问了
//p.age = -1;
//如果使用对象名.方法名()这种方式 其他方法一般不使用static修饰
p.eat();
p.sleep();
p.hitBeanBean();
String name = p.getName();
System.out.println(name);
System.out.println(p.getAge());
//main方法直接调用method方法 method方法必须使用static修饰
//method();
}
public void method(){
System.out.println("我是一个方法");
}
}
/*
* 车类
*
* 属性
* 颜色
* 品牌
* 价格
* 车牌号
* 车主
*
* 功能
* 运输货物
* 兜风
* get/set
*/
public class Car {
private String color;//颜色
private String pinPai;//品牌
private double price;//价格
private String number;//车牌号
private String admin;//车主
//运输方法 方法名yunShu 参数 String 货物 返回值 无
public void yunShu(String huoWu){
System.out.println(admin+"开着"+color+pinPai+"价值"+price
+"车牌号为"+number+"的车"+"运输了"+huoWu);
}
//兜风 方法名 douFeng 参数 String name 返回值 无
public void douFeng(String name){
System.out.println(admin+"开着"+color+pinPai+"价值"+price
+"车牌号为"+number+"的车"+"带着"+name+"去兜风");
}
//为color赋值 方法名 setColor 参数 String color 返回值 void
public void setColor(String color){
this.color = color;
}
//获取color的值 方法名 getColor 参数 无 返回值 String color
public String getColor(){
return color;
}
//获取pinPai的值
public String getPinPai() {
return pinPai;
}
//为pinPai赋值
public void setPinPai(String pinPai) {
this.pinPai = pinPai;
}
//获取price的值
public double getPrice() {
return price;
}
//为price赋值
public void setPrice(double price) {
this.price = price;
}
//获取number的值
public String getNumber() {
return number;
}
//为number赋值
public void setNumber(String number) {
this.number = number;
}
//获取admin的值
public String getAdmin() {
return admin;
}
//为admin赋值
public void setAdmin(String admin) {
this.admin = admin;
}
}
/*
* 测试 自定义类型 车类
*
*/
public class Test {
public static void main(String[] args) {
Car c = new Car();
//调用方法
c.setAdmin("老王");
c.setColor("绿色");
c.setPinPai("三蹦子");
c.setPrice(250.38);
c.setNumber("JP74110");
c.yunShu("猪");
c.douFeng("柳岩");
}
}
定义手机类
public class Phone {
//品牌
String brand;
//价格
int price;
//颜色
String color;
//打电话
public void call(String name) {
System.out.println("给"+name+"打电话");
}
//发短信
public void sendMessage() {
System.out.println("群发短信");
}
}
手机类的测试类
public class Demo02Phone {
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
//输出成员变量值
System.out.println("品牌:"+p.brand);//null
System.out.println("价格:"+p.price);//0
System.out.println("颜色:"+p.color);//null
System.out.println("------------");
//给成员变量赋值
p.brand = "锤子";
p.price = 2999;
p.color = "棕色";
//再次输出成员变量值
System.out.println("品牌:"+p.brand);//锤子
System.out.println("价格:"+p.price);//2999
System.out.println("颜色:"+p.color);//棕色
System.out.println("------------");
//调用成员方法
p.call("唐嫣");
p.sendMessage();
}
}
对象在内存中的位置:
对象由new关键字创建,如同数组,实体存在于堆内存中
任何事物均可以定义成类,创建对象,属于引用类型
而对象的引用变量是一个普通变量。存储的值是该对象堆内存中的地址。
public class Phone {
String brand;
int price;
String color;
public void call(String name) {
System.out.println("给"+name+"打电话");
}
public void sendMessage() {
System.out.println("群发短信");
}
}
public class Demo01Phone {
public static void main(String[] args) {
Phone p = new Phone();
System.out.println(p.brand + "---" + p.price + "---" + p.color);
p.brand = "锤子";
p.price = 2999;
p.color = "棕色";
System.out.println(p.brand + "---" + p.price + "---" + p.color);
p.call("林青霞");
p.sendMessage();
}
}
public class Demo02Phone {
public static void main(String[] args) {
Phone p1 = new Phone();
p1.brand = "小米5s";
p1.price = 1999;
p1.color = "银色";
System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);
p1.call("林青霞");
p1.sendMessage();
Phone p2 = new Phone();
p2.brand = "IPhone7S";
p2.price = 7999;
p2.color = "土豪金";
System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);
p2.call("张曼玉");
p2.sendMessage();
}
}
public class Demo03Phone {
public static void main(String[] args) {
Phone p1 = new Phone();
p1.brand = "OPPO";
p1.price = 2999;
p1.color = "白色";
System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);
Phone p2 = p1;
p2.brand = "魅族";
p2.price = 1999;
p2.color = "蓝色";
System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);
System.out.println(p2.brand+"---"+p2.price+"---"+p2.color);
}
}
public class Student {
String name;
//int age;
private int age;
public void setAge(int a) {
if(a<0 || a>200) {
System.out.println("你给的年龄有误");
}else {
age = a;
}
}
public int getAge() {
return age;
}
public void show() {
System.out.println("姓名是:"+name+",年龄是:"+age);
}
}
public class DemoStudent {
public static void main(String[] args) {
//创建学生对象
Student s = new Student();
s.show();
s.name = "柳岩";
//s.age = 18;
//s.age = -18;
//s.setAge(-18);
s.setAge(28);
s.show();
}
}
public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
public class DemoStudent {
public static void main(String[] args) {
//创建对象
Student s = new Student();
System.out.println(s.getName()+"---"+s.getAge());
s.setName("赵丽颖");
s.setAge(18);
System.out.println(s.getName()+"---"+s.getAge());
}
}
一般出现在类的一个方法的定义当中,代表当前对象的引用。我们通常用其将本对象中的成员与其他作用域区分开来。
当一个类定义好之后,如果不创建对象this是没有意义的。
一个类可以有多个对象。每个对象都有各自的属性值,各个对象的方法均是类中定义的那个方法逻辑。定义中的this就代表调用方法的这个对象。
public class Student {
private String name;
private int age;
public void setName(String name) {
//name = name;
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
//age = age;
this.age = age;
}
public int getAge() {
return age;
}
}
public class DemoStudent {
public static void main(String[] args) {
//创建对象
Student s = new Student();
System.out.println(s.getName()+"---"+s.getAge());
s.setName("柳岩");
s.setAge(18);
System.out.println(s.getName()+"---"+s.getAge());
}
}
成员属性:
名称:String
作者:String
出版社:String
出版日期:String
单价:double
成员方法:
1). get/set方法
2).showMe()方法,打印所有内部属性的值;
定义类:Test1,定义main()方法,按以下要求编写代码:
成员属性:
名称:String
性别:char
年龄:int
出生日期:String
成员方法:
1). get/set方法
2).showMe()方法,打印所有内部属性的值;
3).eat()方法,打印:小猫吃鱼;
定义类:Test2,定义main()方法,按以下要求编写代码:
成员属性:
品牌brand,
价格price
颜色 color
行为:打电话call, 调用方法打印***手机正在给10086打电话
发短信sendMessage, 调用方法打印***手机正在发短信
玩游戏,playGame,调用方法打印***手机正在玩王者农药
定义测试类,定义main方法,要求如下:
成员属性:
name 姓名
age 年龄
方法:
Show()
要求打印出对象的所有属性
要求在类中定义构造方法(有参数和无参数两种)和get、set方法
然后创建出测试类,然后创建三个对象
1).通过有参构造创建一个对象---(小明,20)
2)通过有参构造创建一个对象---(小红,22)
3)通过有参构造创建一个对象---(小新,16)
2).然后通过show方法打印这个对象的所有属性
定义测试类:Demo,添加main()方法,填写如下内容:
Person1 p1 = new Person1();
System.out.println(“--------------------“);
Person1 p2 = new Person1();
System.out.println(“--------------------“);
Person1 p3;
观察执行结果,请回答以下问题:
A. 构造方法的名称有什么特点?
B. 构造方法是否有“返回值类型”和“形参”的定义?
C. 此构造方法什么时候被执行?
该题考查点:属性和方法的使用!
要求:
1.空调有品牌和价格两个属性,并且将属性私有化,提供公有的getXxx与setXxx方法对属性赋值和取值;
2.提供一个无返回值的无参数的开机的方法,内容打印一句话:“空调开机了...”;
3.提供一个无返回值的带1个int类型参数的定时关机的方法,(int类型的参数表示设定的分钟数),内容打印一句话:“空调将在xxx分钟后自动关闭...”;
4.在测试类中创建出空调对象,并给空调的品牌和价格赋任意值;
5.使用空调对象获取空调的品牌和价格并打印到控制台上;
6.使用空调对象调用开机方法;
7.使用空调对象调用定时关机方法,并传递具体数据值,在控制台上可以看到的效果为:空调将在xxx分钟后自动关闭...
其中语句中的“xxx”是调用方法时传递的具体数据值;
答案:
/* * 空调类: * 属性: * 品牌 * 价格 * 方法: * 开机 * 定时关机 * getXxx与setXxx */public class KongTiao {//属性private String name;private double price;//getter与setterpublic 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 void kaiJi(){System.out.println("空调开机了...");}//定时关机public void dingShiGuanJi(int fenZhong){System.out.println("空调将在"+fenZhong+"分钟后自动关闭...");}}/* * 空调测试类 */public class KongTiaoTest {public static void main(String[] args) {//1、创建对象KongTiao kt = new KongTiao();//2、赋值kt.setName("格力");kt.setPrice(2999.99);//3、取值String name = kt.getName();double price = kt.getPrice();//4、打印值System.out.println("空调的品牌为:"+name);System.out.println("空调的价格为:"+price);//5、开机kt.kaiJi();//6、定时关机kt.dingShiGuanJi(30);}} |
---|
该题考查点:this关键字的使用!
要求:
1.学生有姓名和年龄两个属性,并且将属性私有化,提供公有的getXxx与setXxx方法对属性赋值和取值;
2.提供一个无返回值的无参数的自我介绍的方法,内容打印一句话:
“大家好,我叫xxx,今年xxx岁了!”
3.提供一个返回值为String类型,参数为学生类型的比较年龄差值的方法,如果当前对象的年龄比参数中的学生的年龄大,则返回:“我比同桌大xxx岁!”;如果当前对象的年龄比参数中的学生的年龄小,则返回:“我比同桌小xxx岁!”;如果当前对象的年龄和参数中的学生的年龄一样大,则返回:“我和同桌一样大!”
4.在测试类中分别创建你和你同桌两个人的对象,并分别给你和你同桌的姓名和年龄属性赋上对应的值;
5.调用你自己的对象的自我介绍的方法,展示出你自己的姓名和年龄;
6.用你自己的对象调用比较年龄差值的方法,把你同桌作为参数使用,并打印方法返回的字符串的内容;
答案:
/* * 学生类: * 属性: * 姓名 * 年龄 * 方法: * 自我介绍 * 比较年龄差值 * getXxx与setXxx */public class XueSheng {//属性private String name;private int age;//getter与setterpublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//自我介绍public void ziWoJieShao(){System.out.println("大家好,我叫"+this.name+",今年"+this.age+"岁了!");}//比较年龄差public String biJiaoNianLingCha(XueSheng xs){//1、获取参数中学生的年龄int age2 = xs.getAge();if(this.age > age2){return "我比同桌大"+(this.age-age2)+"岁!";}else if(this.age < age2){return "我比同桌小"+(age2-this.age)+"岁!";}else{return "我和同桌一样大!";}}}/* * 学生测试类 */public class XueShengTest {public static void main(String[] args) {//1、分别创建两个对象XueSheng wo = new XueSheng();XueSheng tongZhuo = new XueSheng();//2、分别赋值wo.setName("学全");wo.setAge(18);tongZhuo.setName("学友");tongZhuo.setAge(19);//3、调用自我介绍的方法wo.ziWoJieShao();//4、调用比较年龄差的方法String cha = wo.biJiaoNianLingCha(tongZhuo);System.out.println(cha);}} |
---|
要求:
1.定义商品类,有名称和价格两个属性,并且将属性私有化,提供公有的getXxx与setXxx方法对属性赋值和取值;设置有参无参构造方法
2.编写测试类,在测试类中通过构造分别创建3个商品对象,并分别给3个商品对象的名称和价格赋值;
3.然后求出是三个商品的平均价格;
public class Shangpin { // 属性private String name;private double price; public Shangpin() {super();// TODO Auto-generated constructor stub} public Shangpin(String name, double price) {super();this.name = name;this.price = price;} // getter与setterpublic 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 class Demo {public static void main(String[] args) {Shangpin d1 = new Shangpin("洗衣机",300.5);Shangpin d2 = new Shangpin("电视机",888.5);Shangpin d3 = new Shangpin("吹风机",49.2); double num = 0;double price1 = d1.getPrice();double price2 = d2.getPrice();double price3 = d3.getPrice();num = price1+price2+price3;double pingJun = num/3 ;System.out.println("所有商品的平均价格为:"+pingJun);}} |
---|
在主方法中: 创建三个Student对象并传入method(ArrayList<Student> stu)方法中
method方法内要求: 该方法内有对等级进行判断的方法,如果为A等级则打印该学生姓名,并奖励一朵小红花~~~~
答案:
public class Student{private String name;private int age;private double grade;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getGrade() {return grade;}public void setGrade(double grade) {this.grade = grade;}public Student(String name, int age, double grade) {super();this.name = name;this.age = age;this.grade = grade;}public Student() {super();}public char getMyGrade(){if(80<grade&&grade<=100){return 'A';}if(60<grade&&grade<=80){return 'B';}if(0<grade&&grade<=60){return 'C';}return 0 ;}}public class Test_3 {public static void main(String[] args) {ArrayList<Student> arr = new ArrayList<>();arr.add(new Student("张三",11,100));arr.add(new Student("李四",12,80));arr.add(new Student("王五",13,70.5));mehtod(arr);} private static void mehtod(ArrayList<Student> arr) {for (int i = 0; i < arr.size(); i++) {Student student = arr.get(i);if(student.getMyGrade()=='A'){System.out.println("奖励"+student.getName()+"同学一个小红花");}}}} |
---|
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Demo03ArrayListTest {
public static void main(String[] args) {
//创建集合对象
ArrayList<Student> array = new ArrayList<Student>();
//创建学生对象
Student s1 = new Student("赵丽颖",18);
Student s2 = new Student("唐嫣",20);
Student s3 = new Student("景甜",25);
Student s4 = new Student("柳岩",19);
//把学生对象作为元素添加到集合中
array.add(s1);
array.add(s2);
array.add(s3);
array.add(s4);
//遍历集合
for(int x=0; x<array.size(); x++) {
Student s = array.get(x);
System.out.println(s.getName()+"---"+s.getAge());
}
}
}
public class Student {
private String name;
private String age;
public Student() {
}
public Student(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
public class Demo04ArrayListTest {
public static void main(String[] args) {
//创建集合对象
ArrayList<Student> list = new ArrayList<Student>();
//为了提高代码的复用性,我把键盘录入数据给学生对象,并存储到集合中的动作用一个方法来实现
//调用方法
addStudent(list);
addStudent(list);
addStudent(list);
//遍历集合
for(int x=0; x<list.size(); x++) {
Student s = list.get(x);
System.out.println(s.getName()+"---"+s.getAge());
}
}
/*
* 两个明确:
* 返回值类型:void
* 参数列表:ArrayList<Student> list
*/
public static void addStudent(ArrayList<Student> list) {
//键盘录入数据,创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
System.out.println("请输入学生年龄:");
String age = sc.nextLine();
Student s = new Student();
s.setName(name);
s.setAge(age);
//把学生对象作为元素存储到集合中
list.add(s);
}
}
public class Student {
//学号
private String id;
//姓名
private String name;
//年龄
private String age;
//居住地
private String address;
public Student() {
}
public Student(String id, String name, String age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class StudentManager {
public static void main(String[] args) {
//创建集合对象,用于存储学生数据
ArrayList<Student> list = new ArrayList<Student>();
//为了让程序能够回到这里来,我们使用循环
while(true) {
//这是学生管理系统的主界面
System.out.println("--------欢迎来到学生管理系统--------");
System.out.println("1 查看所有学生");
System.out.println("2 添加学生");
System.out.println("3 删除学生");
System.out.println("4 修改学生");
System.out.println("5 退出");
System.out.println("请输入你的选择:");
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
String choiceString = sc.nextLine();
//用switch语句实现选择
switch(choiceString) {
case "1":
//查看所有学生
findAllStudent(list);
break;
case "2":
//添加学生
addStudent(list);
break;
case "3":
//删除学生
deleteStudent(list);
break;
case "4":
//修改学生
updateStudent(list);
break;
case "5":
//退出
//System.out.println("谢谢你的使用");
//break;
default:
System.out.println("谢谢你的使用");
System.exit(0); //JVM退出
break;
}
}
}
/*
* 修改学生的方法
* 修改学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就修改该学生
*/
public static void updateStudent(ArrayList<Student> list) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要修改的学生的学号:");
String id = sc.nextLine();
//定义一个索引
int index = -1;
//遍历集合
for(int x=0; x<list.size(); x++) {
//获取每一个学生对象
Student s = list.get(x);
//拿学生对象的学号和键盘录入的学号进行比较
if(s.getId().equals(id)) {
index = x;
break;
}
}
if(index == -1) {
System.out.println("不好意思,你要修改的学号对应的学生信息不存在,请回去重新你的选择");
}else {
System.out.println("请输入学生新姓名:");
String name = sc.nextLine();
System.out.println("请输入学生新年龄:");
String age = sc.nextLine();
System.out.println("请输入学生新居住地:");
String address = sc.nextLine();
//创建学生对象
Student s = new Student();
s.setId(id);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//修改集合中的学生对象
list.set(index, s);
//给出提示
System.out.println("修改学生成功");
}
}
/*
* 删除学生的方法
* 删除学生的思路:键盘录入一个学号,到集合中去查找,看是否有学生使用的是该学号,如果有就删除该学生
*/
public static void deleteStudent(ArrayList<Student> list) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要删除的学生的学号:");
String id = sc.nextLine();
//我们必须给出学号不存在的时候的提示
//定义一个索引
int index = -1;
//遍历集合
for(int x=0; x<list.size(); x++) {
//获取到每一个学生对象
Student s = list.get(x);
//拿这个学生对象的学号和键盘录入的学号进行比较
if(s.getId().equals(id)) {
index = x;
break;
}
}
if(index == -1) {
System.out.println("不好意思,你要删除的学号对应的学生信息不存在,请回去重新你的选择");
}else {
list.remove(index);
System.out.println("删除学生成功");
}
}
//添加学生的方法
public static void addStudent(ArrayList<Student> list) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//为了让id能够被访问到,我们就把id定义在了循环的外面
String id;
//为了让代码能够回到这里,用循环
while(true) {
System.out.println("请输入学生学号:");
//String id = sc.nextLine();
id = sc.nextLine();
//判断学号有没有被人占用
//定义标记
boolean flag = false;
//遍历集合,得到每一个学生
for(int x=0; x<list.size(); x++) {
Student s = list.get(x);
//获取该学生的学号,和键盘录入的学号进行比较
if(s.getId().equals(id)) {
flag = true; //说明学号被占用了
break;
}
}
if(flag) {
System.out.println("你输入的学号已经被占用,请重新输入");
}else {
break; //结束循环
}
}
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
System.out.println("请输入学生年龄:");
String age = sc.nextLine();
System.out.println("请输入学生居住地:");
String address = sc.nextLine();
//创建学生对象
Student s = new Student();
s.setId(id);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//把学生对象作为元素添加到集合
list.add(s);
//给出提示
System.out.println("添加学生成功");
}
//查看所有学生
public static void findAllStudent(ArrayList<Student> list) {
//首先来判断集合中是否有数据,如果没有数据,就给出提示,并让该方法不继续往下执行
if(list.size() == 0) {
System.out.println("不好意思,目前没有学生信息可供查询,请回去重新选择你的操作");
return;
}
//\t 其实就是一个tab键的位置
System.out.println("学号\t\t姓名\t年龄\t居住地");
for(int x=0; x<list.size(); x++) {
Student s = list.get(x);
System.out.println(s.getId()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getAddress());
}
}
}
将第6天的随机点名的案例由之前简单的Person对象,重构为相对完整的Person对象并使用。
在全班同学中随机地打印出一名同学名字。
共三个步骤:
1.存储全班同学(Person对象)
2.打印全班同学每一个人的名字
3.在班级总人数范围内,随机产生一个随机数索引,查找该随机数索引所对应的同学(Person对象),并通过该对象访问name属性
将原来使用的简单Person类,封装为包装成员变量和成员方法的相对完整的Person类,并将所有访问属性的地方改为通过get/set方法访问。
/*
自定义类型 人类
属性
姓名 String
年龄 int
性别 String
身高 double
是否热爱java boolean
*/
public class Person {
// 姓名
String name;
// 年龄
int age;
// 性别
String sex;
// 身高
double height;
// 是否喜欢java
boolean isLoveJava;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public boolean isLoveJava() {
return isLoveJava;
}
public void setLoveJava(boolean isLoveJava) {
this.isLoveJava = isLoveJava;
}
}
/*
随机点名器
用集合存储所有同学
总览全班同学姓名
随机点名其中一人,打印到控制台
1.定义一个集合用来存储所有同学
导包
创建对象 存储的是Person
调用方法
2.向集合中添加人
3.遍历集合,依次获取每个人,打印每个人的名字
4.随机点名
生成一个最大不超过集合最大索引的随机数 0 - 集合最大索引的一个随机数
依据随机数得到集合中相对应的人,打印其名字
*/
//导入集合ArrayList
import java.util.ArrayList;
import java.util.Random;
public class RandomName
{
public static void main(String[] args)
{
//定义一个集合用来存储所有人
ArrayList<Person> list = new ArrayList<Person>();
//向集合中添加人 创建Person对象 将Person添加到集合中
Person p = new Person();
p.setName("柳岩");
Person p2 = new Person();
p2.setName("唐嫣");
Person p3 = new Person();
p3.setName("金莲");
list.add(p);
list.add(p2);
list.add(p3);
System.out.println("-----------------------");
//遍历集合,依次获取每个人,打印每个人的名字
for(int i = 0 ;i < list.size();i++){
Person thisP = list.get(i);
//调用getName方法 获取每个人的名字
System.out.println(thisP.getName());
}
System.out.println("-----------------------");
//随机点名
Random r = new Random();
//生成一个最大不超过集合最大索引的随机数 0 - 集合最大索引的一个随机数
int randomIndex = r.nextInt(list.size());
//依据随机数得到集合中相对应的人
Person person = list.get(randomIndex);
System.out.println("今天你答题:"+person.getName());
}
}
模拟真实购物逻辑,以上述图片为需求原型,根据不同购物物品完成购物小票内容打印到控制台。(简化项目逻辑,票脚部分只完成数据统计)
数据:
逻辑:
用户循环进行三个操作:
a) 涉及SE基础内容
变量定义:记录部分数据
集合的使用:用于存储多个完整数据
运算符的使用:计算变量
流程控制语句的使用:
方法封装:
由于代码量比较多,可以将输入购买数量、打印小票封装为方法使用
字符串/键盘录入:
打印小票完整过程均为字符串的拼写及打印,数量输入为键盘录入Scanner完成
b) 实现步骤
/*
* 定义商品项类:
* 名称,货号,单价,数量,计价单位,金额
*/
public class GoodsItem {
// 成员变量
private String name;
private String id;
private double price;
private int number;
private String unit;
private double money;
// 构造方法
public GoodsItem() {
}
public GoodsItem(String name, String id, double price, int number, String unit, double money) {
this.name = name;
this.id = id;
this.price = price;
this.number = number;
this.unit = unit;
this.money = money;
}
// getters/setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
public class ShoppingReceipt {
//成员位置定义集合,存储所有的商品项对象
static ArrayList<GoodsItem> data = new ArrayList<GoodsItem>();
}
public static void main(String[] args) {
//打印欢迎语句
System.out.println("欢迎使用超市管理系统!");
//main方法中添加 为集合准备数据
initData();
//定义方法,向成员位置的集合赋值
public static void initData() {
//创建多个商品项对象
GoodsItem sls = new GoodsItem("少林寺核桃", "090115", 15.5, 0, "个", 0);
GoodsItem shk = new GoodsItem("尚康饼干", "090027", 14.5, 0, "个", 0);
//将多个商品项对象放入集合中
data.add(sls);
data.add(shk);
}
使用for/while进行循环进行操作
使用switch给出操作选择:1输入购买数量2打印小票3退出
完成switch中三个case的逻辑
//使用死循环完成反复操作的逻辑
//for(;;) {}
while(true) {
//使用switch给出操作选择:1输入购买数量2打印小票3退出
//提示信息
System.out.println("请输入您要进行的操作:1输入购买数量 2打印小票 3退出");
//通过键盘录入得到数据
Scanner sc = new Scanner(System.in);
int optNumber = sc.nextInt();
//完成switch中三个case的逻辑
switch (optNumber) {
case 1:
//调用给所有数据的数量与金额赋值方法
enterNumber();
break;
case 2:
//调用打印购物小票的方法
printReceipt();
break;
case 3:
System.out.println("欢迎下次光临");
//退出程序
System.exit(0);
default:
System.out.println("请输入正确的数字!");
break;
}
}
运用方法封装功能:将1输入购买数量、2打印小票封装为独立方法,在case中调用,提高代码可读性。
/**
* 为所有的数据赋值数量与金额
*/
public static void enterNumber() {
//集合的遍历
for (int i = 0; i < data.size(); i++) {
//依次获取到集合中每一个元素
GoodsItem thisGoods = data.get(i);
//提示用户,输入该商品项的数量
//获取该商品项名称
String thisGoodsName = thisGoods.getName();
System.out.println("请输入"+thisGoodsName+"的购买数量");
//键盘录入接受商品数量
Scanner sc = new Scanner(System.in);
int thisGoodsNumber = sc.nextInt();
//根据数量计算金额 金额 = 单价 * 数量
double thisGoodsMoney = thisGoods.getPrice() * thisGoodsNumber;
//为该商品的数量与金额赋值
thisGoods.setNumber(thisGoodsNumber);
thisGoods.setMoney(thisGoodsMoney);
}
}
/**
* 定义打印小票方法
*/
private static void printReceipt() {
//static ArrayList<GoodsItem> data = new ArrayList<GoodsItem>();
//票头
System.out.println(" 欢 迎 光 临");
System.out.println("品名 售价 数量 单位 金额");
System.out.println("-------------------------------------------");
//票体
//定义变量,记录所有的商品数量
int totalNumber = 0;
//定义变量,记录所有的商品金额
double totalMoney = 0;
//便利集合
for (int i = 0; i < data.size(); i++) {
//依次获取每一个商品项
GoodsItem g = data.get(i);
//打印商品项
System.out.println(""+g.getName()+g.getId()+" "+g.getPrice()+" "+g.getNumber()+" "+g.getUnit()+" "+g.getMoney());
//累加数量与金额
totalNumber += g.getNumber();
totalMoney += g.getMoney();
}
System.out.println("-------------------------------------------");
//票脚
System.out.println("共"+data.size()+"项商品");
System.out.println("共"+totalNumber+"件商品");
System.out.println("共"+totalMoney+"元");
System.out.println();
}