`
peonyzzdx
  • 浏览: 590592 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

this和super用法和区别

阅读更多
一、this
Java关键字this只能用于方法方法体内。当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,这在“Java关键字static、final使用总结”一文中给出了明确解释。并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。下面给出一个使用this的综合实例,以便说明问题:



package org.leizhimin;

public class Test6 {

private int number;
private String username;
private String password;
private int x = 100;

public Test6(int n) {
  number = n;  // 这个还可以写为: this.number=n;
}

public Test6(int i, String username, String password) {
  // 成员变量和参数同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.
  this.username = username;
  this.password = password;
}

// 默认不带参数的构造方法
public Test6() {
  this(0, "未知", "空"); // 通过this调用另一个构造方法
}

public Test6(String name) {
  this(1, name, "空"); // 通过this调用另一个构造方法
}

public static void main(String args[]) {
  Test6 t1 = new Test6();
  Test6 t2 = new Test6("游客");
  t1.outinfo(t1);
  t2.outinfo(t2);
}

private void outinfo(Test6 t) {
  System.out.println("-----------");
  System.out.println(t.number);
  System.out.println(t.username);
  System.out.println(t.password);
  f(); // 这个可以写为: this.f();
}

private void f() {
  // 局部变量与成员变量同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.
  int x;
  x = this.x++;
  System.out.println(x);
  System.out.println(this.x);
}

//返回当前实例的引用
private Test6 getSelf() {
  return this;
}
}



运行结果如下:


-----------
0
未知

100
101
-----------
0
游客

100
101



看着上面的例子,说明在什么情况下需要用到this:

第一、通过this调用另一个构造方法,用发是this(参数列表),这个仅仅在类的构造方法中,别的地方不能这么用。



第二、函数参数或者函数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.成员变量名”的方式来引用成员变量。当然,在没有同名的情况下,可以直接用成员变量的名字,而不用this,用了也不为错,呵呵。



第三、在函数中,需要引用该函所属类的当前对象时候,直接用this。

其实这些用法总结都是从对“this是指向对象本身的一个指针”这句话的更深入的理解而来的,死记不然容易忘记而且容易搞错,要理解!



二、super

   super关键和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。
不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。下面是一个综合运用super的例子,有两个类:一个Father类,一个Father类的子类Son,通过这两个类完全演示了super的用法,一下是代码:



package org.leizhimin;

public class Father {
public String v="Father";
public String x="输出了Father类的public成员变量x!!!";

public Father() {
  System.out.println("Father构造方法被调用!");
}

public Father(String v){
  this.v="Father类的带参数构造方法!运行了.";
}
public void outinfo(){
  System.out.println("Father的outinfo方法被调用");
}

public static void main(String[] args) {
  // TODO 自动生成方法存根
}
}



package org.leizhimin;

public class Son extends Father{

public String v="Son";

public Son() {
  super();      //调用超类的构造方法,只能放到第一行.
  System.out.println("Son无参数构造方法被调用!");
  //super();      //错误的,必须放到构造方法体的最前面.
}

public Son(String str){
  super(str);
  System.out.println("Son带参数构造方法被调用!");
}
//覆盖了超类成员方法outinfo()
  public void outinfo(){
  System.out.println("Son的outinfo()方法被调用");
}

   public void test(){
 
  String v="哈哈哈哈!";   //局部变量v覆盖了成员变量v和超类变量v
 
  System.out.println("------1-----");
  System.out.println(v);   //输出局部变量v
  System.out.println(this.v);  //输出(子类)成员变量v
  System.out.println(super.v); //输出超类成员变量v
 
  System.out.println("------2-----");
  System.out.println(x);   //输出超类成员变量v,子类继承而来
  System.out.println(super.x); //输出超类成员变量v
 
  System.out.println("------3-----");
  outinfo();   //调用子类的outinfo()方法
  this.outinfo();  //调用子类的outinfo()方法
  super.outinfo(); //调用父类的outinfo()方法
}

public static void main(String[] args) {
  new Son().test();
 
}
}



子类Son运行结果:



Father构造方法被调用!
Son无参数构造方法被调用!
------1-----
哈哈哈哈!
Son
Father
------2-----
输出了Father类的public成员变量x!!!
输出了Father类的public成员变量x!!!
------3-----
Son的outinfo()方法被调用
Son的outinfo()方法被调用
Father的outinfo方法被调用



说明:次例子仅仅为了说明super的用法,实际在设计类的时候一般都尽可能私有(private)化。



通过上面的例子,下面总结一下super的用法:

第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。



第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。

第三、当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。



this、super的用法也不过这些,只有理解了其中的原理,才不会跌入陷阱!
分享到:
评论

相关推荐

    javathis和super用法 this和 super 关键字的区别

    在Java编程语言中,`this`和`super`是两个非常重要的关键字,它们在面向对象编程中扮演着不可或缺的角色。正确理解和使用这两个关键字对于编写高质量、易于维护的Java代码至关重要。 #### 二、`this`关键字详解 ##...

    Java中的this和super的用法 

    Java 中的 this 和 super 的用法 Java 中的 this 和 super 是两个非常重要的关键字,它们都是用来访问对象的成员变量和方法的。下面我们将详细地讨论这两个关键字的用法和区别。 一、基础知识 1. super(参数):...

    Java中this与super的用法

    下面我们将详细地讲解它们的用法和区别。 首先,让我们来看一下 this 关键字。this 关键字是用来访问当前对象的成员变量或方法的。例如,在某个方法中,如果有一个形参名与当前对象的某个成员变量同名,我们需要...

    java中this与super用法

    Java 中 this 与 super 用法 在 Java 中,this 和 super 是两个重要的关键字,它们都是用于访问当前对象或父类中的成员变量或方法的。 this 用法 this 的用法在 Java 中大体可以分为三种: 1. 普通的直接引用 在...

    Java中this、super用法.pdf

    Java 中的 this 和 super 用法 在 Java 中,this 和 super 是两个非常重要的关键字,它们在编程中扮演着重要的角色。本文将详细介绍 this 和 super 的用法和意义,以便读者更好地理解和掌握它们。 this 在 Java ...

    Java中this、super用法[归类].pdf

    this 和 super 的区别 this 和 super 都可以用来引用对象的成员变量或方法,但是它们的用途不同。this 用来引用当前对象的成员变量或方法,而 super 用来引用父类的成员变量或方法。 总结 在 Java 中,this 和 ...

    关于Java中this和super的用法介绍和区别共3页

    本篇将详细阐述`this`和`super`的用法以及它们的区别。 首先,`this`关键字是用来引用当前对象的引用。在类的方法或构造器中,`this`可以用来访问当前对象的成员变量,以区分同名的局部变量。例如: ```java ...

    static、this、super、final的JAVA用法

    Java 中 static、this、super、final 的用法 静态方法(static method)是一种特殊的方法,它可以在不需要创建对象的情况下被调用。Java 中的静态方法使用 static 关键字来修饰,例如 public static void main...

    java中this/super用法

    Java 中的 `this` 和 `super` 是两个非常重要的关键字,它们在编写面向对象程序时起到关键作用。`this` 关键字主要用来引用当前对象的属性和方法,而 `super` 关键字则用于引用父类的属性和方法。 1. `this` 关键字...

    Java中static、this、super、final用法

    ### Java中static、this、super、final用法详解 #### 一、static关键字的使用 在Java编程语言中,`static`是一个非常重要的关键字,它主要用于定义类成员(包括变量和方法),使得这些成员能够在不创建类实例的...

    Java中两个非常特殊的变量:this和super

    在Java编程语言中,`this`和`super`是两个非常关键的特殊变量,它们提供了在类和对象间导航的能力。这两个关键字无需提前声明,它们各自有着特定的用途。 首先,`this`关键字用于引用当前对象。在成员函数内部,`...

    this和super的异同点

    知道this有集中用法吗?this和super的区别呢?每个理论对应这实例。。可以边看边操作。。加油吧。。

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

    本文将深入探讨`super`的几种用法,并对比`this`关键字的区别。 1. **调用父类构造器**: 当子类创建一个新的实例时,如果需要调用父类的构造器,必须在子类构造函数的第一行使用`super()`,如下面的`Base`和`...

    Java中static、this、super、final用法简谈

    Java中的`static`、`this`、`super`和`final`是四个非常重要的关键字,它们在编程中扮演着至关重要的角色。这篇文章将简要介绍这些关键字的基本用法及其应用场景。 1. **static** `static`关键字用于声明类级别的...

    JAVA\Java开发中static、this、super和final用法

    在Java编程中,`static`、`this`、`super`和`final`是四个非常重要的关键字,它们各自有着特定的用途和含义。 1. **static关键字**: - `static`关键字主要用于声明静态成员(静态变量和静态方法)。静态成员属于...

Global site tag (gtag.js) - Google Analytics