java 关键字super详解及用法

java 关键字super详解

一、super关键字  

  在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。

1.1.super关键字测试

 package cn.galc.test;

 /**
  * 父类
  * @author gacl
  *
  */
 class FatherClass {
   public int value;
   public void f() {
     value=100;
     System.out.println("父类的value属性值="+value);
   }
 }

 /**
 * 子类ChildClass从父类FatherClass继承
 * @author gacl
 *
 */
 class ChildClass extends FatherClass {
   /**
   * 子类除了继承父类所具有的valu属性外,自己又另外声明了一个value属性,
   * 也就是说,此时的子类拥有两个value属性。
   */
   public int value;
   /**
   * 在子类ChildClass里面重写了从父类继承下来的f()方法里面的实现,即重写了f()方法的方法体。
   */
   public void f() {
     super.f();//使用super作为父类对象的引用对象来调用父类对象里面的f()方法
     value=200;//这个value是子类自己定义的那个valu,不是从父类继承下来的那个value
     System.out.println("子类的value属性值="+value);
     System.out.println(value);//打印出来的是子类自定义的那个value的值,这个值是200
     /**
     * 打印出来的是父类里面的value值,由于子类在重写从父类继承下来的f()方法时,
	 * 第一句话“super.f();”是让父类对象的引用对象调用父类对象的f()方法,
     * 即相当于是这个父类对象自己调用f()方法去改变自己的value属性的值,由0变了100。
     * 所以这里打印出来的value值是100。
     */
     System.out.println(super.value);
   }
 }

 /**
 * 测试类
 * @author gacl
 *
 */
 public class TestInherit {
   public static void main(String[] args) {
    ChildClass cc = new ChildClass();
     cc.f();
   }
 }

运行结果:

1.2. 画内存分析图了解程序执行的整个过程

  分析任何程序都是从main方法的第一句开始分析的,所以首先分析main方法里面的第一句话:

ChlidClass cc = new ChlidClass();

  程序执行到这里时,首先在栈空间里面会产生一个变量cc,cc里面的值是什么这不好说,总而言之,通过这个值我们可以找到new出来的ChlidClass对象。由于子类ChlidClass是从父类FatherClass继承下来的,所以当我们new一个子类对象的时候,这个子类对象里面会包含有一个父类对象,而这个父类对象拥有他自身的属性value。这个value成员变量在FatherClass类里面声明的时候并没有对他进行初始化,所以系统默认给它初始化为0,成员变量(在类里面声明)在声明时可以不给它初始化,编译器会自动给这个成员变量初始化,但局部变量(在方法里面声明)在声明时一定要给它初始化,因为编译器不会自动给局部变量初始化,任何变量在使用之前必须对它进行初始化。

  子类在继承父类value属性的同时,自己也单独定义了一个value属性,所以当我们new出一个子类对象的时候,这个对象会有两个value属性,一个是从父类继承下来的value,另一个是自己的value。在子类里定义的成员变量value在声明时也没有给它初始化,所以编译器默认给它初始化为0。因此,执行完第一句话以后,

接下来执行第二句话:

1 cc.f();

  当new一个对象出来的时候,这个对象会产生一个this的引用,这个this引用指向对象自身。如果new出来的对象是一个子类对象的话,那么这个子类对象里面还会有一个super引用,这个super指向当前对象里面的父对象。所以相当于程序里面有一个this,this指向对象自己,还有一个super,super指向当前对象里面的父对象。

  这里调用重写之后的f()方法,方法体内的第一句话:“super.f();”是让这个子类对象里面的父对象自己调用自己的f()方法去改变自己value属性的值,父对象通过指向他的引用super来调用自己的f()方法,所以执行完这一句以后,父对象里面的value的值变成了100。接着执行“value=200;”这里的vaule是子类对象自己声明的value,不是从父类继承下来的那个value。所以这句话执行完毕后,子类对象自己本身的value值变成了200。

方法体内的最后三句话都是执行打印value值的命令,前两句打印出来的是子类对象自己的那个value值,因此打印出来的结果为200,最后一句话打印的是这个子类对象里面的父类对象自己的value值,打印出来的结果为100。

  到此,整个内存分析就结束了

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java this、final等关键字总结

    this 关键字this引用对象自身.它也可以在构造方法内部用于调用同一个类的其他构造方法. 隐藏的静态变量可以通过"类.静态变量"来引用,而隐藏的实例变量就需要使用"this.实例变量"来引用. 调用一个重载的构造方法this引用是必须的. this是个隐式参数,代表当前对象 publie class Student{ private String name; public void setName(String name){ this.name=name; //

  • 详谈Java多线程的几个常用关键字

    一.同步(synchronized)和异步(asynchronized) 1.同步(synchronized)简单说可以理解为共享的意思,如果资源不是共享的,就没必要进行同步.设置共享资源为同步的话,可以避免一些脏读情况. 2.异步(asynchronized)简单说可以理解为独立不受到其他任何制约. 举个例子: 线程1调用了带有synchronized关键字的方法methodA,线程2调用了异步方法methodB,出现的现象是同时控制台输出 t1,t2. package com.ietree.

  • Java 关键字 速查表介绍

    访问控制: private 私有的 protected 受保护的 public 公共的 类.方法和变量修饰符 abstract 声明抽象 class 类 extends 扩允,继承 final 终极,不可改变的 implements实现 interface 接口 native 本地 new 新,创建 static 静态 strictfp 严格,精准 synchronized 线程,同步 transient 短暂 volatile 易失 程序控制语句 break 跳出循环 continue 继续

  • JAVA关键字及作用详解

    Java关键字及其作用 一. 总览: 访问控制 private protected public 类,方法和变量修饰符 abstract class extends final implements interface native new static strictfp synchronized transient volatile 程序控制 break continue return do while if else for instanceof switch case default 异常

  • java 关键字super详解及用法

    java 关键字super详解 一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用. 1.1.super关键字测试 package cn.galc.test; /** * 父类 * @author gacl * */ class Fathe

  • Java中finalize()详解及用法

     Java中finalize()详解 在程序设计中,我们有时可能希望某些数据是不能够改变的,这个时候final就有用武之地了.final是Java的关键字,它所表示的是"这部分是无法修改的".不想被改变的原因有两个:效率.设计.使用到final的有三种情况:数据.方法.类.        一. final数据 有时候数据的恒定不变是很有用的,它能够减轻系统运行时的负担.对于这些恒定不变的数据我可以叫做"常量"."常量"主要应用与以下两个地方: 1

  • Java Thread多线程详解及用法解析

    最全面的java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法. 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); public Thread(Runnab

  • Java 关键字static详解及实例代码

    一. static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概念,在Java中static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块. Java把内存分为栈内存和堆内存,其中栈内存用来存放一些基本类型的变量.数组和对象的引用,堆内存主要存放一些对象.在JVM加载一个类的时候,若该类存在static修饰的成员变量和成员方法,则会为这些成员变量和成员方法在固

  • java Class.getSimpleName() 详解及用法

    java Class.getSimpleName() 的用法 Usage in android: private static final String TAG = DemoApplication.class.getSimpleName(); 实例代码: public class sample{ public static void main(String[] args){ //得到类的简写名称 System.out.println(sample.class.getSimpleName());

  • Java  Thread多线程详解及用法解析

    最全面的java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法. 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); public Thread(Runnab

  • Java关键字this与super详解用法

    目录 一.this 关键字的使用 1. 概述 2. 作用 3. 使用 3.1 修饰属性和方法 3.2 调用构造器 3.3 返回当前对象 二.super关键字的使用 1. 概述 2. 使用 3. 使用 3.1 调用属性和方法 3.2 调用构造器 三.this和super的区别 四.子类对象实例化的全过程 一.this 关键字的使用 1. 概述 this是什么? 在Java中,this关键字比较难理解,它的作用和其词义很接近,表示“当前”的意思. 2. 作用 this关键字可以用来修饰.调用:属性.

  • java super关键字知识点详解

    在对一些父类的调用上,我们需要借助java中的关键字使用,这就是super关键字,可以归纳为三种方法:作用于类.方法名和构造函数.可以把它看做是使用父类的一个工具,相信大家在之前类的使用中有所接触.下面我们就super的说明.三种用法.注意事项进行说明,然后在实例中体会用法. 1.说明 super相当于是指代当前的对象的父类,调用父类的属性.方法和构造方法 2.用法 (1)super.变量/对象名: 使用这种方法可以直接访问父类中的变量或对象,进行修改赋值等操作 (2)super.方法名():

  • Java中super和this的用法详解

    super 用法 super关键字用来访问父类内容,具体用法可分为三种: 1.子类的成员方法访问父类的成员变量 public class Animal { public int age = 10; } class Dog extends Animal { public int age = 5; public void showAge() { System.out.println(super.age); } } 2.子类的成员方法访问父类的成员方法 public class Animal { pu

  • Java中的关键字synchronized 详解

    在并发编程中,synchronized关键字是常出现的角色.之前我们都称呼synchronized关键字为重量锁,但是在JDK1.6中对synchronized进行了优化,引入了偏向锁.轻量锁.本篇介绍synchronized关键字的使用方式,区别和偏向锁.轻量锁和重量锁实现原理. 先看看synchronized关键字的4种用法. 1.修饰普通方法 private synchronized void synMethod(){ } 这种用法中,synchronized锁的对象实例. 2.修饰静态方

随机推荐