想学好一门开发语言,掌握了它的语言特性,学习起来往往能达到事半功倍的效果,自从接触到Java这个词,想必被灌输最多的就是Java是面向对象的编程的,要记住一点万物皆可对象,所有的特性都是基于对象来展开的,坐稳了,直接开车。

一. 抽象

  生活中的任何事,物都能抽象成对象,把具有相同特征的事物抽象成一个对象。举个例子,玩过LOL,王者荣耀的都知道进入游戏要选英雄, 每个人英雄有自己的血量,蓝量以及技能,这个属性(血量,蓝量)和特性(释放技能)就可以抽象成一个对象。你只需要把他们共同特征罗列出来,这样你就完成了对象类,此时你并不需要知道这个对象的具体细节,当我们要使用这个英雄对象的时候再从更高的层面去实现它的细节如下。

abstract class Hero {int redValue;//血量int blueValue;//蓝量abstract void releasekills();//技能
}

  把这个对象,赋予不同的血量,蓝量以及技能他就是代表不同的英雄,这样一说是不是很好理解了呀,记住万物皆可对象。在实际的开发工作中,如何将某一个业务抽象化还是挺重要的,这样便于我们更好的理解业务和开发。

二. 封装

  顾名思义就是将具体的实现细节隐藏起来,使用此对象的用户并不清楚具体实现内容。还是上面例子,我们打游戏的时候,按下QWER释放了技能,此时我们就相当于调用了释放技能这个方法。但是这个技能怎么放出来,怎么实现的,我们并不知晓,只看到了释放技能的结果。那为什么用封装,封装的好处呢?

  • 安全性,对用户隐藏具体细节;
  • 降低程序的复杂程度,只需要调用封装的方法,不需要知道具体实现;
  • 对于封装方法,我们只关心结果,不关心过程,这样更好的调试我们的程序。
  • 可重用性和可维护性

三. 继承

  抽象的时候,我们已经抽象出了一个英雄类,此时我们如果需要使用具体英雄,这时候就用到了继承了。子类继承父类,使用关键字 extends 来实现,子类继承父类的方法和属性(PS:private修饰的方法和属性不能被继承),我们使用上面的抽象类Hero来写个坦克英雄父类的例子,子类对于父类来说其实是个增量的关系,在父类的基础上还能定义其他的属性和方法,这样一来我们就能够很好重用父类代码。

public class TankHero extends Hero{//坦克英雄int redValue = 500;//血量int blueValue = 300;//蓝量@Overridepublic void releasekills(){System.out.println("每秒回复20生命值");}public void increaseArmor(){System.out.println("护甲值增加100");}
}public class ApHero extends Hero{//法师英雄int redValue = 400;//血量int blueValue = 300;//蓝量@Overridepublic void releasekills(){System.out.println("法术强度增加100");}
}

Java中为什么是单继承,多实现?
  以我们上面的内容举例子。定义两个类ApHero(法师父类),TankHero(坦克父类),此时有个具体的英雄诺克萨斯统领(俗称乌鸦)即使法师,又是坦克,如果这个时候他同时继承这两个父类,而这两个父类又继承于抽象类Hero,他们都有释放技能的方法releasekills(),这时乌鸦的方法releasekills()到底是继承ApHero中的,还是TankHero中的,所以这就是个问题,Java才只能单继承,为了安全。当单继承无法满足我们的需求时,可以实现接口来满足,因为接口是可以多实现的,实现接口需要对方法进行重写,调用的时候还是调用实现类中的方法,所以重复没有关系。

四. 多态

  多态就是父类引用指向子类对象,同一个操作作用于不同的子类对象产生不同的效果,比如每个英雄都可以释放技能,但是每个技能的形态又各不相同,这也是一种多态的表象形式。

1. 多态表现形式

Hero hero = new TankHero();
Hero hero = new ApHero();

  多态存在的三个必要条件:类继承或者接口实现、子类要重写父类的方法、父类的引用指向子类的对象

2. 编译时多态和运行时多态

  • 编译时多态(静态绑定)
      方法重载都是编译时多态。根据实际参数的数据类型、个数和顺序,Java在编译时能够确定执行重载方法中的哪一个。
      方法重写的静态绑定,当前对象的引用指向当前对象时为编译时多态。
    public static void main(String[] args){ApHero apHero = new ApHero();TankHero tankHero = new TankHero();//方法重载的静态绑定gainEffect(apHero);gainEffect(tankHero);System.out.println("-----------");//方法重写的静态绑定(重写了Hero的releasekills方法)apHero.releasekills();tankHero.releasekills();}public static void gainEffect(ApHero apHero){System.out.println("法师获得蓝BUFF");}public static void gainEffect(TankHero tankHero){System.out.println("坦克获得红BUFF");}/**运行结果:* 法师获得蓝BUFF* 坦克获得红BUFF* -----------* 法术强度增加100* 每秒回复20生命值*/
  • 运行时多态(动态绑定)
      方法重写,父类引用指向子类对象时,此时是运行时多态。
public class test {public static void main(String[] args){ApHero apHero = new Syndra();apHero.releasekills();System.out.println("辛德拉的蓝量:"+apHero.blueValue);}/**运行结果:* 释放E技能弱者退散* 辛德拉的蓝量:300*/
}public class ApHero extends Hero{//法师英雄int redValue = 400;//血量int blueValue = 300;//蓝量@Overridepublic void releasekills(){System.out.println("法术强度增加100");}
}public class Syndra extends ApHero{//辛德拉int redValue = 400;//血量int blueValue = 500;//蓝量@Overridepublic void releasekills(){System.out.println("释放E技能弱者退散");}public void releaseFlash(){System.out.println("大意了啊,没有闪");}
}

  释放技能是调用重写后的方法,释放辛德拉的技能,但是有没有注意到,输出的辛德拉蓝量居然是300,是父类的蓝量。为什么呢?原来属性的值取父类还是子类并不取决于我们创建对象的类型,而是取决于我们定义的变量的类型。还要注意父类引用是无法调用子类对象独有的方法,上面的例子中,apHero引用无法调用辛德拉的releaseFlash()方法,这是子类独有的,父类引用无法调用。

3. 使用多态的优缺点

  • 优点:

    易替换,扩展性高,灵活性高,降低类型的耦合度

  • 缺点:

    不能使用子类的特有功能

  谢谢你能看到这里,觉得对你有帮助的话,欢迎关注公众号素秋云,我是一个喜欢研究Java源码的小同志,希望能和你一起进步,欢迎来找我玩,偷偷告诉你关注公众号素秋云,后台回复电子书,领取丰富的Java电子书资料哦!

从游戏中理解Java特性,我悟了!相关推荐

  1. 游戏装备强化java机制_从游戏中理解Java特性,我悟了!

    想学好一门开发语言,掌握了它的语言特性,学习起来往往能达到事半功倍的效果,自从接触到Java这个词,想必被灌输最多的就是Java是面向对象的编程的,要记住一点万物皆可对象,所有的特性都是基于对象来展开 ...

  2. 不会玩游戏的程序员不是好作家,《深入理解Java虚拟机》周志明来了!

    嘉宾:周志明.杨福川 采访.撰文:Satoh_AI 这次采访起源来自于我和豆瓣的一位读者有同样的好奇心,为什么网上搜不到周志明老师的更多信息?为什么"80后玩家"可以把本本书都维持 ...

  3. Java 并发编程解析 | 如何正确理解Java领域中的多线程模型,主要用来解决什么问题?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 我国宋代禅宗大师青原行思在<三重境界>中有这样一句话:" 参禅之初 ...

  4. java 变声_“秒变萝莉音”,游戏中的变声是如何实现的?

    原标题:"秒变萝莉音",游戏中的变声是如何实现的? 本文作者 作者:soso密斯密斯 1 前言 这边先穿插一下变声相关的知识 ,这一章主要讲音频的处理. 大家应该也接触过这类应用, ...

  5. Java 并发编程解析 | 如何正确理解Java领域中的锁机制,我们一般需要掌握哪些理论知识?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 提起Java领域中的锁,是否有种"道不尽红尘奢恋,诉不完人间恩怨"的 ...

  6. 《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记

    <深入理解Java虚拟机>阅读笔记 本repository为<深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)>阅读笔记,因为第一章主要讲的是Java的发展历史, ...

  7. 万字长文深入理解java中的集合-附PDF下载

    文章目录 1. 前言 2. List 2.1 fail-safe fail-fast知多少 2.1.1 Fail-fast Iterator 2.1.2 Fail-fast 的原理 2.1.3 Fai ...

  8. 一文带你理解Java中Lock的实现原理

    转载自   一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...

  9. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

最新文章

  1. 【Linux】34. shell脚本判断当前年份是否正确
  2. erlang md5
  3. 查看APK中MD5签名的方法
  4. Quartus II与 ModelSim功能仿真与后仿真扫盲(转)
  5. redux异步action_React躬行记(12)——Redux中间件
  6. protected访问权限_复习封装与访问控制
  7. mysql 备份 php_PHP备份/还原MySQL数据库的代码
  8. 计算机网络系统系统设备配置,计算机网络系统技术方案及设备配置方案
  9. php上传下载excel,PHPExcel 上传下载的示例代码
  10. 线索二叉树(Binary Thread Tree)
  11. win10安装wsl2和图形化界面
  12. Git使用小记——复制粘贴快捷键的修改
  13. 设计的银行账户管理系统,增加一个VIP账户的管理
  14. Ubuntu下pyglet无法解码MP3
  15. 【JavaSE】----- Java语言的介绍
  16. c语言计算n+nn+nnn+nnnn......---@颜麓
  17. Java配置文件找不到指定,使用@ContextConfiguration注解后,提示找不到配置文件
  18. matlab exp(),matlab的exp函数
  19. gets(), fgets(), scanf()总结
  20. 给开源社读者的一份信

热门文章

  1. python脚本厉害吗?使用selenium实现前程无忧简历自动刷排名!
  2. Collections用法
  3. Python爬取猫眼「碟中谍」全部评论~
  4. 仅仅有人物没背景的图片怎么弄_只会画人物不会画背景?这3种方法教你快速画背景!...
  5. centos配置启动项_Centos 配置开机启动项
  6. 升级至4K超高清12G-SDI接口时需要考虑的三件事
  7. esp8266与51单片机通信(看完不会你打我)用手机控制led灯的亮灭
  8. 第一批00后下场求职:不要误读他们的“不一样”
  9. 不破坏背景的情况下在线ps替换文字
  10. 海思平台ISP的ae的简介