猫抓老鼠-Java面向对象特点梳理

我们先设计一个猫抓老鼠的小游戏:

⊙猫和老鼠都有名字和体重两种属性,猫有抓老鼠的方法,对应的老鼠则有逃跑的方法。

⊙首先游戏的结果是猫抓住了老鼠或者老鼠逃跑了,对于这两种情况,我们用体重来区分,若猫的体重大于或等于老鼠的体重,则猫可实现抓住老鼠的方法,若猫的体重小于老鼠的体重,则老鼠实现了逃跑的方法。

分析一下,第一步我们需要建立两个类:Cat、Mouse;并且分别声明其各自拥有的方法:

 //Cat.java
package Testprogramming //打包语句,将Cat类存于TestProgramming包中随后解释其作用;
Public class Cat{
    public String name;
    public int weight;
    Cat(){
    //注意为了不至于在创建Cat类的实例化对象的时候出现错误,我们最好写一个空的构造方法
    //若没有它则Cat cat=new Cat();语句会报错!至于猫的属性,可以用相应的get/set方法获得
        }
    Cat(String name,int weight){
        this.name=name;
        this.weight=weight;    
        }
    //下面补上相应的get/set方法
    public String getName(){
        return name;
        }
    public void setName(String name){
        this.name    
        }
    public int getWeight(){
        return weight;
        }
    publuc void setWeight(int weight){
        this.weight;
        }
    //重写Object类的toString方法,以得到猫的信息
    public String toString(){
        return "Cat [名字=" + name + ", 体重=" + weight + "]";
        } 
    //最后声明猫抓老鼠的方法,因为猫抓住的是老鼠这一类动物,所以返回值类型应该是个Mouse类
    public Mouse catchMouse(Mouse mouse){
        return mouse
        }
}

//Mouse类的构成和Cat类基本相同
//Mouse.java
package Testprogramming
public class Mouse{
    public String name;
    public int weight;
    Mouse(){
    
        }
    Mouse(String name,int weight){
        this.name=name;
        this.weight=weight;
        }
      public String getName(){
        return name;
        }
    public void setName(String name){
        this.name    
        }
    public int getWeight(){
        return weight;
        }
    publuc void setWeight(int weight){
        this.weight;
        }
    public String toString(){
        return "Mouse [名字=" + name + ", 体重=" + weight + "]"
        } 
    public Cat escapeCat(Cat cat){
            return cat;
        }
        //若猫的体重小于老鼠的体重,则老鼠可以实现逃跑的方法
    public static void inform(boolean b){
		if(b==false){
		System.out.println("猫抓住了老鼠");
		}else{
		System.out.println("猫抓老鼠游戏中,老鼠体重超标,猫输了游戏");

		}
        
}

下面我们编写测试类,实例化一下Cat和Mouse类

//Test_Cat_Mouse.java
package Testprogramming
public class Test_Cat_Mouse{
    public static void main(String[] args){
    String string1,string2;
    boolean boolean;
    //首先实例化一个Cat、Mouse
    Cat catTom=new Cat("Tom",50);
    Mouse mouseLisa=new Mouse("Lisa",40);
    if(!((bool=mouseLisa.getWeight()==catTom.getWeight())
                &&(bool=mouseLisa.getWeight()<=catTom.getWeight()))){
	catTom.catchMouse(mouseLisa);
	System.out.println("猫"+catTom+"抓住了"+mouseLisa+"老鼠");

    }else{
         mouseLisa.escapeCat(catTom);   
         System.out.println("老鼠"+mouseLisa+"逃脱了"+"猫"+mouseLisa+"的捕捉");        
        }
    string1=catTom.toString();
    string2=mouseLisa.toString();
    
    }

}

以上就是我们猫抓老鼠小游戏的实现,我们由此可以回顾一下,Java面向对象编程的特点有三个,分别是:封装(Eccapsulation)、继承(Inheritance)、多态(Ploymorphism);

封装:类的使用者不需要知道类是如何实现的,而实现的过程经过封装,用户只需知道如何使用

包括两种<1>打包(package PackageName)

<2>访问权限:public/default/protected/private

继承:在已有类的基础上拓展属性和方法的能力用关键字extends实现

多态:不同对象面对同一种行为表现出不同的形式

了解了封装的特点之后,我们可以对前面的例子加以分析,如封装:我们可以将Cat、Mouse类以及测试类存到同一个包里(package TestProgramming),此时default以及protected权限就与最大权限public相当,但对于最小权限private,其修饰的成员只能在本类中被访问。

对于继承,我们先总体的看一下,因为Cat类和Mouse类都拥有相同的属性name和weight,而且猫和老鼠本身就是动物,也就是说他俩都是动物的一种,而且还拥有相同的属性,此时我们即可建立一个动物类Animal,在Animal类中定义Cat类和Mouse类的相同属性name、weight;当Cat和Mouse继承了Animal类时,也就同时拥有了name、weight属性;这是一种改进,同时也是一种优化。代码如下:

public class Animal{
    public String name;
    public int weight;
    Animal(){
    //后面我们会说一下子类中super关键字出现时的几种可能情况
    }
    Animal(String name,int weight){
        this.name=name;
        this.weight=weight;
    }
    //写到这里就可以了,因为建立Animal类的目的就是得到它的两个属性;
 }
  //下面是修改后的部分Cat类代码,Mouse类与之基本相同,故写Cat一参考
                                             | 
 public class Cat extends Animal{            | public class Cat extends Animal{
     Cat(){                                  | Cat(){
                                             |       
     }                                       |         }
     Cat(String name,int weight){            |  Cat(String name,int weight){
         super();//调用父类无参数的构造方法  |    super("catTom",50);//调父类有参构造方法
         this.name=name;                     |        }
         this.weight=weight;                 |    }
                                             |    
     }                                       | 
 }                                           | 
 //以上两种实现都可以,主要是要区分清楚this与super的使用规范,后面会详细说明

在继承这块我们需要注意的无非就是this与super的用法以及方法的重写与重载,这两方面下一篇博文里会详细说明;我们接着看多态这一部分

对于多态:我们仍然在本例说明

//我们重新写一个测试类
//Test_Cat_Mouse.java
package Testprogramming
public class Test_Cat_Mouse{
    public static void main(String[] args){
    String string1,string2,string3,string4;
    boolean boolean;
    //保留此前的实例加以区别
    Cat catTom1=new Cat("Tom",50);
    Mouse mouseLisa1=new Mouse("Lisa",40);
    //利用父类句柄,创建子类对象
    Animal catTom2=new Cat("Tom",50);      //向上转型,即子类对象转为父类对象    
    Animal mouseLisa2=new Mouse("Lisa",40);//向上转型,即子类对象转为父类对象
    
    if(!((bool=mouseLisa.getWeight()==catTom.getWeight())
                &&(bool=mouseLisa.getWeight()<=catTom.getWeight()))){
	catTom1.catchMouse(mouseLisa);
	System.out.println("猫"+catTom+"抓住了"+mouseLisa+"老鼠");

    }else{
         mouseLisa1.escapeCat(catTom);   
         System.out.println("老鼠"+mouseLisa+"逃脱了"+"猫"+mouseLisa+"的捕捉");        
        }
        //
     if(!((bool=mouseLisa.getWeight()<=catTom.getWeight()))){
	catTom2.catchMouse(mouseLisa);//报错
	System.out.println("猫"+catTom+"抓住了"+mouseLisa+"老鼠");

    }else{
         mouseLisa2.escapeCat(catTom);  //报错 
         System.out.println("老鼠"+mouseLisa+"逃脱了"+"猫"+mouseLisa+"的捕捉");        
        }
    string1=catTom.toString();
    string2=mouseLisa.toString();
    string3=catTom.toString()
    string4=mouseLisa.toString()
    
    }

}
    此时我们会发现,Animal句柄创建的Cat以及Mouse对象无法访问其各自拥有的方法,而原因正是此时这个对象属于父类Animal,而不再是子类Cat以及Mouse创建的了所以无法引用,要解决此类问题,就需要向下转型,即把父类对象转为子类对象;代码如下:
    Animal animal=new Cat("catTom",50);
    Cat catTom=(Cat)animal;//此时catTom就可以调用Cat类的catchMouse()方法了

总结:面向对象的三个特点封装、继承、多态在编程中时刻体现,这是基础也是细节,需要仔细理解这

三者之间的区别与联系。

时间: 2024-10-12 12:21:38

猫抓老鼠-Java面向对象特点梳理的相关文章

UVALive 7308 Tom and Jerry 猫抓老鼠 物理题

题目链接: 就是一个老鼠在环上一速度v开始绕环走,一只猫从圆心出发,任意时刻圆心,猫,老鼠三者在一条直线上,且速度也是v,求多久后猫抓到老鼠. #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <iostream> #include <cmath> #include <vector> #define

猫抓老鼠

题目描述 老鼠被猫抓去坐牢了,所在的这个监狱是一个N * M (N, M <= 200)的矩形,监狱中由一些墙,路,警卫组成 . 老鼠的朋友想要救出它,而任务是接近老鼠.我们假设拯救老鼠的任务是到达老鼠所在的位置,上,下,左,右的移动都需要花费1个单位的时间,杀死守卫也需要花费1个单位的时间,而我们需要杀死通过的所有守卫. 现在,你需要以最小的时间去接近老鼠(我们只能够以上下左右的方式到达相邻的位置) 输入 第一行输入两个整数 N 和 M. N为行数,M为列数,"."代表路,&q

Java面向对象大致梳理

面向对象思想. 面向对象思想概述: Java设计语言面向对象: Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下, 使用Java语言去设计.开发计算机程序. 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为.面 向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征.行为特征抽象出来,描述成计算 机事件的设计思想. 它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去 操作实现. 类和

25.猫抓老鼠

这题进来,看源码,没发现什么: 输入123,抓包提交发现了结果: base64解码发现: 当我们输入解码后的结果发现错误....一脸蒙..然后尝试把加密的放进去:

一起学 Java 面向对象(二)

一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数只有被调用才会被执行:3> 对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写,系统会帮你自动加上:4> 函数中只能调用函数,不可以在函数内部定义函数. 修饰符 返回值类型 方法名(参数类型 形式参数1,参数类型 形式参数2,..

JAVA面向对象编程三大特性------封装、继承、多态

一.封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系.系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互.也就是说用户是无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象. 对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以

java面向对象周测带答案

java面向对象周测带答案 一.简答题(每题5分,共计40分)1.什么是类?什么是对象?类与对象的关系是什么? 类本质上就是分类的意思,也就是具有相同共性的一类事物的抽象描述.类就是一种用户可以自定义的引用数据类型,用于包装描述属性的成员变量,和用于描述行为的成员方法,换句话说,类可以用于描述多个不同类型的数据.类是一种抽象的概念,用于描述对象创建的模板,而对象是客观存在的实体,本质上就是内存空间中的一块区域,对象的数据结构取决于类. 2.请写出类.属性.行为的定义格式,以及引用和对象的定义格式

JAVA面向对象-----super关键字

JAVA面向对象-–super关键字 1:定义Father(父类)类 1:成员变量int x=1; 2:构造方法无参的和有参的,有输出语句 2:定义Son类extends Father类 1:成员变量int y=1; 2:构造方法无参和有参的.有输出语句this.y=y+x; 3:创建Son类对象 Son son=new Son(3); System.out.println(son.y); //4 class Father { int x = 1; Father() { System.out.p

第5篇-JAVA面向对象Ⅰ

第5篇-JAVA面向对象Ⅰ 每篇一句 :面向对象面向君,不负代码不负卿 初学心得: 代码虐我千百遍,我待代码如初恋 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-03| JAVA面向对象 Ⅰ] 1.JAVA作为一种面向对象语言,具有以下基本概念: ● 多态 ● 继承 ● 封装 ● 抽象 ● 类 ● 对象 ● 实例 ● 方法 ● 重载 2.面向对象 什么是面向对象?: 面向对象是一种编程思想 通俗的说:面向对象是一种思考问题的思维方式 为什么使用面向对象以及它的作用 计算机语