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

news2024/11/28 2:53:37

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


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

文章目录

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


前言

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

这里我说明一下规则。
大概就是用电脑说出一个数字,玩家去猜,猜到了,有奖。
这里我们涉及到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) {



    }

}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ヾ(⌐ ■_■)— HTML-Emmet语法速查表

Emmet是一款文本编辑器/IDE的插件,用来快速生成复杂的HTML代码,只要掌握一些常用的语法(类似于CSS选择器),就可以减少重复编码的工作。 1.调用方法 Emmet使用Tab作为自动生成HTML代码的触发器。输入完生成HTML的缩写…

Qt-FFmpeg开发-视频播放(4)

Qt-FFmpeg开发-视频播放【软解码 OpenGL显示YUV420P图像】 文章目录Qt-FFmpeg开发-视频播放【软解码 OpenGL显示YUV420P图像】1、概述2、实现效果3、FFmpeg软解码流程4、主要代码4.1 解码代码4.2 OpenGL显示RGB图像代码5、完整源代码更多精彩内容👉个人内容分类汇…

图片如何转换为文字?这些软件可以实现

最近有小伙伴私信说,因为临近期末,老师上课的进度开始加快。他为了兼顾知识点能够当堂吸收,所以没有记笔记,而是将知识点都拍照下来,集中注意力上课。然而当他课后打算整理笔记却发现,自己原来拍了几十张图…

比较研究测井预测:遗传算法与神经网络(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

day071:网络编程(IP、端口、协议)、InetAddress类、UDP协议、TCP协议

目录 一、网络编程 1.网络编程三要素 2.IP地址 (1)IP地址(每台计算机指定的标识号) (2)类InetAddress:方便对IP地址获取和操作;此类表示Internet(IP)地址 3.端口&am…

LVS+Keepalived高可用群集

目录 一、keepalived简介 二、keepalived工作原理 三、LVS-DR模式keepalived 高可用集群部署 1、部署2台web服务器 2、部署2台负载调度器 四、总结 一、keepalived简介 Keepalived是通过vrrp 协议的实现高可用性,对网络比较了解的IT人,对这个技术应…

[操作系统笔记]调度与死锁杂项知识点

部分定义截取自书本 管态和目态 这说的是处理机的执行状态 管态又称为特权态,系统态,核心态。CPU在管态下可以执行指令系统的全集。如果程序处于管态,则该程序可以访问计算机的任何资源,它的资源访问权限不受限制,通常…

iOS16 中的 3 种新字体宽度样式

前言 在 iOS 16 中,Apple 引入了三种新的宽度样式字体到 SF 字体库。 Compressed Condensed Expend UIFont.Width Apple 引入了新的结构体 UIFont.Width,这代表了一种新的宽度样式。 目前已有的四种样式。 standard:我们总是使用的默认…

centos安装nacos

一、安装JDK环境和MySQL环境 jdk环境安装:centos安装jdk1.8_java-zh的博客-CSDN博客 MySQL环境安装:centos安装mysql5.7_java-zh的博客-CSDN博客 二、拉取nacos项目 GitHub主页:https://github.com/alibaba/nacos GitHub的Release下载页:https://…

ClickHouse教程 — 第一章 ClickHouse单机版安装

ClickHouse教程 — 第一章 ClickHouse单机版安装1 版本区别1.1 clickhouse-client-21.1.9.41以上版本1.2 clickhouse-client-21.1.9.41以下版本2 clickhouse-client-21.1.9.41以上版本2.1 下载2.2 解压安装2.3 启动2.4 clickhouse相关目录2.5 允许远程访问3 clickhouse-client-…

应用地球物理+AI:智能地球勘探

《地球物理人工之智能和信息前沿技术学术报告会》 主讲人:陆文凯 1. 地球物理学 地球科学的主要学科之一,是通过定量的物理方法(如:地震、重、磁、电、测井、地热和放射能等方法)研究地球以及寻找地球内部矿藏资源的一…

TD集群内存占用过高

1 TD简介 TDengine 是一款开源、云原生的时序数据库,专为物联网、工业互联网、金融、IT运维监控等场景设计并优化。它能让大量设备、数据采集器每天产生的高达 TB 甚至 PB级的数据得到高效实时的处理,对业务的运行状态进行实时的监测、预警,从…

pyinstaller打包记录|| 打包成功,含xgboost打包遇到的问题

文章目录1 requirements.txt2 项目介绍3 matplotlib的问题4 xgboost打包遇到的问题4.1 解决办法:5 总结流程5.1 打开命令行5.2 键入打包指令5.3 执行文件5.4 双击exe运行1 requirements.txt python3.6.15tensorflow-cpu2.2.0 netCDF41.5.6 Keras2.3.1 pandas1.0.3 …

盘点 | 云原生峰会重磅发布

11 月 5 日,2022 杭州云栖大会上,阿里巴巴研究员、阿里云智能云原生应用平台总经理丁宇在云原生峰会上发表主题演讲,提出云原生激活应用构建新范式。在分享中发布阿里云在云原生领域多款新产品与全新升级,持续引领行业云原生技术趋…

交通大数据应用场景——高速落地检

自11月11日进一步优化疫情防控二十条措施发布以来,国内各地针对核酸检测、人员管控等防控重点领域,陆续出台相关调整政策,进一步提高疫情防控的科学性、精准性、有效性。 “躺平”不可取,“躺赢”不可能,优化疫情防控…

【云原生 | Kubernetes 系列】--Gitops持续交付 ArgoCD自动同步策略

1. ArgoCD自动同步策略 自动同步策略允许ArgoCD在检测到GitRepo与实际状态之间存在差异时,自动启动同步操作. Prune Resource(自动修剪):在集群上某个资源在GitRepo中找不到对应的配置时,自动删除集群上的该资源 Self Heal(自愈): 因各种原因(如手动修改)集群上资源的实时状态…

艾美捷nickases-Cas9内切酶裂解试验展示

核酸内切酶(endonuclease)在核酸水解酶中,为可水解分子链内部磷酸二酯键生成寡核苷酸的酶,与核酸外切酶相对应。从对底物的特异性来看,可分为DNaseⅠ、DNaseⅡ等分解DNA的酶;RNase、RNaseT1等分解RNA的酶。…

ETF轮动+RSRS择时,加上卡曼滤波:年化48.41%,夏普比1.89

原创文章第112篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。 昨天我们设计了一个不错的策略:etf动量轮动大盘择时:年化30%的策略。ETF动量轮动RSRS择时,动量其实一直都有效,如何定义动量可…

java图形验证码到底是怎么生成的?

真正的大师,永远都怀着一颗学徒的心! 一、项目简介 java图形验证码到底是怎么生成的?支持中文、gif、算术等类型 二、实现功能 支持gradle方式的引入 支持maven方式引入 支持jar包下载 支持10种漂亮的内置字体,不依赖系统字体 支持输出…

Codeforces Round #835 (Div. 4) A~G

比赛链接&#xff1a;https://codeforces.com/contest/1760 A. Medium Number 题目大意&#xff1a; t组测试&#xff0c;每组给三个数求中位数。 代码&#xff1a; #include<bits/stdc.h> #define rep(i,a,b) for (register int ia;i<b;i) #define per(i,a,b) …