大家好,我是乐字节的小乐,前几天讲完了Java继承,接下来我们会讲述Java多态。

以上就是本次学习的6大任务。我们依次来看。

一、 Object类

Object类是所有Java类的根基类。

如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类。

class Person{

}

等价于

class Person extends Object{
}

1、对象的实例化过程

实例化一个类是从最顶级的超类开始实例化的, 是一层一层的包裹结构. “先父类后子类,先静态后成员”。

⑴toString方法

toString: 对象的字符串表示

Object类中定义有public String toString() 方法,其返回值是String类型,用来描述当前对象的有关信息。

在进行String与其他类型数据的连接操作时(如:System.out.println(“hello ” + person)),将自动调用该对象类的toString()方法

可以根据需要在用户自定义类型中重写toString()方法。

⑵equals方法

equals:比较相等,默认地址比较(”第一个盒子的比较”),要比较第二个盒子需要重写该方法

Object类中定义有:public boolean equals(Object obj)方法

提供定义对象是否”相等”的逻辑

Object的equals方法定义为:x.equals(y)当x和y是同一个对象的引用时返回true,否则返回false

JDK提供的一些类,如String,Integer,Date等,都已经重写了Object的equals方法,调用这些类的equals方法,x.equals(y),当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回true否则返回false.

可以根据需要在用户自定义类型中重写equals方法

练习:重写前面定义的“Person”类和”Student”类的toString及equals方法,并测试。

二、 对象转型(casting)

一个基类的引用类型变量可以“指向”其子类的对象。

一个基类的引用不可以访问其子类对象的新增成员(包括属性和方法)。

可以使用 “引用变量 instanceof 类名”来判断该引用类型变量所“指向”的对象是否属于该类或该类的子类。

子类对象可以当作基类的对象来使用,称作向上转型(upcasting),反之称为向下转型(downcasting)

例1:有

Animal类(父类)

Cat类 (子类)

Dog类(子类)

测试:父类引用 = 父类对象

子类引用 = 子类对象

父类引用 = 子类对

父类引用调用父类继承而来的属性和方法

父类引用调用子类特有属性和方法(向下转型)

子类对象 instanceof父类

强制类型转换后能调用子类特有成员(属性和方法)

例2:

测试将父类形参用子类对象作为实参使用

1、 重载

2、 通过强制类型转换调用子类特有成员

三、 多态

静态绑定(静态联编): 在编译期完成,可以提高代码执行速度。静态绑定的方法包括:

1. 静态方法

2. 构造器

3. private方法

4. 用关键字super 调用的方法

动态绑定(动态联编):指在“执行期间(而非编译期间)” 判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。 这虽然让我们编程灵活,但是降低了代码的执行速度。这也是JAVA比C/C++速度慢的主要因素之一。

多态,polymorphism 即多种形态,模糊策略,以不变应万变,使用多态可以编写更加通用的代码。

多态的概念发展出来,是以封装和继承为基础的。子类以父类的身份出现,但做事情时还是以自己的方法实现。

相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。

要发生多态有三个必要条件:要有继承,要有重写,父类引用指向子类对象

父类是父类

子类是子类

子类是父类

父类不是子类

子类不是其他子类

多态例子:

例1(必须掌握看透):

Animal Cat Dog

例2 (提高理解多态):先思考再运行看结果

做题四大原则:

1、继承链,自己没有找父亲;

2、编译看类型+确定方法表,运行找对象

3、就近最优原则:自己没有找父亲

4、发生多态,基类对子类的新增方法不可见

四、 抽象类

用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法。

含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写

抽象类不能被实例化

抽象方法只需声明而不需要实现

例:动物高兴了都会叫 但对于不同种类的动物,各自的叫声不同,动物(这个父类)的叫法/叫声永远不可能满足子类的需求

五、 接口

接口(interface)是抽象方法和常量值的定义的集合。

从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现

从语义上可以理解为,对于某一种动作、行为、功能的抽象,我们将其定义为接口,作为一种标准完全的规范而已,不适宜定义为类。例如:飞这个功能,飞机可以飞(具有飞这个功能),小鸟能飞(具有飞这个功能),昆虫也能飞,一般我们不会定义一个类Fly,从语义上不通,所以这只是一种功能,一个规范,我们可以将其定义为一种接口,供其他类来实现

接口定义举例:run这个功能

接口的特性

多个无关的类可以实现同一个接口

一个类可以实现多个无关的接口

与继承关系类似,接口与实现类之间存在多态性

定义Java类的语法格式:

<modifier> class <name>[extends<superclass>] [implements<interface>[,<interface>]…]{…}

接口中声明属性默认为 public static final 的,也只能是public static final的;

接口中只能定义抽象方法,而且这些方法默认为public的,也只能是 public的

接口可以继承其他的接口,并添加新的属性和抽象方法

接口不能实现另一个接口,但可以继承多个其它接口

接口举例:Sing这种能力 Paint这种能力

练习:设计接口实现下面结构

面向对象三大特性的理解:

在编写代码时,我们追求”高内聚 低耦合” ,达到重用与规范,则需要使用面向对象的三大特性来实现:

封装:encapsulation 隐藏信息

继承:inheritance 延续+扩展父类信息

多态:polymorphism 模糊策略 以不变应万变

封装作用: a) 实现专业的分工,工作中的分模块、分功能开发。b) 隐藏信息和实现细节。使得对代码的修改更加安全和容易

继承作用:实现代码的复用,延续+扩展父类信息

多态作用:以不变应万变(如 USB 接口,只要你实现了我的标准,就能插上电脑)

注意:

java三大特性虽说简单,但真正能理解其中的含义,没有个一年半载的学习,是理解不了的。

Java多态的6大特性|乐字节的更多相关文章

  1. 总结JAVA语言的十大特性

    JAVA语言的十大特性 1.简单 Java语言的语法简单明了,容易掌握从,而且Java语言是纯面向对象的语言. Java语言的语法规则和C++类似,从某种意义上来讲,Java原因是由C语言和C++语言 ...

  2. java中的3大特性之多态

    一.多态:一个对象具有多种表现形态(父类的引用类型变量指向了子类的对象) 二.多态的满足条件:1.必须要有继承关系2.必须要有方法的重写 三.int[]a; //a引用类型变量-->//引用in ...

  3. java中的3大特性之继承

    继承的特点:继承父类的属性和方法.单继承(多层继承)c++里的继承是多继承 特性 :方法的复写(重写) java中的继承和OC中一样. 比如:人可以养狗; 人---->狗 :整体和部分(拥有)关 ...

  4. Java程序的编写与执行、Java新手常见问题及解决方法|乐字节Java学习

    今天,我们来写一段Java程序.然后看看Java程序是如何执行的,以及Java新手小白遇到的问题和解决办法.   一.HelloWorld的编写 ① 新建一个XXX.java (文件的扩展名显示出来) ...

  5. JAVA记录-Spring两大特性

    1.IOC控制反转 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...

  6. JAVA记录 Spring 两大特性

    1.IOC控制反转 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...

  7. Java注解-元数据、注解分类、内置注解和自定义注解|乐字节

    大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...

  8. 乐字节Java变量与数据类型之一:Java编程规范,关键字与标识符

    大家好,我是乐字节的小乐,这次要给大家带来的是Java变量与数据类型.本文是第一集:Java编程规范,关键字与标识符. 一.编程规范 任何地方的名字都需要见名知意: 代码适当缩进 书写过程成对编程 对 ...

  9. 乐字节Java编程语言发展,面向对象和类

    大家好,上次我们讲过了乐字节Java编程之方法.调用.重载.递归,接下来我们将会进入到Java封装的内容.Java编程语言发展,面向对象和类. 一.编程语言的发展 机器语言——直接由计算机的指令组成, ...

随机推荐

  1. AtCoder Grand Contest 012题解

    传送门 \(A\) 肯定是后面每两个陪最前面一个最优 typedef long long ll; const int N=5e5+5; int a[N],n;ll res; int main(){ s ...

  2. 2-SAT 知识小结

    2-SAT 问题: 有 n 个变量,每一个变量都是 bool 类型的,除了这 n 个变量以外,我们还有 m 个关系表达式,关系表达式差不多是这样的: x1 & x2 = false(注意每个表 ...

  3. SVN版本回滚实战

    天在使用SVN发布的时候不小心修改了一些不正确的东西,新增和编辑了一些错误的文件,由于文件数量比较多,并且目录复杂,不可能单个进行处理,所以想到了SVN版本回滚. 回滚本地工作目录: 1.右键工作目录 ...

  4. TextBox光标定位到文本末尾

    private void RichTextBox1_TextChanged(object sender, EventArgs e) { this.richTextBox1.Select(richTex ...

  5. python自动化登录获取图片登录验证码

    主要记录一下:图片验证码1.获取登录界面的图片2.获取验证码位置3.在登录页面截取验证码保存4.调用百度api识别(目前准确率较高的识别图片api)本次登录的系统页面,可以看到图片验证码的位置登录页面 ...

  6. matplotlib显示黑白灰度图像颜色设置

    对于黑白灰度图像(矩阵) 1. 默认使用伪彩色拉升 2 cmap参数为 binary,可能导致颜色反转 3. cmap = gray,same color as origin, that is, wh ...

  7. Flutter ListView 列表组件

    列表常见的情况: 1.垂直列表 2.垂直图文列表 3.横向列表 4.动态列表 名称 类型 说明 scrollDirection Axis Axis.horizontal 横向列表 Axis.verti ...

  8. Dart中的mixins

    /* mixins的中文意思是混入,就是在类中混入其他功能. 在Dart中可以使用mixins实现类似多继承的功能,with关键字 因为mixins使用的条件,随着Dart版本一直在变,这里讲的是Da ...

  9. Python适配器模式代码

    Python设计模式之适配器模式,代码,思考等 # -*- coding: utf-8 -*- # author:baoshan class Computer: def __init__(self, ...

  10. 免费好用的SSH手机客户端

    简单说一些,SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定,SSH 为建立在应用层基础上的安全协议.SSH 是目前较可靠,专 ...