`

java多态内存分析

阅读更多

      “  时针如果可以回头,熟悉那张脸,重温嬉戏这乐园,墙壁的松脱涂鸦已经褪色才明白存在的价值归于记忆。街角小店尚存在吗?这大时代会不会牵挂,过去现在花开怎么会等待。

      但有种意外不管痛不痛都有伤害,光阴远远离开,那笑声徘徊与脑海。但这一秒可笑不再可爱,当天心跳不在。

    时针如果可以暂停,能否去改变曾经演过的剧情,电影般改变的情节要删去的就随着岁月 消声 去迹。高贵的美酒和上汤,比不上家里亲切的小菜,太痛恨当天不懂得去忍耐。但这种意外,即使悔改免不了伤害。光阴远远离开,那痛楚徘徊于脑海,痛失所爱,错过以后有没有”

这是最近看的电影的一部主题曲,诶,时间啊、命运啊、轮回。这时候说什么努力就好,注重过程不在乎结果这样的话是空洞的。可能就是曲折和心酸才让人刻骨铭心啊。平凡的我,在茫茫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程序运行时主要涉及四种内存区域:程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8及以后版本中...

    C++和Java多态的区别

    ### C++和Java多态的区别 #### 一、概述 多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强...

    java中方法重载内存分析

    4. **动态绑定**:Java的多态特性使得方法的调用是基于对象的实际类型,而不是声明类型。因此,即使是同名方法,JVM也会根据实际类型找到正确的方法体并进行执行,这在内存分配上体现为对不同方法体的调用。 5. **...

    java中与继承有关的程序内存分析

    当我们谈论“java中与继承有关的程序内存分析”时,主要关注的是在Java程序运行时,内存是如何为继承体系的实例分配的。 Java内存主要分为三个区域:栈(Stack)、堆(Heap)和方法区(Method Area)。在讨论继承时...

    JAVA中的面向对象与内存解析

    在Java中,内存分为堆内存和栈内存。栈内存主要存储基本类型和对象引用,生命周期短,随着方法调用的结束而销毁。堆内存则用于存储所有对象实例,其生命周期较长,由垃圾回收器(Garbage Collector,GC)管理。当一...

    C++/Java代码分析器

    分析器对Java代码的解析,有助于用户理解其内存模型、垃圾回收机制以及异常处理等核心概念。 代码分析器的工作原理主要包括词法分析、语法分析和语义分析。词法分析阶段,分析器将源代码分解成一个个有意义的元素,...

    计算机软件Java编程特点及其技术分析 (1).pdf

    Java语言还通过引入垃圾回收机制(自动管理内存,避免内存泄漏),以及精简指针概念,进一步简化了编程的复杂性。 此外,Java语言还具有分布式的特点。Java从设计之初就考虑到了网络计算的需求,支持多种网络功能,...

    Java对象内存管理机制.docx

    这涉及到Java的多态特性,父类引用可以指向子类对象,但实际执行的是子类的方法。 5. **垃圾回收** - **对象生命周期**:Java使用垃圾收集器自动回收不再使用的对象所占用的内存。当一个对象不再被任何引用指向时...

    计算机软件Java编程特点分析.pdf

    以下是对Java编程特点的详细分析。 1. 简单易学 Java语言在设计上力求简单易用,因此它在语法上与C语言有较高的相似性,这使得C语言程序员能够更快地掌握Java。Java对C语言及C++进行了简化,摒弃了复杂的运算符和...

    Java模拟测验+答案编程资料JAVA-内存模型编程资料java模拟测验型及作业编程资料java模拟测验库编程资料java判断题

    - **内存模型**:Java内存模型主要包括堆、栈、方法区、程序计数器和本地方法栈等部分。其中,堆是对象实例存储的地方;栈用于存放局部变量;方法区存储类的信息;程序计数器记录下一条指令的位置;本地方法栈用于...

    Java零基础-对象的创建和使用-内存分析.md

    ### Java零基础-对象的创建和使用-内存分析 #### 知识点一:对象的创建 在Java中,对象的创建是通过`new`关键字完成的。对象创建的两个主要步骤包括分配内存和初始化对象。 1. **分配内存**:当使用`new`关键字时...

    Python-函数和内存分析 2.zip

    ================面向对象和内存分析================== 086.面向对象和面向过程的区别_执行者思维_设计者思维 087.对象的进化故事 088.类的定义_类和对象的关系 089.构造函数__init__ 090.实例属性_内存分析 091....

    Python-面向对象和内存分析 2.zip

    ================面向对象和内存分析================== 086.面向对象和面向过程的区别_执行者思维_设计者思维 087.对象的进化故事 088.类的定义_类和对象的关系 089.构造函数__init__ 090.实例属性_内存分析 091....

    JAVA版学生成绩分析程序综合性实验报告

    - Java语言的基础特性,如类、对象、封装、继承和多态,都在程序中得到体现。 - 程序结构以类为基本单位,例如`MyMenu`用于控制文件操作,`MyGradeList`处理成绩列表,`MyPath`管理文件路径,每个类都代表一种功能...

    Java学习笔记一

    本文将深入探讨Java的引用类型分析、传值内存解析以及继承和多态等核心概念,旨在帮助初学者和进阶者巩固基础,提升技能。 首先,让我们来谈谈Java的引用类型。在Java中,引用类型包括类(Class)、接口(Interface...

    CPlus_to_Java_Converter;C++转java工具

    3. **模板与泛型**:C++的模板提供了静态多态,而Java通过泛型实现了类似功能。转换器需要将模板转换为Java的泛型,但要注意Java泛型的边界和限制。 4. **异常处理**:C++的异常处理与Java的有所不同。转换器需要将...

    基于计算机软件开发的JAVA编程语言分析 (2).zip

    15. **JVM与内存管理**:Java虚拟机(JVM)负责解释和执行Java字节码,进行内存管理,包括堆内存、栈内存和方法区等,自动垃圾回收使得程序员无需手动管理内存。 这份资料“基于计算机软件开发的JAVA编程语言分析 ...

    计算机软件Java编程特点分析.zip

    本资料"计算机软件Java编程特点分析"将深入探讨Java作为编程语言的独特特性和优势,帮助开发者更好地理解和运用Java进行软件开发。 一、跨平台性 Java的核心理念是“一次编写,到处运行”(Write Once, Run ...

    基于计算机软件开发的Java编程语言分析.zip

    4. 内存管理:Java使用自动垃圾收集机制进行内存管理,程序员无需手动释放内存,降低了内存泄漏的风险。 5. 动态性:Java支持动态链接,可以方便地加载新的类和资源,使得程序具有高度的可扩展性。 三、Java在软件...

    JAVA课程报告分析技术

    2. **面向对象编程**:理解类、对象、继承、封装和多态等核心OOP概念,这是Java的核心特性,对于构建复杂系统至关重要。 3. **异常处理**:学习如何使用try-catch-finally语句块来捕获和处理运行时错误,确保程序的...

Global site tag (gtag.js) - Google Analytics