“ 时针如果可以回头,熟悉那张脸,重温嬉戏这乐园,墙壁的松脱涂鸦已经褪色才明白存在的价值归于记忆。街角小店尚存在吗?这大时代会不会牵挂,过去现在花开怎么会等待。
但有种意外不管痛不痛都有伤害,光阴远远离开,那笑声徘徊与脑海。但这一秒可笑不再可爱,当天心跳不在。
时针如果可以暂停,能否去改变曾经演过的剧情,电影般改变的情节要删去的就随着岁月 消声 去迹。高贵的美酒和上汤,比不上家里亲切的小菜,太痛恨当天不懂得去忍耐。但这种意外,即使悔改免不了伤害。光阴远远离开,那痛楚徘徊于脑海,痛失所爱,错过以后有没有”
这是最近看的电影的一部主题曲,诶,时间啊、命运啊、轮回。这时候说什么努力就好,注重过程不在乎结果这样的话是空洞的。可能就是曲折和心酸才让人刻骨铭心啊。平凡的我,在茫茫IT大军里显得多么微不足道,但是还是要向前看!
进入主题:既然是多态,那么先说说java多态的三个条件:
1、存在继承
2、父类引用指向子类对象
3、有方法的重写
条件1,继承。说到继承可以继承一个普通的类,也可以继承抽象类,甚至是implements接口。现在就着重讲一下,抽象类和接口。
看代码
public class Animal{ public void run(){ } } class Cat extends Animal{ public void run(){ } }
Cat继承Animal,考虑到很多的类都会继承Animal并且重写run方法,这时要把父类声明为抽象类,并且把run方法定义为抽象的方法
public abstract class Animal{
public abstract void run();
}
子类必须要按照规范来实现父类的方法。抽象类提供了模版
抽象类也可以定义普通的方法
public abstract class Animal{ public abstract void run(); public void breath(){ } }
增加了一个呼吸方法
问?能否在抽象类的普通方法里面调用抽象方法呢?
比如
public abstract class Animal{ public abstract void run(); public void breath(){ run(); } }
答案:可以,因为实现抽象的类是一个具体的类,必定实现了run()方法。
抽象类可以包含属性方法构造函数,但是不能被实例化,但是可以作为一个引用类型,引用子类的对象。
抽象类存在的意义就是被子类继承,因为抽象类不能实例化,要用只有子类来用。将方法的设计和实现分离开来。
抽象类里有实现,还不够简单,为了进一步地抽象,引入了接口,Interface。
接口中只有常量(public static final)和抽象方法(public abstract),是不变的东西,这就是规范,这就是java开发软件的优势
这样说有点抽象,取一个实际的例子。
飞机,石头,篮球这些相似度很低的东西,我们发现使用继承都不够用了,于是用接口来描述它们的特性(会飞,有攻击力)
定义接口
public Interface flyable{// 会飞 void fly(); } public Interface attacktion{ //可以攻击 void attack(); }
class fly implements flyable,attackion{ public void fly(){ Syso("飞机飞"); } public void attack(){ Syso(“开火攻击”); } } class stone implements flyable{ public void fly(){ Syso("石头被人丢着飞"); }
接口已经够简单了,一个类可以继承多个接口。
继承时的内存分析: 比如
继承关系如下 Object(toString()方法)——Animal(run方法,动物都可以动)——Bird(鸟是动物里面的一种,重写run方法,可以飞)
现在在main方法里 Bird bird=new Bird();
它的内存情况如下:Bird bird;就如同与 int a;引用变量在栈区,都是四个字节,假设在bird的值为a04ab233
执行new Bird(),在堆区生成一个对象,并且给成员初始化,同时成员方法的隐式参数super会去访问父类。也就是访问Animal里面的构造函数,run方法,最后Animal类的成员方法通过 隐式参数super访问父类 Object里的方法toString(),equals 等等。
继承就是这些了。
条件2:父类的引用指向子类的对象
此时父类引用调用重写的run方法,会直接地调用子类方法的语句,而不是父类的run方法,当然父类的run方法依旧存在,当引用执行父类对象就会调用父类的run方法了。
小例子让你理解:
多态为什么使用父类的引用指向子类的对象比如 Animal a=new Bird();执行 a.run();方法会执行鸟的run方法里的语句,
原因是:对象是子类的对象,只是引用变量用了父类的,实际的内容都是子类的啊,就比如你用一个普通背包装着一部acer的电脑,和用一个专用的电脑包装着这部电脑一样,内容都是这个电脑。
结合内存分析:
所以在java里面强制类型转换都是由高到低的转换。同一个等级的不同类不能强制类型转换报classcastException,低等级不能向高等级转换(除非出现 Animal a=new Bird(), Bird b=(Bird)a。因为
a是指向的子类对象)。
综述:多态的优势就是面向接口编程。
相关推荐
在深入探讨Java中多态的内存分析之前,我们需要先理解一些基本概念。 首先,了解Java内存模型至关重要。Java程序运行时主要涉及四种内存区域:程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8及以后版本中...
### C++和Java多态的区别 #### 一、概述 多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强...
4. **动态绑定**:Java的多态特性使得方法的调用是基于对象的实际类型,而不是声明类型。因此,即使是同名方法,JVM也会根据实际类型找到正确的方法体并进行执行,这在内存分配上体现为对不同方法体的调用。 5. **...
当我们谈论“java中与继承有关的程序内存分析”时,主要关注的是在Java程序运行时,内存是如何为继承体系的实例分配的。 Java内存主要分为三个区域:栈(Stack)、堆(Heap)和方法区(Method Area)。在讨论继承时...
在Java中,内存分为堆内存和栈内存。栈内存主要存储基本类型和对象引用,生命周期短,随着方法调用的结束而销毁。堆内存则用于存储所有对象实例,其生命周期较长,由垃圾回收器(Garbage Collector,GC)管理。当一...
分析器对Java代码的解析,有助于用户理解其内存模型、垃圾回收机制以及异常处理等核心概念。 代码分析器的工作原理主要包括词法分析、语法分析和语义分析。词法分析阶段,分析器将源代码分解成一个个有意义的元素,...
Java语言还通过引入垃圾回收机制(自动管理内存,避免内存泄漏),以及精简指针概念,进一步简化了编程的复杂性。 此外,Java语言还具有分布式的特点。Java从设计之初就考虑到了网络计算的需求,支持多种网络功能,...
这涉及到Java的多态特性,父类引用可以指向子类对象,但实际执行的是子类的方法。 5. **垃圾回收** - **对象生命周期**:Java使用垃圾收集器自动回收不再使用的对象所占用的内存。当一个对象不再被任何引用指向时...
以下是对Java编程特点的详细分析。 1. 简单易学 Java语言在设计上力求简单易用,因此它在语法上与C语言有较高的相似性,这使得C语言程序员能够更快地掌握Java。Java对C语言及C++进行了简化,摒弃了复杂的运算符和...
- **内存模型**:Java内存模型主要包括堆、栈、方法区、程序计数器和本地方法栈等部分。其中,堆是对象实例存储的地方;栈用于存放局部变量;方法区存储类的信息;程序计数器记录下一条指令的位置;本地方法栈用于...
### Java零基础-对象的创建和使用-内存分析 #### 知识点一:对象的创建 在Java中,对象的创建是通过`new`关键字完成的。对象创建的两个主要步骤包括分配内存和初始化对象。 1. **分配内存**:当使用`new`关键字时...
================面向对象和内存分析================== 086.面向对象和面向过程的区别_执行者思维_设计者思维 087.对象的进化故事 088.类的定义_类和对象的关系 089.构造函数__init__ 090.实例属性_内存分析 091....
================面向对象和内存分析================== 086.面向对象和面向过程的区别_执行者思维_设计者思维 087.对象的进化故事 088.类的定义_类和对象的关系 089.构造函数__init__ 090.实例属性_内存分析 091....
- Java语言的基础特性,如类、对象、封装、继承和多态,都在程序中得到体现。 - 程序结构以类为基本单位,例如`MyMenu`用于控制文件操作,`MyGradeList`处理成绩列表,`MyPath`管理文件路径,每个类都代表一种功能...
本文将深入探讨Java的引用类型分析、传值内存解析以及继承和多态等核心概念,旨在帮助初学者和进阶者巩固基础,提升技能。 首先,让我们来谈谈Java的引用类型。在Java中,引用类型包括类(Class)、接口(Interface...
3. **模板与泛型**:C++的模板提供了静态多态,而Java通过泛型实现了类似功能。转换器需要将模板转换为Java的泛型,但要注意Java泛型的边界和限制。 4. **异常处理**:C++的异常处理与Java的有所不同。转换器需要将...
15. **JVM与内存管理**:Java虚拟机(JVM)负责解释和执行Java字节码,进行内存管理,包括堆内存、栈内存和方法区等,自动垃圾回收使得程序员无需手动管理内存。 这份资料“基于计算机软件开发的JAVA编程语言分析 ...
本资料"计算机软件Java编程特点分析"将深入探讨Java作为编程语言的独特特性和优势,帮助开发者更好地理解和运用Java进行软件开发。 一、跨平台性 Java的核心理念是“一次编写,到处运行”(Write Once, Run ...
4. 内存管理:Java使用自动垃圾收集机制进行内存管理,程序员无需手动释放内存,降低了内存泄漏的风险。 5. 动态性:Java支持动态链接,可以方便地加载新的类和资源,使得程序具有高度的可扩展性。 三、Java在软件...
2. **面向对象编程**:理解类、对象、继承、封装和多态等核心OOP概念,这是Java的核心特性,对于构建复杂系统至关重要。 3. **异常处理**:学习如何使用try-catch-finally语句块来捕获和处理运行时错误,确保程序的...