java 内存接口_java中多态机制的内存解析、抽象类、接口

1、多态机制的内存解析

1)、多态的三要素

*类之间具有相互继承关系;

*子类重写父类的方法;

*父类引用指向子类对象;

2)、为了更加细致深入的了解多态运行的机制,将下列代码的在内存中运行的简图绘制出来

0599a3dab8b9

测试代码-重点关注在子类中调用父类方法后,父类方法中引用了自身的方法speak()和子类中重写的方法speak(),那么会执行哪一个呢?

0599a3dab8b9

内存图,重点关注多态中子类、父类创建的顺序

解析:

Human Jack = new Man();

java中每一个子类中均存在一个隐藏语句,super(),位于第一句话的位置,作用是指向直接父类,调用父类构造器,以上代码中,new Man(),时会首先运行Man中的super(),语句,指向Human类,接着Human中super()方法启动指向Object类,创建Object对象,结束Object中的super()语句,再创建Human对象,结束Human中super()语句,最后创建Man对象,并将以上对象存储在同一块连续内存中,将地址赋给Jack(Jack由main方法在栈中创建);

Jack.read();

通过Jack调用read()方法,首先程序会从Jack对象中由Man部分创建的对象找起,如果没有找到read()方法,则向上查找一级,查找Human中是否存在read()方法,有则调用,无则继续向上,如果Object中也不存在read()方法时,程序会报错;

程序执行read()方法后,发现又调用了speak()方法,也开始从Man构造的部分查起,有则执行,无则继续向上。

*注意以上过程只针对子类中重写的方法,对于子类中特有的方法,必须通过强制类型转换才能调用

对象方法中的隐藏形参this、super

*this永远指向最终的类创建的对象,本例中,所有方法的this均指向Man创建的对象;

*super永远指向直接父类对象,Man指向Human,Human指向Object

2、抽象类

1)、为什么需要抽象类

抽象类的设计目的,是代码复用。当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象类。在这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给各个子类自己实现。正是因为A-B在这里没有实现,所以抽象类不允许实例化出来(否则当调用到A-B时,无法执行)。

2)、抽象类的语法格式

[public] abstract class ClassName {

[public] abstract void fun();

}

3)、抽象类的特点

*抽象方法必须为public或protected,缺省时为public

*抽象类不能实例化对象

*子类继承抽象类则必须实现抽象类中的抽象方法,否则必须将子类改为抽象子类

*Java中继承是单继承,一个子类只能继承一个类(抽象类或普通类)

*抽象类体现的是类的抽象,是对事物性质的抽象,是整体的抽象

3、接口

1)、为什么需要接口

接口的设计目的,是对类的行为进行约束(更准确的说是一种“有”约束,因为接口不能规定类不可以有什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。(这一句是copy知乎:阿法利亚大佬的话,我还没有搞得很明白!)

2)、接口的语法格式

[public] interface InterfaceName {

}

class ClassName implements Interface1,Interface2,[....]{

}

接口中变量默认修饰符是:public static final 不可更改

接口中方法修饰符默认为:public abstract 不可更改

3)、接口的特点

*接口是一种抽象的概念,比抽象类更加抽象

*一个类可以实现多个接口

*接口体现为行为上的抽象,是局部的抽象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值