想学好一门开发语言,掌握了它的语言特性,学习起来往往能达到事半功倍的效果,自从接触到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;//蓝量

@Override

public void releasekills(){

System.out.println("每秒回复20生命值");

}

public void increaseArmor(){

System.out.println("护甲值增加100");

}

}

public class ApHero extends Hero{//法师英雄

int redValue = 400;//血量

int blueValue = 300;//蓝量

@Override

public void releasekills(){

System.out.println("法术强度增加100");

}

}

Java中为什么是单继承,多实现?

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

四. 多态

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

多态表现形式

Hero hero = new TankHero();

Hero hero = new ApHero();

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

编译时多态和运行时多态

编译时多态(静态绑定)

方法重载都是编译时多态。根据实际参数的数据类型、个数和顺序,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;//蓝量

@Override

public void releasekills(){

System.out.println("法术强度增加100");

}

}

public class Syndra extends ApHero{//辛德拉

int redValue = 400;//血量

int blueValue = 500;//蓝量

@Override

public void releasekills(){

System.out.println("释放E技能弱者退散");

}

public void releaseFlash(){

System.out.println("大意了啊,没有闪");

}

}

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

3. 使用多态的优缺点

优点:

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

缺点:

不能使用子类的特有功能

游戏装备强化java机制_从游戏中理解Java特性,我悟了!相关推荐

  1. spring 加载java类_在Spring中基于Java类进行配置的完整步骤

    在Spring中基于Java类进行配置的完整步骤 发布于 2020-7-7| 复制链接 基于Java配置选项,可以编写大多数的Spring不用配置XML,下面 前言JavaConfig 原来是 Spr ...

  2. js 中 java 代码_在js中嵌套java代码

    jsp中有时候在js中操作某些java后台传递过来的数据逻辑比较复杂,比如list内容的遍历,可以直接在页面上添加java脚本来执行内容,代码如下: //在js中插入java代码操作 //取出java ...

  3. 修改docker内java内存_在docker中使用java的内存情况

    Java和Docker不是天然的朋友. Docker可以设置内存和CPU限制,而Java不能自动检测到.使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题. 虚拟化中的 ...

  4. jython 导入java包_在jython中导入java类

    我用python处理NLP.有一个NLP工具,即Zemberek,用于土耳其语.但它是用java编写的.所以我必须使用jython来导入这些类.我安装了Jython2.7.另外,我安装了eclipse ...

  5. ajax 调用java类_在ajax中调用java方法

    AJAX是Asynchronous JavaScript And XML的首字母缩写.它提供了异步与服务器通信的能力. 要简单地解释一下,您可以向服务器发送请求并继续与用户进行用户交互.您无需等待服务 ...

  6. 计算机论文 游戏,计算机游戏论文3000字_计算机游戏毕业论文范文模板.doc

    计算机游戏论文3000字_计算机游戏毕业论文范文模板 计算机游戏论文3000字(一):一些智力游戏问题的数学模型及其计算机求解论文 摘要:国内只有相关智力游戏问题的数学模型相关论文,数学模型作为当代社 ...

  7. java是什么软件?如何理解Java?

    大家在学习Java的时候,听到大家说Java是什么软件?今天老夫就告诉大家,java它其实不是软件,这里给各位初学者们详细解释一下.接下来详细的介绍下. java是什么软件?如何理解Java? 通俗的 ...

  8. miui游戏驱动程序偏好设置_小米游戏携手开发者共创新未来:云游戏、超级会员、场景营销多方位发展...

    11月21日,小米公司MIDC开发者大会应用与游戏生态分论坛在北京召开. 小米互联网二部总经理仇睿恒在会上表示,小米应用商店全球分发业务如今已充分覆盖中国.印度.印尼.俄罗斯及西班牙等5个国家.截至目 ...

  9. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

最新文章

  1. IT人的八大修炼神器
  2. HDU2866 Special Prime
  3. 使用Transact-SQL进行数据导入导出方法详解
  4. Scala伴生类与伴生对象:apply方法/伴生对象可以访问伴生类的私有属性
  5. 8086CPU常见汇编指令、debug命令
  6. 《c语言从入门到精通》看书笔记——第4章 运算符与表达式
  7. 模板:K-D tree
  8. 第一次马拉松_成为数据科学家是一场马拉松而不是短跑
  9. 职场中 你要学习12种动物精神
  10. C++自学26:联合体(union/17)
  11. paip.提升用户体验-----找回密码的设
  12. Raki的读paper小记:TriggerNER: Learning with Entity Triggers as Explanations for Named Entity Recognition
  13. jpg格式电脑怎么弄_电脑上图片改为jpg格式方法_照片怎么改为jpg格式-win7之家
  14. android 自定义多边形,android自定义形状的按键实例代码
  15. 20155339 《信息安全技术》实验二、Windows口令破解实验报告
  16. 直方图中bin的说明
  17. uboot引导kernel - 4 -gd bd详解
  18. 凭借近2亿的年销量,小米三年超越苹果的可能性有多大?
  19. iphone4s在ios7下解决卡顿问题
  20. 《Java平台体系》——第二章 JVM——实战:用JBE修改Java字节码

热门文章

  1. 交换机和路由器技术-12-单臂路由
  2. Java基础语法知识
  3. 命令行编译vs2010项目工程
  4. 文件权限管理之chattr权限管理之su、sudo
  5. vue中$bus的用法及$emit、$on、$off的使用
  6. Fixing Pathfinding Once and For All (个人翻译)
  7. 16G906 装配式混凝土剪力墙结构住宅施工工艺图解
  8. diy服务器个人主机_服务器DIY也可以这么简单
  9. 学习微表情作用可大了
  10. 高性能linux构建Cf游戏,构建CF卡Linux系统的几个常见难题