举例讲解Java编程中this关键字与super关键字的用法

this
总要有个事物来代表类的当前对象,就像C++中的this指针一样,Java中的this关键字就是代表当前对象的引用。
它有三个主要的作用:
1、在构造方法中调用其他构造方法。
      比如有一个Student类,有三个构造函数,某一个构造函数中调用另外构造函数,就要用到this(),而直接使用Student()是不可以的。
2、返回当前对象的引用。
3、区分成员变量名和参数名。
看下面的例子:

public class Student
{
  private String name;
  private int age;
  private String college;
  public Student()
  {
    age = 20;
  }
  public Student(String name)
  {
    this();//can not be call Student,only use this() method.
    this.name = name;
    System.out.println("this student name is "+name);
  }
  public Student(String name,String college)
  {
    this(name);//C++中可以直接用Student(name)调用其他构造函数
    this.college = college;
    System.out.println("this student name is "+name+" college is "+college);
  } 

  public Student upgrade()
  {
    age++;
    return this;
  } 

  public void print()
  {
    System.out.println("name is: "+name
        +" age is: "+age
        +" college is: "+college);
  } 

  public static void main(String[] args)
  {
    Student student1 = new Student("linc");
    Student student2 = new Student("linc","shenyang college");
    student2.upgrade().print();
  }
}

迷失在茫茫的对象海洋时,不要忘了用this来找到自我。

super
super是this的父辈。从面相对象的角度说,这两个概念是很好理解的。
子类从父类继承过来,父类的protected及以上的属性和方法在子类中是天生就具有的。那么,为什么还要有super这个关键字?
第一、看父类的构造
子类构造时要先调用父类的默认构造函数的,这与C++的构造属性一致。当父类有多个构造函数时,你需要指定调用哪个。这是就需要使用super(arg1,arg2...)。
需要注意的是,在子类的构造函数中调用基类的构造函数时,必须要把super写作最前面,否则报错。
第二,在子类覆盖父类的一些方法中再调用父类的此方法。大家都知道,在子类中覆盖父类的一些方法是面向对象中多态的一种方式,而因为其他种种原因,需要在此方法中调用父类的此方法,用以区分,此时需要使用super来完成。

public class ClassLeader extends Student
{
  private String duty;
  public ClassLeader()
  {
    duty = "class monitor";
  }
  public ClassLeader(String duty,String name,String college)
  {
    super(name,college);
    this.duty = duty;
  } 

  public void print()
  {
    super.print();
    System.out.println("duty is " + duty);
  } 

  public static void main(String[] args)
  {
    ClassLeader leader = new ClassLeader("life","linc","shenyang");
  leader.print();
  }  

}

将两个类文件放在同一个目录,编译并运行:

D:\workspace\Java\project261\super>javac -d . *java 

D:\workspace\Java\project261\super>java ClassLeader

运行结果:

this student name is linc
this student name is linc college is shenyang
name is: linc age is: 20 college is: shenyang
duty is life

看看在其他语言中是怎样来处理的:
C#中提供了base关键字来完成super相似的功能,C++直接用基类的名字来调用。

(0)

相关推荐

  • 详解java中this.getClass()和super.getClass()的实例

    详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. getClass()是java中Object类的一个方法,其原型为: public final Class<?> getClass() 返回值为 当前运行时类的Class对象. 所以写了一段代码来说明: getClass()不受this和super影响,而是有当前的运行类决定的. 代码如下: 父类

  • java中this与super关键字的使用方法

    java中this与super关键字的使用方法 这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~ this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this的用法在java中大体可以分为3种: 1.普通的直接引用 这种就不用讲了,this相当于是指向当前对象本身. 2.形参与成员名字重名,用this来区分: class Person { private int age = 10; public Perso

  • java方法重写和super关键字实例详解

     java方法重写和super关键字  在继承中,其实就是子类定义了和父类同名的方法 就是方法,属性都是相通的 重写限制:  被子类重写的方法不能拥有比父类方法更加严格的权限 super:强行调用父类方法的执行 重载和重写的区别?  重 载是发生在一个类中   对权限没有要求   而且重载的方法参数可以不同 重写发生在继承汇总      被子类重写的方法不能拥有比父类方法更加严格的权限,重写的方法中参数名字完全相同  实例代码: class A{ public void tell(){ Syst

  • Java super关键字的使用方法详解

    构造方法中的super关键字 在Java子类的构造方法中可以通过super关键字来调用父类的构造方法.其用法为: 1) super(); 访问父类中的无参构造函数 2) super (paras-); 访问父类中的成员函数yyy super()来调用父类无参的构造方法,但即使不使用super(),默认也会调用父类无参的构造方法.父类无参的构造方法可以是自定义的无参构造方法,也可以是编译器自动生成的默认构造方法.但如果父类中定义了有参的构造方法,但没有定义无参的构造方法,这时编译器不会生成默认构造

  • java之super关键字用法实例解析

    本文实例讲述了java中super关键字的用法.分享给大家供大家参考.具体方法分析如下: super关键字:在java中使用super来引用基类的成分. 程序代码如下: class FatherClass{ public int value; public void f(){ value = 100; System.out.println("FatherClass.value:"+value); } } class ChildClass extends FatherClass{ pri

  • 详解Java中super的几种用法并与this的区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 复制代码 代码如下: class Base { Base() { System.out.println("Base"); } } public class Checket extends Base { Checket() { super();//调用父类的构造方法,一定要放在方法的首个语句 System.out.println("Checket"); } public static voi

  • 举例讲解Java编程中this关键字与super关键字的用法

    this 总要有个事物来代表类的当前对象,就像C++中的this指针一样,Java中的this关键字就是代表当前对象的引用. 它有三个主要的作用: 1.在构造方法中调用其他构造方法.       比如有一个Student类,有三个构造函数,某一个构造函数中调用另外构造函数,就要用到this(),而直接使用Student()是不可以的. 2.返回当前对象的引用. 3.区分成员变量名和参数名. 看下面的例子: public class Student { private String name; p

  • 举例讲解Java设计模式中的对象池模式编程

    定义 一个对象池是一组已经初始化过且可以使用的对象的集合,池的用户可以从池子中取得对象,对其进行操作处理,并在不需要时归还给池子而非销毁它. 若初始化.实例化的代价高,且有需求需要经常实例化,但每次实例化的数量较少的情况下,使用对象池可以获得显著的效能提升.从池子中取得对象的时间是可预测的,但新建一个实例所需的时间是不确定. 实现 1. Reusable - 对象池中的对象,通常实例化代价比较高. 2. Client - 使用一个对象的实例. 3. ReusablePool - 管理对象的实例化

  • 讲解Java编程中finally语句的基本使用方法

    在java中的finally关键一般与try一起使用,在程序进入try块之后,无论程序是因为异常而中止或其它方式返回终止的,finally块的内容一定会被执行,写个例子来说明下: public class TryAndFinallyTest { public static void main(String[] args) throws Exception{ try{ int a = testFinally(2); System.out.println("异常返回的结果a:"+a); }

  • 举例讲解Swift编程中switch...case语句的用法

    Switch作为选择结构中必不可少的语句也被加入到了Swift中,只要有过编程经验的人对Switch语句都不会感到陌生,但苹果对Switch进行了大大的增强,使其拥有其他语言中没有的特性.使用Switch语句很简单: var i = 0 switch i { case 0: "0" //被输出 case 1: "1" default: "2" } 在这个最简单的Switch语句中,与其他语言很不同的一点是:不用显式的加上break.Swift的S

  • 实例讲解Java编程中数组反射的使用方法

    什么是反射 "反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为."这个概念常常会和内省(Introspection)混淆,以下是这两个术语在Wikipedia中的解释: 内省用于在运行时检测某个对象的类型和其包含的属性: 反射用于在运行时检测和修改某个对象的结构及其行为. 从它们的定义可以看出,内省是反射的一个子集.有些语言支持内省,但并不支持反射,如C++. 内省示例:instanceof 运算符用于检测某个对象是否属于特定的类. if (obj inst

  • 举例讲解C#编程中对设计模式中的单例模式的运用

    单例模式的介绍 说到单例模式,大家第一反应应该就是--什么是单例模式?,从"单例"字面意思上理解为--一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法罢了,下面给出单例模式的一个官方定义:确保一个类只有一个实例,并提供一个全局访问点.为了帮助大家更好地理解单例模式,大家可以结合下面的类图来进行理解,以及后面也会剖析单例模式的实现思路: 为什么会有单例模式 看完单例模式的介绍,自然大家都会有这样一个疑问--为什么要有单例模式的?它在什么情况下使用的?从单例模式的

  • 举例讲解C#编程中委托的实例化使用

    合并委托 本示例演示如何创建多播委托. 委托对象的一个有用属性是:可以使用 + 运算符将多个对象分配给一个委托实例.多播委托包含已分配委托的列表.在调用多播委托时,它会按顺序调用列表中的委托.只能合并相同类型的委托. - 运算符可用于从多播委托中移除组件委托. using System; // Define a custom delegate that has a string parameter and returns void. delegate void CustomDel(string

  • 举例讲解Python编程中对线程锁的使用

    锁 python的内置数据结构比如列表和字典等是线程安全的,但是简单数据类型比如整数和浮点数则不是线程安全的,要这些简单数据类型的通过操作,就需要使用锁. #!/usr/bin/env python3 # coding=utf-8 import threading shared_resource_with_lock = 0 shared_resource_with_no_lock = 0 COUNT = 100000 shared_resource_lock = threading.Lock()

  • 浅谈Java编程中的synthetic关键字

    java synthetic关键字.有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synthetic field.小颖编译工具用的就是jad.所有反编译工具都不能保证完全正确地反编译class.所以你不能要求太多. 下面我给大家介绍一下synthetic 下面的例子是最常见的synthetic field Java代码 class parent { public void foo() { } class inner { inner() { foo

  • Java编程中实现Condition控制线程通信

    java中控制线程通信的方法 1.传统的方式:利用synchronized关键字来保证同步,结合wait(),notify(),notifyAll()控制线程通信.不灵活. 2.利用Condition控制线程通信,灵活. 3.利用管道pipe进行线程通信,不推荐 4.利用BlockingQueue控制线程通信 本文就讲解利用Condition控制线程通信,非常灵活的方式. Condition类是用来保持Lock对象的协调调用. 对Lock不了解的可以参考:Java线程同步Lock同步锁代码示例

随机推荐