Java 进阶—— super 和 this 的用法

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

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public class Test6 {  
  2.     private int number;  
  3.     private String username;  
  4.     private String password;  
  5.     private int x = 100;  
  6.     public Test6(int n){  
  7.         number = n;  // 这个还可以写为: this.number=n;  
  8.     }  
  9. public Test6(int i, String username, String password){  
  10.   // 成员变量和参数同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.  
  11.     this.username = username;  
  12.     this.password = password;  
  13. }  
  14.  // 默认不带参数的构造方法  
  15. public Test6(){  
  16.     this(0"未知""空"); // 通过this调用另一个构造方法  
  17. }  
  18. public Test6(String name){  
  19.     this(1, name, "空"); // 通过this调用另一个构造方法  
  20. }  
  21. public static void main(String args[]){  
  22.     Test6 t1 = new Test6();  
  23.     Test6 t2 = new Test6("游客");  
  24.     t1.outinfo(t1);  
  25.     t2.outinfo(t2);  
  26. }  
  27. private void outinfo(Test6 t){  
  28.     System.out.println("-----------");  
  29.     System.out.println(t.number);  
  30.     System.out.println(t.username);  
  31.     System.out.println(t.password);  
  32.     f(); // 这个可以写为: this.f();  
  33.  }  
  34. private void f(){  
  35.   // 局部变量与成员变量同名,成员变量被屏蔽,用"this.成员变量"的方式访问成员变量.  
  36.     int x;  
  37.     x = this.x++;  
  38.     System.out.println(x);  
  39.     System.out.println(this.x);  
  40. }  
  41.    
  42.  //返回当前实例的引用  
  43. private Test6 getSelf(){  
  44.     return this;   
  45. }  
  46. }  

运行结果如下:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. -----------  
  2. 0  
  3. 未知  
  4. 空  
  5. 100  
  6. 101  
  7. -----------  
  8. 0  
  9. 游客  
  10. 空  
  11. 100  
  12. 101  

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

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

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

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

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

 

二、super
         super关键和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。

       不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。下面是一个综合运用super的例子,有两个类:一个Father类,一个Father类的子类Son,通过这两个类完全演示了super的用法,一下是代码:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public class Father{  
  2.     public String v="Father";  
  3.     public String x="输出了Father类的public成员变量x!!!";  
  4.   
  5.     public Father(){  
  6.         System.out.println("Father构造方法被调用!");  
  7.     }  
  8.    
  9.     public Father(String v){  
  10.         this.v="Father类的带参数构造方法!运行了.";  
  11.     }  
  12.     public void outinfo(){  
  13.         System.out.println("Father的outinfo方法被调用");  
  14.     }   
  15.     public static void main(String[] args){  
  16.   // TODO 自动生成方法存根  
  17.     }  
  18. }  
  19.    
  20. public class Son extends Father{  
  21.     public String v="Son";  
  22.    
  23.     public Son(){  
  24.         super();      //调用超类的构造方法,只能放到第一行.  
  25.         System.out.println("Son无参数构造方法被调用!");  
  26.         //super();      //错误的,必须放到构造方法体的最前面.  
  27.     }   
  28.    
  29.     public Son(String str){  
  30.         super(str);  
  31.         System.out.println("Son带参数构造方法被调用!");  
  32.     }  
  33.      //覆盖了超类成员方法outinfo()  
  34.     public void outinfo(){   
  35.         System.out.println("Son的outinfo()方法被调用");  
  36.     }   
  37.    
  38.     public void test(){  
  39.     
  40.     String v="哈哈哈哈!";   //局部变量v覆盖了成员变量v和超类变量v  
  41.     
  42.     System.out.println("------1-----");  
  43.     System.out.println(v);   //输出局部变量v  
  44.     System.out.println(this.v);  //输出(子类)成员变量v  
  45.     System.out.println(super.v); //输出超类成员变量v   
  46.     
  47.     System.out.println("------2-----");  
  48.     System.out.println(x);   //输出超类成员变量v,子类继承而来  
  49.     System.out.println(super.x); //输出超类成员变量v  
  50.     
  51.     System.out.println("------3-----");  
  52.     outinfo();   //调用子类的outinfo()方法  
  53.     this.outinfo();  //调用子类的outinfo()方法  
  54.     super.outinfo(); //调用父类的outinfo()方法  
  55.     }   
  56.        
  57.     public static void main(String[] args) {  
  58.         new Son().test();  
  59.     }  
  60. }  

子类Son运行结果:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. Father构造方法被调用!  
  2. Son无参数构造方法被调用!  
  3. ------1-----  
  4. 哈哈哈哈!  
  5. Son  
  6. Father  
  7. ------2-----  
  8. 输出了Father类的public成员变量x!!!  
  9. 输出了Father类的public成员变量x!!!  
  10. ------3-----  
  11. Son的outinfo()方法被调用  
  12. Son的outinfo()方法被调用  
  13. Father的outinfo方法被调用  

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

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

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

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

 

三、super和this的异同:

1)、super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)  
          this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)

2)、super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名    super.成员函数据名(实参)
           this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

 3)、调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

4)、super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。

5)、super()和this()均需放在构造方法内第一行。

6)、尽管可以用this调用一个构造器,但却不能调用两个。

7)、this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

8)、this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

9)、从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity中脚本编辑器UnIDE

引言 unity默认脚本编辑器是MonoDevelop,随着unity4.3面世,MonoDevelop (4.0.1)版本也随之而来,更新为界面更改和bug自动修复功能等,具体还未使用。 点击unity的Edit下的属性(preference),可以更改默认脚本编辑器&…

apk,task,进程区别

2019独角兽企业重金招聘Python工程师标准>>> apk,task,进程区别 apk一般占一个dalvik,一个进程,一个task。通过设置也可以多个进程,占多个task。 task是一个activity的栈,其中"可能"含有来自…

Java 线程 —— 基础篇

一、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe…

【Java并发性和多线程】线程安全及不可变性

2019独角兽企业重金招聘Python工程师标准>>> 本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/thread-safety-and-immutability.html 译文链接:http://ifeve.com/thread-safety-and-immutability/ 当多个线程同时访问…

Java 高级—— IO 基础

一、File 类 先看一下File 类的定义 [java] view plaincopy public class File extends Object implements Serizliable Comparable<File> 从定义看&#xff0c;File类是Object的直接子类&#xff0c;同时它继承了Comparable接口可以进行数组的排序。 File类的操作包括…

安装 SharePoint 2013 Foundation

一、Foundation版本的区别Foundation版本的区别见附件&#xff08;英文&#xff09;。官网下载地址 http://www.microsoft.com/zh-cn/download/details.aspx?id35488二、安装必备软件三、独立安装模式1. 启动安装向导2. 接受软件许可条款3. 选择服务器类型和数据位置4. 结束安…

Java 异常处理机制

异常处理是程序设计中一个非常重要的方面&#xff0c;也是程序设计的一大难点&#xff0c;从C开始&#xff0c;你也许已经知道如何用if...else...来控制异常了&#xff0c;也许是自发的&#xff0c;然而这种控制异常痛苦&#xff0c;同一个异常或者错误如果多个地方出现&#x…

架构师未来性的基础:简单性

作者&#xff1a;高焕堂&#xff0c;misoo.twqq.com 首页&#xff1a;Backee e架构师未来性的基础&#xff1a;简单性 Apple公司创始人乔布斯(Steve Jobs)曾说到&#xff1a;“简单比复杂更难&#xff0c;你必须努力让你的想法变得清晰…

Android 基础—— 对Context的理解与使用技巧

一、Context 基础概念 1、什么是Context 1) Context是一个抽象类&#xff0c;其通用实现在ContextImpl类中。 2) Context&#xff1a;是一个访问application环境全局信息的接口&#xff0c;通过它可以访问application的资源和相关的类&#xff0c;其主要功能如下&a…

Android 四大组件 —— 广播(广播机制解析)

在网络通信中&#xff0c;一个IP网络范围中最大的IP 地址是被保留作为广播地址来使用的。比如某个网络的IP 范围是192.168.0.XXX&#xff0c;子网掩码是255.255.255.0&#xff0c;那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一网络上的所有端口&#xff…

Android 基础 —— 活动的生存周期

一、返回栈 Android 中的活动是可以层叠的。我们每启动一个新的活动&#xff0c;就会覆盖在原活动之上&#xff0c;然后点击Back 键会销毁最上面的活动&#xff0c;下面的一个活动就会重新显示出来。 其实Android 是使用任务&#xff08;Task&#xff09;来管理活动的&#xff…

产品经理做市场调研和数据分析的方法

产品经理&#xff0c;你对用户的需求了解多少呢&#xff1f;你知道用户想要什么样的产品吗&#xff1f;你想知道用户将会如何看待你的产品吗&#xff1f;你想知道你设计的产品在用户中的口碑如何吗&#xff1f; 是 的。每一个产品经理都希望在产品开始立项设计前&#xff0c;得…

Android 基础 —— 活动的启动模式

活动的启动模式来说应该是个全新的概念&#xff0c;在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。启动模式一共有四种&#xff0c;分别是standard、singleTop、singleTask 和singleInstance &#xff0c; 可以在AndroidManifest.xml 中通过给<activity…

Android 四大组件 —— 服务

一、服务是什么 服务&#xff08;Service&#xff09;是Android 中实现程序后台运行的解决方案&#xff0c;它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面&#xff0c;即使当程序被切换到后台&#xff0c;或者用户打开了…

Highlighting System

Highlighting System 法线贴图漫反射着色器 Unity论坛&#xff1a;http://forum.unity3d.com/threads/143043-Highlighting-System-Released 需要条件 Requires Unity 3.5.6 or higher.This package requires Unity Pro, as it uses post-processing!Now supports Unity iOS Pr…

Android 基础 —— 模拟实现拨打电话功能

前面已经学习活动的显示跳转及隐式跳转&#xff0c;也学习 TextView 及 Button 两个控件的使用&#xff0c;下面我们来学习 EditText的使用&#xff1a; EditText 是程序用于和用户进行交互的另一个重要控件&#xff0c;它允许用户在控件里输入和编辑内容&#xff0c;并可以在程…

Android 四大组件 —— 活动(活动的隐式跳转)

上一篇我们讨论了活动的显示跳转&#xff0c;现在来学习活动的隐式跳转 相比于显式Intent&#xff0c;隐式Intent 则含蓄了许多&#xff0c;它并不明确指出我们想要启动哪一个活动&#xff0c;而是指定了一系列更为抽象的action 和category 等信息&#xff0c;然后交由系统去分…

ALAssetsLibrary-代码操作iOS相册资源

2019独角兽企业重金招聘Python工程师标准>>> 在iOS中&#xff0c;我们调用摄像头和选择相册中的资源&#xff0c;我们可以使用&#xff1a;UIImagePickerController类来完成。 当然&#xff0c;我们也可以不使用UI的形式来访问iOS设备的相册资源。 那就是使用&#…

Android 四大组件 —— 活动(使用Intent 实现活动的显示跳转)

一、什么是Intent&#xff1f;Intent的中文意思是目的。在Android中也是“目的”的意思。就是我们要去哪里&#xff0c;从这个activity要前往另一个Activity就需要用到Intent。 下面是 Intent 两个最基本的函数&#xff1a; 1、定义一个Intent [java] view plaincopy Intent in…

Android 项目在Eclipse中的目录结构

Android工程目录 如果使用Eclipse插件ADT开发应用程序&#xff0c;必须要熟悉工程的目录结构&#xff0c;清楚各个目录下面放置的是什么东西。Android工程主要的目录有&#xff1a;src、bin、gen、res等。 不同的Android平台目录结构是不同的&#xff0c;下面以Android 2.3.…