面向对象的具体讲解

博客围绕Java面向对象编程展开,介绍了OOA、OOD、OOAD、OOP等概念,阐述了对象和类的区别,以及创建类、对象和访问对象的方法。还对深海杀手项目进行分析,识别对象、分配职责,最后提到创建GameWorld类及用构造方法解决对象初始化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象

1. OO 面向对象(Object Oriented)
OOA:面向对象的分析
OOD:面向对象的设计
OOAD:面向对象分析和设计(二合一 ,开发效率更高)
OOP:面向对象编程!(重点)

本阶段项目会大量用到我们之前所学习的基础语法!所以多练 1.为了写代码不报错 2.为了更好学习面向对象

对象和类

类:抽象的不具体,在程序中表示的是模板,泛指一类事物的代表。
对象:具体的,真实存在的!能看的到的!

分析项目的对象:
一个战舰,一堆深水炸弹,一堆侦察潜艇,一堆水雷潜艇,一堆鱼雷潜艇,一堆水雷,一堆鱼雷。
(ObserverSubmarine)侦察潜艇
举例:
OS1 -------- x y width height speed
OS2 -------- x y width height speed
OS3 -------- x y width height speed
OS4 -------- x y width height speed

OS100 -------- x y width height speed
100个侦察潜艇 就要100个对应的数据(代码冗余)
1.使用类来解决:
类 对象
月饼模板 月饼
如何创建类,对象,访问对象的内容。
以生活的角度考虑:先有类再有对象!
以编程的角度考虑:先有对象再有类!
1.如何创建类
类中包含对象所共有的数据/属性 ------------------变量
类中包含对象所共有的行为/方法 ------------------方法

class Person{//人类模板
    //数据(属性/变量)
    int age;//年龄
    String name;//名字
    char  sex;//性别
    //行为(方法)
    void play(){//玩的行为
        
    }
    void sleep(){//睡觉的行为
        
    }   
    void eat(){//吃的行为
        
    }
}
-----------------------------------------------------------
class  car{//车类
    //变量
    String color;//颜色
    String type;//型号
    double price;//价格
    //行为
    void run(){//向前运动
        
    }
    void back(){//向后运动
        
    }
    void stop(){//停车
        
    }
}
-----------------------------------------------------------
class ObserverSubmarine{ //侦察潜艇类  代表所有侦察潜艇对象
    //所有侦察对象所共有的(数据)变量
    int x;
    int y;
    int width;
    int heiht;
    int speed;
    //所有侦察对象所共有的(行为)方法
    void step(){
        
    }
}

成员变量:声明在类的里面方法的外面的变量,称之为成员变量,作用域是在整个类体中!
局部变量:声明在方法中的变量叫做局部变量,作用域,只在声明的那个方法里面!

package oo.day01;/**
 * 学生类:代表所有学生对象的模板
 * 类中存放所有学生对象共有的属性和行为
 */
public class Student {
    //属性
    String name;//名字   ----成员变量
    int age;//年龄
    int stuID;//学号//------------------------
    //行为
    void study() {//学习
        System.out.println(name + "在学习....");
    }void sayHi() {//打招呼
        System.out.println("大家好,我叫" + name + ",今年已经" + age + "岁了!我的学号:"+stuID);
    }
}

自定义的类也是一种数据类型,是引用数据类型!

2.如何创建对象
//创建对象的语法Scanner s = new Scanner(); //创建一个扫描器对象
​
数据类型  变量名   赋值号  创建一个学生对象
Student    s1      =    new Student();//创建一个学生对象 将对象存到s1这个变量中。Student    zs      =    new Student();//创建一个学生对象 将对象存到zs这个变量中。Student    ls      =    new Student();//创建一个学生对象 将对象存到ls这个变量中。
3.访问对象
package oo.day01;/**
 * 学生的测试类:
 */
public class StudentTest {
    public static void main(String[] args) {
        //创建一个学生类对象
        //类型    变量名    =   创建对象的语法(new 类型())
        Student  zs  = new Student();//创建一个学生对象 zs
        //zs这个变量能打点调用什么,取决于当前zs这个变量类型有什么
        zs.name = "张三";
        zs.age = 18;
        zs.stuID = 1001;
        zs.study();  //调用zs这个对象的学习方法
        zs.sayHi();  //调用zs这个对象的打招呼方法
        //----------------------------------
        Student ls = new Student();
        ls.name = "李四";
        ls.age = 30;
        ls.stuID = 2001;
        ls.study();//调用ls这个对象的学习方法!
        ls.sayHi();//调用ls这个对象的打招呼的方法!
        
        //总结:哪个对象打点调用方法,那么方法里面用的数据就是那个对象的!
    }
}

2.项目需求

深海杀手项目分析:

(1)对象分析(识别对象):战舰、深水炸弹、侦察潜艇(银色的)、水雷潜艇(绿色的)、鱼雷潜艇(金黄色的)、水雷、鱼雷
(2)对象职责(分配职责):战舰(玩家):发射深水炸弹。
                     2.1深水炸弹:可以攻击(侦察潜艇、水雷潜艇、鱼雷潜艇),若打到时
                                1.被打倒的潜艇消失,深水炸弹消失。
                                2.打到侦察潜艇玩家+10分,打到鱼雷潜艇玩家+40分  ---加分
                                3.打到水雷潜艇+1条命                        ---加命
               水雷潜艇:发射水雷,水雷可以攻击战舰,若打到时
                                1.水雷需要消失
                                2.战舰减一条命(命数为0时,游戏结束)
               鱼雷潜艇:发射鱼雷,鱼雷可以攻击战舰,若打到时
                                1.鱼雷需要消失
                                2.战舰减一条命(命数为0时,游戏结束)
(3)建立交互…


​2.1在src下创建一个包:cn.aries.submarine
创建7个类:

战舰类:---------------------------Battleship
                                 属性: x  y   width   height  speed  life()
                                 行为: void step(){ 
                                            //通过键盘移动
                                       }
深水炸弹类:------------------------Bomb
                                 属性: x  y   width   height  speed  
                                 行为: void step(){ 
                                            //y向下运动...
                                       }
侦察潜艇类:------------------------ObserverSubmarine
                                 属性: x  y   width   height  speed  
                                 行为: void step(){ 
                                            //x向右运动
                                       }
鱼雷潜艇类:------------------------TorpedoSubmarine
                                 属性: x  y   width   height  speed  
                                 行为: void step(){ 
                                            //x向右运动
                                       }
水雷潜艇类:------------------------MineSubmarine
                                 属性: x  y   width   height  speed 
                                 行为: void step(){ 
                                            //x向右运动
                                       }
水雷类:---------------------------Mine
                                 属性: x  y   width   height  speed  
                                 行为: void step(){ 
                                            //y向上运动
                                       }
鱼雷类:---------------------------Torpedo
                                 属性: x  y   width   height  speed  
                                 行为: void step(){ 
                                            //y向上运动
                                       }

​创建GameWorld类

package cn.aries.submarine;/**
 * 游戏入口类 : 测试游戏运行
 */
public class GameWorld {
    Battleship ship;//声明一个战舰类型的变量
    Bomb bomb; //声明一个深水炸弹类型的变量
    MineSubmarine ms;//声明一个水雷潜艇类型的变量
    TorpedoSubmarine ts;//声明一个鱼雷潜艇类型的变量
    ObserverSubmarine os;//声明一个侦察潜艇类型的变量
    ObserverSubmarine os1;
    Mine m;//声明一个水雷类型的变量
    Torpedo t;//声明一个鱼雷类型的变量/**
     * 用于创建对象
     */
    void action() {
        ship = new Battleship();
        ship.x = 100;
        ship.y = 200;
        ship.width = 40;
        ship.height = 30;
        ship.speed = 10;
​
        bomb = new Bomb();
        bomb.x = 200;
        bomb.y = 300;
        bomb.width = 10;
        bomb.height = 11;
        bomb.speed = 2;
​
        ms = new MineSubmarine();
        ms.x = 200;
        ms.y = 300;
        ms.width = 10;
        ms.height = 11;
        ms.speed = 2;
​
        ts = new TorpedoSubmarine();
        ts.x = 200;
        ts.y = 300;
        ts.width = 10;
        ts.height = 11;
        ts.speed = 2;
​
        os = new ObserverSubmarine();//创建侦察潜艇对象 并将对象赋值给 os
        os.x = 200;
        os.y = 300;
        os.width = 10;
        os.height = 11;
        os.speed = 2;
        os1 = new ObserverSubmarine();//创建侦察潜艇对象 并将对象赋值给 os
        os1.x = 200;
        os1.y = 300;
        os1.width = 10;
        os1.height = 11;
        os1.speed = 2;
​
​
​
        m = new Mine();
        m.x = 200;
        m.y = 300;
        m.width = 10;
        m.height = 11;
        m.speed = 2;
​
        t = new Torpedo();
        t.x = 200;
        t.y = 300;
        t.width = 10;
        t.height = 11;
        t.speed = 2;
    }public static void main(String[] args) {
        GameWorld gw = new GameWorld();
        gw.action();//调用action方法进行创建各类对象
    }
}/**
 *       1.为什么要将各类的变量设计到main方法的外面?
 *          答:作用域如果只在main中,只能在main中访问,不符合我们后续的设计需求。
 *       2.为什么要单独创建action方法来进行创建对象
 *          答:因为main方法是static方法,我们如果直接使用类的成员变量在main中是
 *          无法访问的,所有需要单独定义一个方法来进行创建对象并测试。
 *       3.为什么要先创建GameWorld类对象 再调用action方法
 *          答:因为main是static的,在main中是无法直接调用action方法的,那么方法
 *             可以通过对象的形式进行调用,所有在main创建类对象并调用action方法
 *
 *             关于static(静态)后续会讲....
 */

问题:在action中,初始化赋值对象的操作特别麻烦,每创建一个对象,都要依次对对象的属性初始化赋值。
解决: 我们可以通过构造方法来解决创建对象初始化特别麻烦的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值