Java多态的内存机制

学习java也快一年多了,看过很多方面的书,也喜欢在网络上学习优秀的java资料。但是每当自己打开myeclipse时,总是那么的不自信…………,java基础部分的内容自己以及掌握,并能很好运用,加油吧,多实践,多总结,一定会有所突破的。老银每天进步一点点。

  今天就总结一下,自己看过的资料上好的列子。

  1:java面向对象特征:抽象,封装,继承,多态。

  抽象:

  封装:

  继承:

  多态:

  写一个类,来完成以上所包含的抽象,封装,继承内容


class LaoYin extends Thread implements Runnable{

private int  Number=1111111;

private String name ="loayin";

@Override

public void run() {

System.out.println("java学习者");

}

}

java中通过重载,和重写机制来实现多态。

/**

*

* @author YXP 小技巧:当我们想让类中的私有变量让外界访问到:使用SET();GET().

* 简单方法是选中这些变量,右键,source  然后Ganerate Gater and Seter,即可。

*

*/

public class DuoTai {

String  name;

int   age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void cry(){

System.out.println("不知道怎么叫");

}

public  static void main (String[] args){

DuoTai an=new Cat();

an.cry();

DuoTai ni=new Dog();

ni.cry();

}

}

class Cat extends DuoTai{

public void cry(){

System.out.println("喵喵 ");

}

}

class Dog extends DuoTai{

public void cry(){

System.out.println("汪汪叫");

}

}

 答案肯定是我们要的答案,父类调用子类的方法来为自己声明对象。

  但是如果我们改变一下,关于类的成员变量,这里有很大的乐趣………………

  为每一个类声明一个一样的成员变量 count

  基类100,cat是5,dog是50;

  通过多态给基类声明对象,然后通过对象进行调用变量。我们瞧瞧看。


/**

*

* @author YXP 小技巧:当我们想让类中的私有变量让外界访问到:使用SET();GET().

* 简单方法是选中这些变量,右键,source  然后Ganerate Gater and Seter,即可。

*

*/

public class DuoTai {

String  name;

int   age;

int count=100;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void cry(){

System.out.println("不知道怎么叫");

}

public  static void main (String[] args){

DuoTai an=new Cat();

an.cry();

System.out.println(an.count);

DuoTai ni=new Dog();

System.out.println(ni.count);

ni.cry();

}

}

class Cat extends DuoTai{

int count=5;

public void cry(){

System.out.println("喵喵 ");

}

}

class Dog extends DuoTai{

int count=50;

public void cry(){

System.out.println("汪汪叫");

}

}

  运行看看:F11

  喵喵

  100

  100

  汪汪叫

  现在我们就可以很好的明白多态的机制了,但是我有点晕了,对于这个用多态实现的对象,它内存中是如何实现的呢

  当然main栈区呢  有na  ni

  但堆内存中是什么样的内???

  ni(栈内存)

  int count(自身的成员变量) 上下

  cry()子类覆写的cry       (如何现实的不造,原理) 纠结的感觉

  只能是父类引用子类的构造函数,反过来不行。

  多态引用变量会调用子类的方法,但是堆内存上依然存储的是自己的成员变量,只是方法指向了子类的方法吗??。

  如果是指向子类的方法,那么子类必须要实现实例化,所以不成立

  如果子类中有父类不曾有的方法,看看ni还能不能调用,即可知道。

  答案不用说啦,编译不能通过。

  ok,我感觉自己有点明白了一些,多态就是用子类的调用方法,来将子类中重写的父类方法,让父类调用。即父类对象的框架上,将子类的覆写方法覆盖父类的方法,当然父类类上不存在的方法,对象没有内存空间存放子类方法,编译自然就有问题了。总之,多态就是与覆写方法有关,与成员变量无关。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-22 00:23:44

Java多态的内存机制的相关文章

java-Java中string类型在内存机制的存储问题

问题描述 Java中string类型在内存机制的存储问题 package chapter3; public class RefAndAdd { public static void main(String[] args) { String str = ""abc""; String str1 = ""ab""; String str2 = str1 + ""c""; String str

java的内存机制

问题描述 一个非常简单的问题,String a="1";String a=new String("1");问题如下:两个内存机制不一样是肯定的吧,String a=new String("1");里面a是引用,a装的是1在内存里面的地址,也就是占用了两块内存String a="1";里面a装的直接是值,只占用一块内存???? 解决方案 String a="1"; a指向String的常量池中的"1

哪位高手帮忙详细讲一下java中对象内存的处理机制(可以参考下面程序),非常感谢!!

问题描述 publicclassHideTest1{publicstaticvoidmain(String[]args){A1a1=newA1();a1.setx(4);//A1中的成员变量x=4a1.printa();B1b1=newB1();b1.printb();b1.printa();b1.setx(6);//将继承来的x值设置为6b1.printb();b1.printa();a1.printa();}}classA1{intx=2;publicvoidsetx(inti){x=i;}

详解Java的堆内存与栈内存的存储机制_java

堆与内存优化    今天测了一个项目的数据自动整理功能,对数据库中几万条记录及图片进行整理操作,运行接近到最后,爆出了java.lang.outOfMemoryError,java heap space方面的错误,以前写程序很少遇到这种内存上的错误,因为java有垃圾回收器机制,就一直没太关注.今天上网找了点资料,在此基础上做了个整理.  一.堆和栈     堆-用new建立,垃圾回收器负责回收          1.程序开始运行时,JVM从OS获取一些内存,部分是堆内存.堆内存通常在存储地址的

Java中堆内存和栈内存详解

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存

全面理解java中的异常处理机制_java

一.java异常总结: 异常就是程序运行时出现不正常运行情况 1.异常由来: 通过java的类的形式对现实事物中问题的描述,并封住成了对象 其实就是java对不正常情况描述后的对象体现 2.对于问题的划分有两种:一种是严重的问题,一种是非严重的问题 对于严重的,java通过Error类来描述 对于Error一般不编写针对性的代码对其进行处理 对于非严重的,java通过Exception类来描述 对于Exception可以使用针对性的处理方式进行处理 3.常见的异常有:数组角标越界异常,空指针异常

析JAVA之垃圾回收机制

本文为2010年编写,所以有很多看法不是很准确,有一定的参考价值,如需要更加深入细节,请参看,2012年编写的关于JVM的文章: 认识JVM--第一篇-对象生成&回收算法 认识JVM--第二篇-java对象内存模型 JVM第三篇(简单demo) 系统架构-性能篇章1(应用系统性能2-OOM&参数配置) 相继的还会有更多的java深入的知识和机制. 对于JAVA编程和很多类似C.C++语言有一个巨大区别就是内存不需要自己去free或者delete,而是由JVM垃圾回收机制去完成的.对于这个过

Java系统中内存泄漏测试方法的研究

摘 要 稳定性是衡量软件系统质量的重要指标,内存泄漏是破坏系统稳定性的重要因素.由于采用垃圾回收机制,Java语言的内存泄漏的模式与C++等语言相比有很大的不同.全文通过与C++中的内存泄漏问题进行对比,讲述了Java内存泄漏的基本原理,以及如何借助Optimizeit profiler工具来测试内存泄漏和分析内存泄漏的原因,在实践中证明这是一套行之有效的方法. 关键词 Java; 内存泄漏; GC(垃圾收集器) 引用; Optimizeit 问题的提出 笔者曾经参与开发的网管系统,系统规模庞大

Java的垃圾回收机制研究

一.谁在做Garbage Collection? 一种流行的说法:在C++里,是系统在做垃圾回收;而在Java里,是Java自身在做. 在C++里,释放内存是手动处理的,要用delete运算符来释放分配的内存.这是流行的说法.确切地说,是应用认为不需要某实体时,就需用delete告诉系统,可以回收这块空间了.这个要求,对编码者来说,是件很麻烦.很难做到的事.随便上哪个BBS,在C/C++版块里总是有一大堆关于内存泄漏的话题. Java采用一种不同的,很方便的方法:Garbage Collecti