Java 游戏开发:关于Java面向对象的知识(七)

Java 游戏开发:关于Java面向对象的知识(六)

包 与 导包

目前我们的代码都是在同一个文件夹下的,现在我们姑且叫这个文件夹是src包 有一个问题 当我们编写大量的程序的时候 将所有的java文件放在同一个目录下面的确感觉乱糟糟的,比如我开发一款游戏 我将操作游戏的 游戏物品的 游戏人物的 游戏数据的 等等的 java 文件全部放在同一个目录下这的确有点太乱了~
所以我们可以将关于插件的代码放在一个pulgin的目录下面 将游戏人物的类 放在 chara 目录下面,这样看起来就不显得乱了
对java代码 进行分类 就需要使用到包这个东西了就像是操作系统维护文件使用的是目录 java对代码进行的管理就是包
在这里插入图片描述取包名也有讲究 一般是网站的URL的反转,比如你在写www.baidu.com的后端 那你取的包名就是 com.baidu.www
在操作系统中 创建一个包 那么就会在创建包的目录下 以.为分隔去文件夹的名称
在这里插入图片描述创建好了包之后,在包内部创建一个java文件

package sample.chara;
public class Person {
}

发现多了一串package sample.chara; 这就是包的申明
在代码使用 package + 包名 可以提醒JVM 本java代码 从属与 某个包

如何咋同一个项目里使用两个不同包的文件

使用import可以进行导包

package sample.game;
// 包的申明

import sample.chara.Person; 
// 使用sample.chara的person类

public class gamePlugin {
    Person a = new Person();
}

当然你可以使用通配符导包

package sample.game;
// 包的申明

import sample.chara.*; 
// 使用sample.chara的全部的类

public class gamePlugin {
    Person a = new Person();
}

当然你在同一个包下面就可以不导包了
有一个包 你可以不用导入 就可以使用了那就是 java.lang
java.lang这个包你可以不明确导入就可以使用了 大名鼎鼎的String类 System.out.print 就出自于这个包里面

继承

简答的继承

程序里面的继承可以理解成

子类可以拥有父类中除了私有成员外的所有的内容

就好比一个父亲与一个儿子,父亲有的房子啊 车子啊都可以给儿子继承 因为这是继承的关系 但是父亲的妻子不能分享给儿子使用 因为这个是私有的成员
我们可以这么理解,当自然语言可以理解成:

x是一种y的

那么x就是y的子类
打个比方 黑熊精是一种妖怪 那么 黑熊精就是妖怪的子类 杨老师是老师 那么杨老师就是老师的子类

我们先来创建一个父类

public class black_beer_monster extends YaoGuai {
    // 黑熊怪 继承了 YaoGuai 父类
    public static void main(String[] args) {
        black_beer_monster m1 = new black_beer_monster();
        m1.eat_person();
        // 黑熊怪 继承了 父类妖怪 的 吃人 方法
        // m1._lover(); 错误代码
        // 无法继承父类的私有变量
    }
}

我们创建了一个 妖怪的父类
黑熊精是一种妖怪 可得:黑熊精类是妖怪的子类

public class black_beer_monster extends YaoGuai {
    // 黑熊怪 继承了 YaoGuai 父类
    public static void main(String[] args) {
        black_beer_monster m1 = new black_beer_monster();
        m1.eat_person();
        // 黑熊怪 继承了 父类妖怪 的 吃人 方法
    }
}

所以实现子类的继承很简单:在类名后面加上extends + 父类名称即可
你自己写个学生父类 , 然后创建一个学生XXX 继承这个学生父类代码自己先写写 我会把代码放在最后 看看你写对了没有

作用 : 简化代码的开发

你在开发游戏的时候 每个人物都有 扣血 移动 死亡 等等的功能,你在开发每个人物的时候不可能吧把这些代码重复的写个几十遍 否则就造成了代码的冗余

所以我们可以创建一个父类 这个父类有 这些重复无比的代码部分 你只需要根据每个人物不同的特性进行开发就是了。

super关键字

变量的查找顺序
我们先来看看这几个类

父类:

package sample;

public class HERO {
    String _name = "英雄";

}

子类

package sample;

public class monkey_king extends HERO{
    String _name = "孙悟空";
    void eat(){
        System.out.print(this._name+"在吃桃子");
        //
    }

    public static void main(String[] args) {
        monkey_king a = new monkey_king();
        a.eat();
        //孙悟空在吃桃子

    }
}

我们创建了两个类 一个是父类:HERO 一个是子类:monkey_king 我们在父类中创建一个字段 _name 相同的子类就会去继承这个变量 但是monkey_king 却又在本身内部创建一个与父类同名的字段 现在 monkey_king 就有两个 _name 变量了 我们创建以个方法来打印 _name 发现输出的结果是:

孙悟空在吃桃子

由此可见 如果使用某个变量 JVM会先在 子类 内部去查找 找不到 就在 父类 身上去查找 父类找不到 就在 父类的父类 查找 以此类推…

这就好比 买东西 发现自己身上没钱了 就去找爸爸 爸爸也没钱 就去找爷爷 爷爷没钱 去找 祖爷…

这就是常见的深度优先算法继承 与其对应的是 广度优先算法继承 那个算法就是 爸爸不行 再找另一个爸爸 但是java不支持多继承 这种方法就相当于对java无用了

子类中使用父类成员

现在我有个需求 我虽然在 monkey_king 内部 自己单独的创建了一个 _name 变量 但是我现在依旧像使用父类的 _name 字段 怎么实现?

这个时候我们就需要使用到super这个关键字了:
super的作用就是使用父类中的内容的

// 父类还是HERO 现在我们再写写monkey_king类
package sample;

public class monkey_king extends HERO {
    String _name = "孙悟空";
    void eat(){
        System.out.println(this._name+"在吃桃子");
        System.out.println("该类的父类的_name值是:"+super._name);
    }

    public static void main(String[] args) {
        monkey_king a = new monkey_king();
        a.eat();
        //孙悟空在吃桃子

    }
}

输出的结果就是:

孙悟空在吃桃子
该类的父类的_name值是:英雄

所以我们可以总结一下

super: 表示父类中的内容
this: 表示自己类中的内容

我们可以使用 super 与 this 来区分 父类子类中重名的内容

子类与父类的创建过程

在创建子类的时候 JVM 会先创建父类的对象 然后在创建子类的对象
我们对之前的代码先进行升级:

子类:

package sample;

public class monkey_king extends HERO {
    String _name = "孙悟空";
    void eat(){
        System.out.println(this._name+"在吃桃子");
        System.out.println("该类的父类的_name值是:"+super._name);
    }
    monkey_king(){
        
        System.out.println("monkey_king创建了新的实例");
    }
    public static void main(String[] args) {
        monkey_king a = new monkey_king();
        a.eat();
        //孙悟空在吃桃子

    }

}

父类:

package sample;

public class HERO {
    String _name = "英雄";
    HERO(){
        System.out.println("英雄类创建了新的实例");
    }

}

输出的结果:

在这里插入图片描述

但是,这并不意味着JVM先调用父类的方法 在调用子类的方法,而是在调用子类的构造器的时候JVM在子类的构造方法最开始隐式插入了一段调用父类的构造方法的代码这段代码就是super()
在子类的构造方法的第一行 默认调用父类 的构造方法 也就是super()
如果父类的构造方法只有有参数的构造器的时候,我们就必须手动的添加super() 加上参数

小结

  • super 的作用可以获得父类的内容
  • super() 可以调用父类中的构造方法 且必须在构造器的第一行出现 但是 当父类有无参数构造器的时候 这个super() 可以不写,没有无参数的构造必须写super
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值