让我们进入面向对象的世界(二)
创始人
2024-02-08 02:27:55
0

让我们进入面向对象的世界(二)


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 让我们进入面向对象的世界(二)
  • 前言
  • 二.对象的操作
  • 三.让我们离对象村更进一步,进入面向对象封装的特性
  • 四 实例变量和局部变量之间的区别


前言

相信大家已经看到了我的第一篇文章,相信对面向对象有了一定初步的理解。
这里我为了带大家提前能够进入状态,我为大家准备了个小练习。
猜数字游戏大家都玩过吧。

这里我说明一下规则。
大概就是用电脑说出一个数字,玩家去猜,猜到了,有奖。
这里我们涉及到game 类 和player 对象

game产生介余0~9之间的随机数,而3个player对象会猜这个数字。
这里我们涉及的类是

Guessname.class
Player.class
GameLuancher.class

程序的逻辑是:
1.GameLuancher 这个类有main方法,是应用程序的入口。
2.main()中会创建Guess对象,并且调用startGame()方法。
3.startGame()方法是游戏的起点,
它会创建三个player,
然后挑选出要猜测的随机对象,它会要求player猜测并检查结果,过程会被列出来

类的设计如下:
在这里插入图片描述

看来上面的设计,你就会发现,我们在想一个问题的时候,是在想这里面有哪些对象,并且针对对象,设计相应的行为,我们思路就清晰了。
类的代码如下:

package Test5;public class GuessGame {//3个实例变量,分别表示三个player对象Player p1;Player p2;Player p3;public  void startGame(){//创建出player对象p1=new Player();p2=new Player();p3=new Player();//用三个变量保存是否猜中int guessp1=0;int guessp2=0;int guessp3=0;//声明三个变量来保存猜测的数字boolean p1isRight=false;boolean p2isRight=false;boolean p3isRight=false;int targetNumber=(int)(Math.random()*10);//产生谜底数字System.out.println("我认为这个数字应该是 0 到 10");while(true){System.out.println("要猜的数字是"+targetNumber);//用户开始猜数字p1.guess();p2.guess();p3.guess();//取出每个玩家所猜测的数字并将它列出guessp1=p1.number;System.out.println("玩家一 猜的数字是"+guessp1);guessp2=p2.number;System.out.println("玩家二 猜的数字是"+guessp2);guessp3=p3.number;System.out.println("玩家三 猜的数字是"+guessp3);//检测是否猜中if (guessp1 == targetNumber) {p1isRight =true;}if (guessp2 == targetNumber) {p2isRight =true;}if (guessp3 == targetNumber) {p3isRight =true;}if (p1isRight || p2isRight || p3isRight ) {System.out.println("我们赢了");System.out.println("第一个玩家是否胜利?"+p1isRight);System.out.println("第二个玩家是否胜利?"+p2isRight);System.out.println("第三个玩家是否胜利?"+p3isRight);System.out.println("游戏结束");break;}else {System.out.println("请继续猜下去");}}}}
package Test5;public class Player {int number=0;//要被猜的数字public  void guess(){number= (int)(Math.random() *10);System.out.println("这是我猜的数字"+number);}}
public class GameLauncher {public static void main(String[] args) {GuessGame guessGame=new GuessGame();guessGame.startGame();}
}

在这里插入图片描述

通过这里大家可以看到,我们运行程序的结果,很简单明了,是不是对面向对象的思想更加好奇了呢?
哈哈,别急,别急,我们下面还有个新概念,既然我们创建了对象,知道了怎么初始化对象,但我们具体怎么操作对象的呢?

二.对象的操作

事实上,我们通过对象的引用来操作对象,具体的话,我们来看下面和这个例子:

Dog dog =new Dog();
dog.name="旺财"
dog.wang();
/*
打印的结果嘛。当然是 旺财在汪汪叫!
*
/

这里事实上,我们是用圆点运算符加引用值,进行对象操作的。

这里就不得不又扯上创建一个对象是怎么样一个流程,大家有必要了解一下。
1.声明一个引用变量
2.创建对象
3.连接对象和引用

看文字或许有些生涩难懂,让我们看图说话

在这里插入图片描述

大致清楚了,对象的创建流程以后,我们来看一段代码,你们猜猜会输出什么。

   		Book book1=new Book();Book book2=new Book();System.out.println(b1);System.out.println(b2);

在这里插入图片描述

你可以看出,我用打印语句去打印出来的地址是不相同的,为什么呢?
从图片来看,这俩个引用,其实是指向了不同的对象,所以地址不同。
在这里插入图片描述
我们在进一步往下看。
假如,这个时候,我们脑洞大开
声明新的Book引用变量
但不创建新的Book对象而将变量c的值赋值给变量d。
这代表“将c的字节组合拷贝给变量d。

Book book1=new Book();
Book book2=new Book();
Book book3=book1;

这时候的图又是这样的:

在这里插入图片描述

接下来我们做一个操作,就是更改对象的绑定,来访问对象,看看会发生什么

  		Book b1=new Book();Book b2=new Book();b1=b2;b1.name="七龙珠";System.out.println(b1.name);System.out.println(b2.name);System.out.println(b1);System.out.println(b2);

运行结果如下:
在这里插入图片描述

如果还是没有明白为什么会发生这样的事情,我们再来画个图理解理解。
在这里插入图片描述

当然我们对对象也可以让它的引用不指向任何东西。
就按照以下操作即可:

  Book book1=new Book();Book book2=new Book();b2=null;

当我们对象引用为null时,它就不指向任何的对象哦。

到了这里我相信你对对象的概念又更加深刻了。

三.让我们离对象村更进一步,进入面向对象封装的特性

有句话说得好不封装就会难堪,怎么个难堪法呢,就好比你的袜子破了个洞,结果全世界都知道了。是不是尴尬死。
换到我们程序语言来说,就好比有如下的程序

public class Book {String name;String price;public Book(){}public Book(String name, String price) {this.name = name;this.price = price;}
}public class TestBook {public static void main(String[] args) {Book b1=new Book();Book b2=new Book();b2.name="七龙珠";System.out.println(b2.name);       }
}

以上的程序的话,我们就可以随意去修改图书的值,还可以随意去访问。可能这还是不够严重,你觉得,打个比方,你的私人空间,谁都可以来留下印记,你说可怕不可怕。

因此我们面向对象引入了封装的概念。
大家可以了解一下封装的基本原则。
1.将你的实例变量标记成私有的。
2.并且提供私有的getter和setter方法来控制存取动作。

具体怎么封装,我们来看一个例子,你就明白了。

package Test8;public class Dog {private int Size;public int getSize() {return Size;}public void setSize(int size) {Size = size;}public void  bark(){if (Size > 60) {System.out.println("哦哦哦");}else {System.out.println("滴滴滴");}}
}class GoodDogTestDrive{public static void main(String[] args) {Dog one=new Dog();one.setSize(70);Dog two=new Dog();two.setSize(10);one.bark();two.bark();}}

运行结果
在这里插入图片描述

看懂了封装,我们来进入一个小插曲,就是我们一直说的进入下一个困惑点。

四 实例变量和局部变量之间的区别

我们用俩句简单话理解。
实例变量是声明在类中的。
局部变量是声明在方法中的。

记住这俩句话,你就掌握了Java中局部变量和实例变量的区别。

public class Test {class Dog {//实例变量String name;String ID;}public void Doing(){int a;//这是局部变量int b;}public static void main(String[] args) {}}

这里说实话,还有一条可注意的,局部变量在使用之前,必须初始化,你强行使用的话,就会报错。
在这里插入图片描述

大家好!今天的面向对象之旅,就结束了,接连的几天我们都会在面向对象的世界里遨游。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...