java面对对象编程-多态

news2024/9/19 10:10:00

介绍

方法的多态

多态是在继承,重载,重写的基础上实现的

我们可以看看这个代码

package b;

public class main_ {

	public static void main(String[] args) {
//		graduate gra=new graduate();
//		gra.cry();//这个时候,子类的cry方法就重写了父类的方法
		aa a=new aa();
		System.out.println(a.sun(1,2,3));
		System.out.println(a.sun(1,3));
		
	}
	
}
class father{//父类。
	private void say() {
		System.out.println("b say()方法被调用");
		
	}
	
	
}
class aa extends father_{//子类继承父类
	public int sun(int n1,int n2) {//和下面的sum构成方法重载
		return n1+n2;
		
	}
	public int sun(int n1,int n2,int n3) {//和下面的sum构成方法重载
		return n1+n2+n3;
		
	}
	
	
}

用方法的重载

方法的重写

我现在在子类和父类中都加上say方法,并创建对象调用,虽然都是say 方法,但调用的对象不同

package b;

public class main_ {

	public static void main(String[] args) {
//		graduate gra=new graduate();
//		gra.cry();//这个时候,子类的cry方法就重写了父类的方法
		aa a=new aa();
		System.out.println(a.sun(1,2,3));
		System.out.println(a.sun(1,3));
		father b=new father();
		b.say();
		a.say();
		
	}
	
}
class father{//父类。
	public void say() {
		System.out.println("b say()方法被调用");
		
	}
	
	
}
class aa extends father_{//子类继承父类
	public int sun(int n1,int n2) {//和下面的sum构成方法重载
		return n1+n2;
		
	}
	public int sun(int n1,int n2,int n3) {//和下面的sum构成方法重载
		return n1+n2+n3;
		
	}
	
	public void say() {
		System.out.println("a say()方法被调用");
		
	}
	
}

多态的具体表现。

我们先来看看编译类型和运行类型

  1. 编译时类型:也被称为静态类型,是变量在声明时的类型或者可以理解为是引用的类型。编译时类型在编译期确定,并且在程序运行过程中不会发生改变。编译器在编译时就会检查对应的类型规则。

Animal animal = new Dog(); // 这里animal的编译时类型就是Animal

  1. 运行时类型:也被称为动态类型,在程序运行过程中动态绑定的类型,即实际的对象类型。运行时类型可能会在运行期改变,具体的类型是在运行时确定的。、

Animal animal = new Dog(); // 这里animal的运行时类型就是Dog animal = new Cat(); // 这里animal的运行时类型变为Cat

在堆栈中的

在`Animal myDog = new Dog();`这句代码中,涉及到了两部分的内存分配:堆内存和栈内存,他们的用途和特性各不相同。 1. 堆内存(Heap): 这是存放所有对象实例以及数组的地方。在Java中,通过`new`关键字创建的对象或数组都会在堆中分配内存。所以,`new Dog()`创建的新的Dog对象就存放在堆内存中。 2. 栈内存(Stack):存放了基本类型的变量(int, double, float, boolean, char等)和对象引用变量。每个线程运行时都有自己的栈,栈中的数据只在当前线程中有效。所以,`myDog`是一个引用类型的变量,它存放在栈内存中。它持有的是堆内存中的`Dog`对象的引用(可以理解为指向堆内存中`Dog`对象的地址)。 因此,`Animal myDog = new Dog();`这句代码,一个`Dog`类型的对象实例被创建在堆内存中,`myDog`这个引用变量被创建在栈内存中,并且`myDog`持有了这个`Dog`实例的引用。这样,通过`myDog`, 我们就可以指向和操作这个`Dog`实例了。 这种处理方式的一个重要理解是,当`myDog`的作用域结束或者被设为null,只是栈内存中的引用消失了,但是堆内存中的`Dog`对象还在,除非没有其他的引用指向这个`Dog`对象,那它就会被认为是垃圾,等待垃圾回收器在恰当的时候删除它。

真正理解

在这段代码`Animal myDog = new Dog();`中,`Animal`是一个类,在Java中被用作数据类型。在这个上下文中,它标识了`myDog`引用变量应该引用的对象类型。它并不直接占据堆或栈中的空间,它存在于源代码以及编译后的字节码中。 具体的说,`Animal`是一个reference(引用)类型,而`myDog`是一个reference(引用)变量,它的类型就是`Animal`。`myDog`变量存储在栈内存里,而真正的对象实例`new Dog()`则存储在堆内存里。 `Animal`的存在,影响的是`myDog`这个引用变量可以指向堆内存中的哪些对象。准确地说,`myDog`可以指向堆内存中的`Animal`对象,也可以指向任何一个`Animal`子类的对象(如这里的`Dog`对象)。 因此,`Animal`并不直接占据内存,而是确定了`myDog`引用变量可以引用哪种类型的对象。同时,在编译期,它也决定了可以通过`myDog`变量调用哪些方法和访问哪些字段。

多态代码

public class Animal {
    public void sound(){
        System.out.println("动物发出声音");
    }
}

public class Dog extends Animal {
    public void sound(){
        System.out.println("汪汪汪");
    }
}

public class Cat extends Animal {
    public void sound(){
        System.out.println("喵喵喵");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();
        myDog.sound();
        myCat.sound();
    }
}

多态的动物

小提示

在java中 public void feed(Dog dog,Bone bone)其中的Dog dog,Bone bone是什么

在这个方法定义中:

- public void feed(Dog dog, Bone bone)

- feed是方法名

- public表示该方法可在任何位置访问

- void表示该方法没有返回值

- Dog dog, Bone bone 是该方法的参数(parameters)

- Dog表示参数的类型为Dog类

- dog是参数名,表示传入的实参对象会以dog这个名字在方法内访问

- Bone bone表示下一个参数的类型为Bone类,名称为bone

所以简单总结:

- Dog dog, Bone bone定义了这个feed方法需要两个参数
- 第一个参数是Dog类型,名称为dog
- 第二个参数是Bone类型,名称为bone
- 这两个参数在方法内通过dog和bone这个名字来访问传入的实参对象

所以这个方法定义表示,feed方法需要传入两个对象,一个是Dog类型,一个是Bone类型,然后在方法内部就可以通过dog和bone来操作这两个对象了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Java EE] 网络编程与通信原理(三):网络编程Socket套接字(TCP协议)

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

第36届世界超级小姐大赛安徽赛区正式启动

5月26日,在现场几百位出席仪式的社会名流、时尚界大咖、文化旅游机构负责人和前沿品牌代表以及现场嘉宾的共同见证下,第36届世界超级小姐大赛安徽赛区活动的神秘面纱终于在安徽黄山悠悠湖文化中心正式揭开。伴随着高亢激情的现代音乐,长发飘逸、身形灵动…

“AURORA-M:首个遵循人类审查安全指令微调的开源多语言模型

在人工智能领域,多模态学习是一个日益增长的研究领域,它涉及将来自不同源(如图像、文本、音频等)的信息结合起来。但高昂的训练计算成本限制了模型的普及性,使得小型机构和个人难以负担。而且现有模型在多语言能力上受…

结算协同,打通企业上下游业、财、票、资

市场变革,转型当先 随着电子发票的普及与数字化浪潮的涌动,企业正面临着前所未有的转型挑战。如何在快速变化的市场中站稳脚跟,提升竞争力?答案在于数字化转型,特别是供应链结算流程的革新。 无纸化、自动化&#xff0…

数字孪生为什么这么火?水务离不开它的原因又是什么?

数字孪生利用可视化技术结合视频融合、BIM、5G、物联网、云计算和大数据等先进技术,围绕实现水质达标、安全生产、高效节能等生产、运营和管理目标。它构建了一个三维场景,涵盖自来水厂区的建筑、生产设备、管线等设施,以实现对水厂实时运行信…

分享目前堪称最好用的车机桌面app,支持画中画模式!

好用的车机桌面了,支持悬浮画中画! 如果你想改变单调的车机桌面,那么这篇文章你不要错过了!支持地图悬浮、画中画的车机桌面,不要错过! 今天阿星给大家分享3款好用、好看的大屏桌面软件,重要的…

Python数据分析常用函数

Python基础 数字处理函数 Python提供了用于数字处理的内置函数和内置模块(math),使用内置模块,需要先导入 import math。 内置函数math模块abs(-5)返回绝对值math.ceil(2.3)返回不小于x的最小整数divmod(9,4)返回商和余数math.floor(2.3)返回不大于x的…

Unity OutLine 模型外描边效果

效果展示: 下载链接

十四天学会Vue——Vue核心(理论+实战)中篇(第二天)

声明:是接着上篇讲的哦,感兴趣可以去看一看~ 这里一些代码就不写了,为了缩减代码量,大家知道就可以了: Vue.config.productionTip false //阻止 vue 在启动时生成生产提示。热身小tips,可以安装这个插件&…

记一次重定向问题(浏览器安全)解决

近期做单点登陆功能,本身应该是一个很简单的功能,却发生了意向不到的问题…让我们看下: 首先第三方给出的地址需要通过JWT框架获取token拼接后跳转,我这边为了方便首选肯定是考虑用response.sendRedirect(url),但是做好…

源代码防泄漏方案需要具备哪些因素?

首选选择加密软件对公司来说是一项关键决策,需要细致考虑多个因素。 选择合适的加密软件:关键因素与推荐方案 一、稳定性:加密软件的核心 稳定性是评估加密软件的首要因素。一个不稳定的加密软件可能导致数据损坏或系统冲突,影响…

【机器学习】机器学习在信息安全领域中的典型应用

🚀🚀🚀传送门 🔒机器学习在信息安全领域中的典型应用📕利用机器学习检测恶意行为并阻断攻击🌈使用机器学习分析移动终端安全状况⭐借助机器学习提高信息安全分析水平🎬依靠机器学习自动完成重复…

“按摩”科技?

都说A股股民是特别善于学习的,这不市场又现新概念——“按摩科技”,成立仅6年,把上门按摩干到35亿营收也是没谁了,现在号称有1000万用户,3万家入驻商户数的按摩平台,难道就凭借2.5万名女技师,活…

【YOLO 系列】基于YOLO V8的学生上课行为检测系统【python源码+Pyqt5界面+数据集+训练代码】

前言 在现代教育环境中,学生上课行为的监测对于提升教学质量和学生学习效率具有重要意义。然而,传统的人工观察方法不仅效率低下,而且难以保证客观性和准确性。为了解决这一问题,我们启动了这个项目,目的是利用YOLOV8…

【LeetCode算法】第83题:删除排序链表中的重复元素

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路:双指针法,只需遍历一遍。使用low指向前面的元素,high用于查找low后面与low不同内容的节点。将具有不同内容的节点链接在low后面,实…

make disclean V=1 分析

文章目录 make distclean步骤1:2090-2114行,执行依赖 clean步骤2:2120-2124行,执行依赖 $(mrproper-dirs)步骤3:2118-2129行,执行依赖 mrproper步骤4:2135-2142行,实现 distclean 编…

恶意退市潮?

一张A4纸,炸出一池鱼。史上(最)严新规,这一拳打到了(违规减持)上。 新规算是对新国九条的补充,更是给大股东们上紧箍咒。那市场买账吗?昨晚爆出19家董监高亲属(违规&…

post请求

文章目录 一、get请求和post请求区别二、get请求和post请求的用法对比1.get请求2.post请求 三、如何知道是get请求还是post请求 一、get请求和post请求区别 二者区别就是一句话:post请求更安全 二、get请求和post请求的用法对比 1.get请求 get请求: 请求参数&am…

RK3568笔记二十七:LPRNet车牌识别

若该文为原创文章,转载请注明原文出处。 记录自训练并在RK3568上部署。 一、介绍 LPRNet的Pytorch实现,一种高性能和轻量级的车牌识别框架。完全适用于中国车牌识别(Chinese License Plate Recognition)及国外车牌识别&#xf…

Vue2和Vue3生命周期的对比

Vue2和Vue3生命周期的对比 Vue2 和 Vue3 生命周期对照表Vue2 和 Vue3 生命周期图示 Vue2 和 Vue3 生命周期对照表 触发时机Vue2.xVue3.x组件创建时运行beforeCreate setup createdsetup 挂载在DOM时运行beforeMountonBeforeMountmountedonMounted响应数据修改时运行beforeUpdat…