面向对象修炼手册(三)(行为与多态)(Java宝典)

🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀面向对象修炼手册

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 

目录

前言

行为

1 静态行为和动态行为

1.1 静态类和动态类

1.2 静态方法与动态方法

1.2.1  静态方法与动态方法区别

1.2.2  静态方法与动态方法的优缺点

1.2.3  静态方法与动态方法的方法绑定

1.3 静态类型与动态类型

多态

1. 重载、重写、重定义

1.1 重写(覆盖、改写、重置、覆写)

1.2 重载

1.2.1 重载解析

1.3 重定义

1.3.1 重定义解析

2 概念

3 特点

总结


前言

目前我们已经讨论了类以及对象,又进一步区分了对象和实例的区别。在此基础上,又研究了面向对象编程的思想——利用对象及消息机制解决问题、完成编程

有了这样大框架作为基础,我们可以知道面向对象编程中最主要的东西就两个——1、对象;2、消息传递。消息传递的机制我们已经有了较为深入的研究(这一块并不复杂)。

接下来,我们要深入研究的是对象:包括对象的生成对象的组织对象的行为

面向对象技术最主要的就是在研究对象的事情。

后面的设计模式和设计原则对应的就是对象的创建、组织和行为

既然是研究对象的事情,我们自然要先研究对象的三大性质——继承、多态、封装。只有我们深入理解了对象的三大性质才有后面的对象生成、组织与行为研究

行为

行为:在这里的含义就是具体的操作,研究行为就是研究面向对象中的一系列相同操作的集合(强调的是做法——如何做,并不强调这个行为是作用在哪个对象上)

另一种理解方式:

静态行为:静态化

动态行为:动态化

可以把这两个行为作用在不同对象上,产生不同类型的对象

例如:作用在类上形成静态类和动态类;作用在方法上形成静态方法和动态方法;作用在类型上形成静态类型和动态类型;作用在绑定方法上形成静态绑定方法、动态绑定方法

行为分为:静态行为和动态行为

1 静态行为和动态行为

1.1 静态类和动态类

变量的静态类是指用于声明变量的类。静态类在编译时就确定下来,并且再也不会改变(才class中就固定的,不再改变)

变量的动态类指与变量所表示的当前数值相关的类。动态类在程序的执行过程中,当对变量赋新值时可以改变。表示直到运行时绑定于对象的属性或特征(在main中可以由程序员自己设置,在运行时才确定类中的具体属性和特征)

1.2 静态方法与动态方法

1.2.1  静态方法与动态方法区别
  1. 静态方法在程序初始化后会一直贮存在内存中,不会被垃圾回收器回收
  2. 非静态方法只在该类初始化后贮存在内存中,当该类调用完毕后会被垃圾回收器收集释放(与类同生命周期
  3. 静态方法在初始化类时初始化,并分配内存;动态方法只有先创建类的实例对象后,才能调用动态方法(静态方法属于类,动态方法属于具体的对象
  4. 静态方法实在类装载的时候就加载的,可以直接用类名调用,不必实例化。动态方法,是在由具体的类的对象的时候由对象调用的(静态方法类和对象都可调用,动态方法只有对象调用
  5. 静态方法在访问本类的成员时,只容许访问静态成员(即静态成员变量和静态方法),而不容许访问实例成员变量和实例方法;实例方法则无此限制(静态方法的限制
1.2.2  静态方法与动态方法的优缺点

静态方法好处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象都存一份。可以直接被类名调用

静态方法坏处:生命周期过长。访问出现局限性。(静态虽好,只能访问静态)

1.2.3  静态方法与动态方法的方法绑定

方法绑定含义:

绑定消息和响应消息的消息选择器(也就是响应消息的代码)

静态方法绑定:

静态绑定(前期绑定)是指:在程序运行前就已经知道这个消息的接收器是哪个,在编译的时候就可以连接到类的中,定位到这个方法。

在Java中,final、private、static修饰的方法以及构造函数都是静态绑定的,不需程序运行,不需具体的实例对象就可以知道这个方法的具体内容

理解:这个方法如果只有一份,不会重复也不会被修改,那么在编译时就可以直接绑定

动态方法绑定:

在运行时根据具体对象的类型进行绑定。

若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的

1.3 静态类型与动态类型

动态类语言与静态类型语言之间的差异在于变量或数值是否具备类型这种特性
静态类型语言,类型在编译时绑定于变量。
动态类型语言(有时也称为非类型语言, untyped language ),类型决定于数值,而与变量无关。
变量仅仅代表一个 名称
在程序执行期间,不仅变量所代表的数值可以改变,而且变量所代表的 类型也可以改变
讨论的焦点: 实现高效性还是实现灵活性。

多态

多态的定义:当变量/方法的动态行为和静态行为不一致时,就出现了所谓的多态

1. 重载、重写、重定义

1.1 重写(覆盖、改写、重置、覆写)

定义:子类重写父类的方法

出现场景:父类和子类之间

特点:父类和子类方法名、参数、返回值类型都相同

方法绑定:根据调用这个方法的对象的类型来确定绑定哪个方法

多态:多态体现在完全相同的两个函数整体指代不同的代码实现

public class FatherOverride {
    public void f() {
        System.out.println("father f()");
    }

    public static void main(String[] args) {
        FatherOverride o = new Derived();
        o.f(); // 输出: derived f()
    }
}

class Derived extends FatherOverride {
    @Override
    public void f() {
        System.out.println("derived f()");
    }
}
采用多态技术的优点:
        引进多态技术之后,尽管子类的对象千差万别,但都可以采用  父类引用.方法名([参数]) 统一方式来调用,在程序运行时能根据子对象的不同得到不同的结果。这种“以不变应万变”的形式可以规范、简化程序设计,符合软件工程的“一个接口,多种方法”思想。

向上转型:子类本质是一种特殊的父类。当把一个子类对象赋值给一个父类引用变量时,子类对象会被自动向上转型,同时失去一些子类独有的方法 (在类的层次结构中,父类在上子类在下)

向上转型的例子:

class Animal {
public void speak() {
System.out.println("Animal speaks??");
}
}

class Dog extends Animal {
public void speak() {
bark();
}
public void bark() {
System.out.println("Dog barks!");
}
}

class Bird extends Animal {
public void speak() {
}
public void twitter() {
System.out.println("Bird twitters!");
}
}

输出:

向下转型:做出数值是否属于指定类的决定之后,通常下一步就是将这一数值的类型由父类转换为子类这一过程称为向下造型,或者反多态,因为这一操作所产生的效果恰好与多态赋值的效果相反。

例子:

class Person { 
public void fun1() { 
	System.out.println(“1.Person{fun1()}”); } 
public void fun2() { 
	System.out.println(“2.Person{fun2()}”); }
 }  
class Student extends Person //继承了父类//Person,自然继承了方法fun1、fun2
public void fun1() { //覆写了父类中的方法fun1() 
	System.out.println(“3.Student{fun1()}”);  } 
public void fun3() { 
	System.out.println(“4.Student{fun3()}”); } 
}  
class TestJavaDemo2 { 
	public static void main(String[] args) { 
	Person p = new Person(); //父类对象由自身实例化 
	Student s = (Student)p; //将p对象向下转型 
	p.fun1();  
	p.fun2();} }

运行结果: 

这里编译无错是因为:检查在编译时发生,范围和方式与静态绑定相同(根据变量类型)

运行出错是因为:发生动态绑定,运行时绑定实质对象(Person),但是运行时发现类型是Student 

1.2 重载

定义:同一个类定义中有多个同名的方法,但是方法的形参不同。调用时根据形参的不同调用不同的方法

出现场景:同一个类中

特点:同一个类中;方法名相同;方法形参不同

方法绑定:在编译时就绑定

多态:多态体现在同一个函数名能够指代多个过程

重载解析是在编译阶段执行

重写解析是在运行阶段执行

1.2.1 重载解析

重载解析就是指编译器解析重载函数时的流程

方法如下:

1)  找到所有可能进行调用的方法,亦即,各个参数(实参)可以合法地赋值给各个参数类型(形参)的所有方法。如果找到一个在调用时可以完全匹配所使用的参数类型的方法,那么就执行这个方法。
2)  对于第一步所产生的集合中的方法,两两进行比较,如果一个方法的 所有参数类型 都可以赋值给另外一个方法,那么就将第二个方法从集合中移走。
重复以上操作,直至无法实现进一步的缩减为止。
3)  如果只剩下一个方法,那么这个方法就非常明确了,调用这个方法即可。如果剩余的方法不止一个,那么调用就产生歧义了,此时编译器将报告错误。

重载解析小练习:

题目描述:

void order (Dessert d, Cake c);
void order (Pie p, Dessert d);
void order (ApplePie a, Cake c);

结果:

order (aDessert, aCake);//执行方法一
order (anApplePie , aDessert);//执行方法二
order (aDessert , aDessert);//错误
order (anApplePie , aChocolateCake);//执行方法三
order (aPie , aCake);//错误
order (aChocolateCake, anApplePie );//错误
order (aChocolateCake, aChocolateCake);//执行方法一
order (aPie , aChocolateCake);//错误

1.3 重定义

定义:在子类定义了一个和父类具有相同名称但是函数签名不同的方法时,发生重定义(父子类中函数名相同、签名也相同叫做重写;同一个类中函数名相同、签名不同叫做重载)

出现场景:父类和子类之间

特点:父子类;方法名相同;方法形参不同

多态:多态体现在同一个函数名能够指代多个过程

1.3.1 重定义解析

两种不同的技术解析重定义:融和模型和分级模型

融合模型

Java使用融合模型,对所有可能的方法进行检测,选择最匹配的方案

class Parent {
    public void example (int a)
    {System.out.println(“in parent method”);}
}
class Child extends Parent {
    public void example (int a,int b)
    {System.out.println(“in child method”);}
}

//main方法中:
Child aChild = new Child();
aChild.example(3);//用parent
aChild.example(3,4);//用child

解析技术的必要性:

重写后每一个函数只存在唯一的可能性——》不需要解析去选择

重载和重定义后每个函数可能存在多种选择——》需要解析技术去选择 

2 概念

多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态

多态是静态行为和动态行为下方法/变量类型不同时的体现

对于动态类型语言,所有的变量都可能是多态的。

对于静态类型语言,多态变量则是替换原则的具体表现。

可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准 

3 特点

  1. 多态的前提1:是继承

  2. 多态的前提2:要有方法的重写

  3. 父类引用指向子类对象,如:Animal a = new Cat();

  4. 多态中,编译看左边,运行看右边

总结

本系列内容均来自:山东大学-潘丽老师-面向对象开发技术-课程ppt、《设计模式》、《大话设计模式》

如果觉得写的还不错,可以点个赞收藏一下呀~~

祝大家学业、事业、爱情顺利!

天天开心,没有Bug每一天

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/736295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

技术管理转型之战:解锁管理新境界——直觉决策的艺术与科学

文章目录 引言一、直觉决策的定义与特点二、直觉决策在管理中的价值三、直觉决策的来源1、潜意识的心里过程2、基于价值观或道德的决策3、基于经验的决策4、影响发动的决策5、基于认知的决策 四、如何培养直觉决策能力五、直觉决策的风险与应对结语 引言 在快速变化的商业环境…

查找和排序

目录 一、查找 1.1查找的基本概念 1.2顺序查找 1.3折半查找(二分查找) 1.4散列表的查找 1.4.1基本概念 1.4.2散列函数的构造方法 1.4.3解决冲突的方法 二、排序 2.1排序的基本概念 2.2插入排序 2.2.1直接插入排序: 2.2.2希尔排序…

CSS属性选择器学习记录(4)

目录 1、CSS 属性 选择器 1.1、CSS [attribute|value] 选择器 1.2、实例 2、具有特定属性的HTML元素样式 3、属性选择器 4、属性和值选择器 5、属性和值的选择器 - 多值 6、表单样式 1、CSS 属性 选择器 顾名思义,CSS 属性选择器就是指可以根据元素的属性以…

Centos7 Mysql8.3.0 安装地址

MySQL :: Download MySQL Community Server (Archived Versions)

力扣SQL50 查询近30天活跃用户数 datediff(日期1,日期2)

Problem: 1141. 查询近30天活跃用户数 👨‍🏫 参考题解 -- 选择活动日期作为天数,计算每天的唯一活跃用户数 select activity_date as day, count(distinct user_id) as active_users from activity -- 从2019年7月27日开始的30天内 where …

c#考试知识点

第一题 //数组{1,2,3,,8,6} //方法(数组,目标值) //输出 //接收一个数组,输出目标值是数组中哪两个数的和,并输出下标 using System; using System.Collectio…

《三国:谋定天下》成为了SLG游戏现象级的成功案例

原标题:《三国:谋定天下》引领SLG游戏新潮流,B站股价五个飙升了30% 易采游戏网6月23日:B站作为年轻人喜爱的文化社区和视频平台,再次用一款新的游戏证明了其在游戏发行领域的独到眼光与强大实力。最近大火的策略角色扮…

【python】python海底捞门店营业数据分析与可视化(数据集+源码+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Vue elementui表格

去除表头 <el-table:data"tableData"stripestyle"width: 100%":cell-style"{ text-align: justify-all }":show-header"false"></el-table>合并 <template><div class"elife-container"><el-ro…

【前端vue3】TypeScrip-Class类用法

类型声明 TypeScrip定义Class类 语法&#xff1a; // 定义一个名为 Person 的类 class Person {constructor () {// 构造函数&#xff1a;稍后定义}run () {// 方法&#xff1a;稍后定义} }在TypeScript是不允许直接在constructor 定义变量的 需要在constructor上面先声明 例…

AI 大模型企业应用实战(06)-初识LangChain

LLM大模型与AI应用的粘合剂。 1 langchain是什么以及发展过程 LangChain是一个开源框架&#xff0c;旨在简化使用大型语言模型构建端到端应用程序的过程&#xff0c;也是ReAct(reasonact)论文的落地实现。 2022年10月25日开源 54K star 种子轮一周1000万美金&#xff0c;A轮2…

【学习笔记】Mybatis-Plus(三):MP中Wrapper的使用

Wrapper简介 注意&#xff1a; 查询用QueryWrapper和LambdaQueryWrapper来封装 updateWrapper和LambdaUPdateWrapper不但能封装查询还能更改要更新的对象。 QueryWrapper的使用 QueryWrapper中的很多条件限定都是见名知其意的。下表列出来几个常用的&#xff1a; 1.多条件进行…

拖拽劫持与数据窃取

2010 年&#xff0c;ClickJacking 技术有了新的发展。一位名叫 Paul Stone 的安全研究者在 BlackHat 2010 大会上发表了题为“Next Generation Clickjacking”的演讲。在该演讲中&#xff0c;提出了“浏览器 拖拽事件”导致的一些安全问题。 目前很多浏览器都开始支持 Drag &a…

智能风控(原理、算法与工程实践)项目一

本文介绍该书第一章的项目&#xff1a;运用CART树进行规则挖掘&#xff0c;具体代码如下 #!/usr/bin/env python # coding: utf-8 # In[1]: import pandas as pd import numpy as np import os # In[2]: data pd.read_excel( ./data_for_tree.xlsx) # In[3]: data.h…

(南京观海微电子)——TFT LCD压合技术

TFT-LCD TFT-LCD open cell后段制程主要指的是将驱动IC和PCB压合至液晶板上&#xff0c;这个制程主要由三个步骤组成&#xff1a; 1.ACF (Anisotropic Conductive Film)的涂布。 在液晶板需要压合驱动IC的地方涂布ACF&#xff0c;ACF又称异方性导电胶膜&#xff0c;特点是上下…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 07:编码中的假象

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

Spring Boot + WebSocket 实现 IM 即时通讯

文章目录 1. 项目环境准备2. 配置WebSocket3. 创建消息处理器4. 创建消息类5. 创建前端页面6. 启动应用并测试7. 分析与扩展结论 &#x1f389;欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;…

项目训练营第四天

项目训练营第四天 前端部分修改 前端用的是WebStorm和Ant Design Pro框架 Ant Design Pro是比较流行的一个前端登陆、注册、管理框架&#xff0c;能帮我们快速实现前端界面的开发 效果大致如图 使用起来也极为方便&#xff0c;首先在WebStorm 控制台中输入如下命令 # 使用…

Repair LED lights

Repair LED lights 修理LED灯&#xff0c;现在基本用灯带&#xff0c;就是小型LED灯串联一起的 1&#xff09;拆旧灯条&#xff0c;这个旧的是用螺丝拧的产品 电闸关掉。 2&#xff09;五金店买一个&#xff0c;这种是磁铁吸附的产品 现在好多都是铝线啊。。。 小部件&#x…

塞贝壳效应

塞贝克效应&#xff08;Seebeck effect&#xff09;&#xff0c;通常被称为第一热电效应&#xff0c;是由托马斯约翰塞贝克&#xff08;Thomas Johann Seebeck&#xff09;在1821年发现的一种热电现象。这个效应描述了当两种不同的导体或半导体在它们的接点处有温度差时&#x…