大象进冰箱案例学习Java(一)
通过大象进冰箱案例学习Java面向对象思想第一版
我们这学期开始学Java语言,上课老师讲的有点快,所以总是跟不上老师!造成好多东西都不理解。学习Java时,有一个很经典的例子就是大象进冰箱,我学习时,总是不知道怎么写,很想去看一些比较完整的demo去学习一下 ,但总是找不到。今天花了一下午又重新看了下,感觉有点理解了,所以想把自己的代码写出来,虽然不太好,但是大家也可以参考一下。
最简单的类
如果大家学习这个例子,相信大家都已经知道什么是类了。所以我就直接开始了。
我们这个例子用到5个类,分别是:
- Elephant.java
- IceBox.java
- Person.java
- Action.java
- Client.java
下边我就把这些代码贴出来吧(其中有些是我在学习时老师让敲的注释,我没删,可能会有点用)
IceBox.java
package 第三章.例1;
public class IceBox {
private String name; //private表示私有,只能在本类中使用
double width,height;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IceBox(String name) {
super();
this.name = name;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public void open() {
System.out.println(this.name+"门被打开");
}
public void close() {
System.out.println(this.name+"门被关闭");
}
}
Elephant.java
package 第三章.例1;
public class Elephant { //现场有几个相关实体,就定义几个相关类,每个类都要有自己的任务,都要干事(方法function)
//导演,屏幕不相干,所以就不定义类
private double width,height; //方法中用到的 、本类的、某个对象的属性的数值,因为方法是处理数据的
//象牙有多长,腿多粗,什么基因跟enter没有关系,所以不定义
private IceBox aIceBox; //对象声明的方法,类名 对象名 ,跟int i;是一个意思;
//与局部变量不同的是;在方法外定义,可以穿透任何方法,进入任何方法
//局部变量只能在方法内部定义,必须赋值,而此处叫成员变量可以不赋值,有默认值。int 0;double 0.0
//boolean:false
private String name;
public Elephant(String name) {
super();
this.name = name;
}
public String getName() { //因为我们在这里声明的是private的变量,所以只能是通过set 和 get 方法来设置和获取变量的值
return name;
}
public void setName(String name) {
this.name = name;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {//方法的参数变量,用于方法中传参
this.width = width; //参数变量width是this.width = width; 中的=后面的width
} //this.width = width 中=左边的width是成员变量width
//双击this.width中的width会看到上面的两个width变成深色
//要给某个类的成员变量赋值,就要用这个类的对象调用成员方法set。比如此处,aElephant.getWidth(1.5);
//aElehant.getWidth() 就会变成1.5,this就是本类的一个对象的意思
//到哪去调用呢?到main()方法中去调用
public double getHeight() { //get方法被对象调用,最终变成一个值。比如:
return height; //get方法要有返回值,方法中要有return语句。
}
public void setHeight(double height) {//set方法被对象调用,将参数传入,将参数传给本类的对象
this.height = height; //参数变量的值,传给了成员变量
}
public IceBox getaIceBox() {
return aIceBox;
}
public void setaIceBox(IceBox aIceBox) {
this.aIceBox = aIceBox;
}
public void enter() {
if((width<aIceBox.width)&&(height<aIceBox.height)) {
System.out.println(this.name+"笨重地进入");
System.out.println(this.name+"的尺寸:");
System.out.println(width);
System.out.println(height);
System.out.println(aIceBox.getName()+"的尺寸:");
System.out.println(aIceBox.width);
System.out.println(aIceBox.height);
}
//变量3种:成员变量、参数变量、局部变量。作用:成员变量是对象的属性。参数变量为方法传参。局部 变量在方法中临时使用。
//声明位置:成员变量在所有的方法之外,参数变量在方法后面的括号中,局部变量在方法中。赋值:成员变量不比赋值,有默认值。
//参数变量在main()方法中传入数值。局部变量在方法中必须赋值。
}
}
Person.java
package 第三章.例1;
public class Person { //人的属性与大象进冰箱没有关系,所以不定义成员变量,只定义成员方法
private String name;
public Person(String name) {
super();
this.name = name;
}
public void pull() {//平常我们说的开门关门,那么开门和关门是定义在冰箱还是人类中呢?
//原则:开门 用到的尺寸属于哪个类,就定义在哪个类里面。这里属于冰箱,所以开关门的方法定义在冰箱中。而不是人这个类中。
//再比如:购物车中买两支钢笔,钢笔数量可以加1,但是钢笔的种类并不加1
System.out.println(this.name+"拉门");
}
public void push() {
System.out.println(this.name+"推门");
}
}
Action.java
package 第三章.例1;
public class Action {//剧本里有三个实体,所以三个实体类的变量在这里都要声明
//每个系统都要包括实体类,以及将众多实体类串起来
private Elephant aElephant; //注意:这里都是变量,不是对象
private IceBox aIceBox;
private Person aPerson;
//我认为难点就是在这声明的这个三个对象中,我之前搞不懂得就是在这里;
//首先声明出来三个对象型变量,因为访问修饰符设置的是private,所以我们还是需要用set 和 get 方法去设置这个值
private String name;
public Action(String name) { //用于在Client.java中为这个action设置名字
super();
this.name = name;
}
public Elephant getaElephant() {
return aElephant;
}
public void setaElephant(Elephant aElephant) {
this.aElephant = aElephant;
}
public IceBox getaIceBox() {
return aIceBox;
}
public void setaIceBox(IceBox aIceBox) {
this.aIceBox = aIceBox;
}
public Person getaPerson() {
return aPerson;
}
public void setaPerson(Person aPerson) {
this.aPerson = aPerson;
}
public void action() {
aPerson.pull();
aIceBox.open();
aElephant.enter();
aPerson.push();
aIceBox.close();
}
}
Client.java
学过编程的都知道程序的知道,一个程序的入口是Main函数,下面这个文件就是我们的客户端程序了
package 第三章.例1;
public class Client {//给main方法一个单独的类,作为 Java成 程序的入口,或客户端、测试
//客户端类中,main方法外不能写代码,只在main中写代码
//main方法的作用之一就是是给所有的成员变量赋值,比如用户名,密码
public static void main(String[] args) { //main+alt+/
//main方法中具体指各个实体,变量取值
//main方法先调用过程类Action,
// TODO Auto-generated method stub
Action aAction;
Elephant taiguoxiang;
IceBox xinfeibingxiang;
Person lurenjia;
aAction = new Action("路人甲");
//场景一:泰国大象,路人甲,新飞冰箱
taiguoxiang = new Elephant("泰国大象"); //new表示大象已经牵过来,在内存中已分配空间,默认值null已有
//如果没有带参数的构造方法。Java 默认给无参的构造方法,Elephant()
//之前我们没有定义,也没有出错,但一旦定义了带参数构造函数,系统不再
//默认给无参数的构造函数,此处构造方法再无参就会出错
xinfeibingxiang = new IceBox("新飞冰箱");//冰箱已放好
lurenjia = new Person("路人甲"); //拉冰箱门的人已准备好
//以上都是现实中,或在内存中已经存在的活生生对的对象,但和剧本中的对象没有关联
//Client类之外的类就是剧本、蓝图、规划图、计划书、抽象的、服务器类
//Client类中目前所有的成员变量和Action中的虽然同名的成员变量不是一回事
//谁建立的Client类中的成员变量和Action中的成员变量之间的关系?set
//那个类拥有这些成员变量,他的对象就调用set方法。Action类拥有aElephant
//就用aAction调用set方法,设置aElephant。
aAction.setaElephant(taiguoxiang); //双击setaElephant(),再右击 open declaratio
//程序自动转到Action类中本方法定义类
aAction.setaIceBox(xinfeibingxiang);
aAction.setaPerson(lurenjia);
taiguoxiang.setaIceBox(xinfeibingxiang);
taiguoxiang.setWidth(1.0);
taiguoxiang.setHeight(1.8);
xinfeibingxiang.setWidth(1.5);
xinfeibingxiang.setHeight(2.0);
aAction.action();
}
}
一些简单技巧
在使用编辑器时候,有很多简单的技巧,我就这次我们可能用的到,说一下了:
-
快速创建main函数
方法:先输入main,然后按Alt+/,选择第一个即可; -
快速输入System.out.println();
方法:在方法体内先输入sysout,然后再按Alt+/即可; -
快速创建 set/get 函数
方法:先在类体内设置好变量,然后点击菜单栏中 Source ,然后点击里面的Generate Getters and Setters…,弹出来的对话框,勾选上你想要用的变量即可。
在 大象进冰箱案例学习Java(二) 中是有关抽象类用实现大象进冰箱的例子。

本文通过经典的大象进冰箱案例,深入浅出地讲解Java面向对象编程思想,涉及类、对象、方法等核心概念,适合初学者理解并实践。
&spm=1001.2101.3001.5002&articleId=84113097&d=1&t=3&u=d50329916ca84948acb5cfabd61e662f)
971

被折叠的 条评论
为什么被折叠?



