Java中的this和super实例浅析

要说this和super就不得不说Java的封装和继承了,首先说封装,这是一种思想,算不上一种技术,核心思想就是将对象的同一行为和状态看成是一个整体,将无需对外界暴露的属性和方法隐藏起来,比如一些方法的具体实现和一些私有的变量,通过公共的方法提供对属性的操作,从而提高安全性。

class Person {
 private String name = "无名氏";//私有的内部成员变量
 private int age = 20;//私有的内部成员变量
 public void sayHello(){//公有的方法,外界可以通过调用这个方法获得需要的功能
  System.out.println("我的名字是"+name+",今年"+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;
 }
}

然而这种封装也不是绝对的,当我们需要一些很相似的类的时候,往往希望能够通过一个类派生出许多的拥有共同的特性的类,比如通过动物这个类,派生出猫狗鸡鸭这些类,他们都拥有动物的特性,但是又各有特点。这就是Java中的继承,通过继承,我们可以获得父类所暴露给子类的所有成员,而又可以在父类的基础上构建自己特有的属性。

public class StaticDemo {
 public static void main(String[] args) {
  Student s = new Student();
  s.age = 20;//从父类继承的属性
  s.name = "张同学";
  s.stuNumber = 10;//子类特有的成员变量
  s.sayHello();//从父类继承的方法
  s.study();
 }
}
class Person {
 protected String name = "无名氏";// 子类共享的成员变量
 protected int age = 20;// 子类共享的成员变量
 public void sayHello() {// 公有的方法,外界可以通过调用这个方法获得需要的功能
  System.out.println("我的名字是" + name + ",今年" + age + "了");
 }
}
class Student extends Person {
 public int stuNumber = 20;// 学生特有的学号
 public void study() {// 学生特有的方法,学习
  System.out.println("好好学习!");
 }
}

至此,我们已经大概了解封装和继承,那下面就来看看this和super关键字是什么意思。
super关键字代表的是父类对象,this关键字代表的是当前对象。要理解这些,首先我们要看看子类在创建对象的时候执行了什么。为了方便起见,在此都使用无参构造方法。

编译器找到子类无参构造方法。

执行子类无参构造方法。

在子类无参构造方法的方法体中,第一句代码是隐藏得super();这句代码的意思是执行父类构造方法。

跳转到父类构造方法中,执行父类构造方法,注意,此时子类构造方法并未执行完毕,并且若父类还有父类,则一直执行上一层父类的构造方法,直到找到所有类的祖宗Object类。

将父类的对象的引用存入子类的super中,即子类中的super代表的是父类实体。然而在父类中,super代表的又是父类的父类的实体。

将创建出的当前类的引用存入this。

public class StaticDemo {
 public static void main(String[] args) {
  GirlStudent g = new GirlStudent();
  g.sayName();
 }
}
class Person {
 protected String name = "无名氏";// 子类共享的成员变量
 protected int age = 20;// 子类共享的成员变量
 public void sayHello() {// 公有的方法,外界可以通过调用这个方法获得需要的功能
  System.out.println("我的名字是" + name + ",今年" + age + "了");
 }
}
class Student extends Person {
 public int stuNumber = 20;// 学生特有的学号
 public String name = "张同学";
 public String getSuperName() {//获取当前类的父类名字的方法,对于student是父类,对于girlstudent则是爷爷类
  return super.name;//父类中的super代表的是父类的父类,即student的父类即person类,可以看出子类一旦初始化,将会创建出所有父类对象,一直到object
 }
}
class GirlStudent extends Student{
 public String name = "小红";
 public void sayName(){
  System.out.println("自己的名字是:"+this.name+",父类的名字是:"+super.name+",爷爷类的名字是:"+super.getSuperName());
 }
}

由此可以看出super的用途:用于调用子类隐藏的父类的属性,比如上述代码中的name属性,还有一个比较重要的用途就是用于调用被子类覆写的方法,此时方法名相同,必须使用super才能调用父类的方法。
this的用途:在变量定义不明确时,用来确定调用的具体是哪个变量。

 public void setName(String name){
  this.name=name;
 }

在上面的代码中由于传入的变量也是name,类中本来就存在一个变量也叫name,此时将不明确name是哪个,所以使用this进行区分。

PS:super和this的异同:

super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)

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

super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名    super.成员函数据名(实参)

this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

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

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

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

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

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

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

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

(0)

相关推荐

  • 详解Java使用super和this来重载构造方法

    详解Java使用super和this来重载构造方法 实例代码: //父类 class anotherPerson{ String name = ""; String age = ""; public String getAge() { return age; } public void setAge(String age) { this.age = age; } public void setName(String name){ this.name = name;

  • 详解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()的使用注意

    Java this()和super()的使用注意 使用super和this应该注意这些: 1)调用super()必须写在子类构造方法的第一行,否则编译不通过.每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错. 2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法. 3)super()和this()均需放在构造方法内第一行. 4)尽管可以用this调用一个构造器,但

  • 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和this的对比及使用

    Java super和this的对比及使用 super和this的异同 1)super(参数列表):调用父类中的某一个构造函数(应该为构造函数中的第一条语句) this(参数列表):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) 2)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名   super.成员函数据名(实参) this:它代表当前对象名(在程序中易产生二义性之处,应使用t

  • java this super使用方法详解

    super是Java语言的保留字,用来指向类的超类. 假设在Teacher类中定义了一个类变量boolean gender; 在子类的方法中gender就应该是指子类的gender变量,如果要引用超类的gender变量的话就必须使用 super.genderthis对象在类的构造方法中,要给对象的域进行初始化,这时如果参数和类变量同名,则类变量的名字将会被参数名屏蔽, 必须知道当前的对象名称,才能用对象名引用对象的域 复制代码 代码如下: public DotLoc(double XX,doub

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

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

  • 详解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实例浅析

    要说this和super就不得不说Java的封装和继承了,首先说封装,这是一种思想,算不上一种技术,核心思想就是将对象的同一行为和状态看成是一个整体,将无需对外界暴露的属性和方法隐藏起来,比如一些方法的具体实现和一些私有的变量,通过公共的方法提供对属性的操作,从而提高安全性. class Person { private String name = "无名氏";//私有的内部成员变量 private int age = 20;//私有的内部成员变量 public void sayHel

  • Java中的对象和对象引用实例浅析

    本文实例讲述了Java中的对象和对象引用.分享给大家供大家参考.具体分析如下: 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编

  • Java中自定义异常详解及实例代码

    Java中自定义异常详解及实例代码 下面做了归纳总结,欢迎批评指正 自定义异常 class ChushulingException extends Exception { public ChushulingException(String msg) { super(msg); } } class ChushufuException extends Exception { public ChushufuException(String msg) { super(msg); } } 自定义异常 En

  • java中stringbuffer线程安全分析实例详解

    在对于一些类作用于线程时,安全系数高的线程更推荐大家使用,在尽可能的程度上降低程序出错的可能性.对于本篇所要提到的StringBuffer而言,在其缓冲区中有多个线程的存在,我们在查询其内部方法时发现了锁的存在.现在我们就StringBuffer线程.锁的应用.线程安全分析逐步带来介绍. 1.StringBuffer线程说明 Java.lang.StringBuffer线程安全的可变字符序列.一个类似于String的字符串缓冲区,但不能修改.虽然在任意时间点上它都包含某种特定的字符序列,但通过某

  • java中ThreadLocal的应用场景实例分析

    说到线程的安全,我们可以通过ThreadLocal来解决.但作为一种强大的变量,它的应用场景远不止如此.在各类的框架中,我们依然可以使用来对它们进行管理.同时在使用ThreadLocal时需要注意内存泄漏的问题.下面我们就这两点进行分析,并带来对应代码的展示. 1.各种框架中的应用 Spring框架的事务管理中使用ThreadLocal来管理连接,每个线程是单独的连接,当事务失败时不能影响到其他线程的事务过程或结果,还有大家耳闻目睹的ORM框架.Mybatis也是用ThreadLocal管理,S

  • Java中双向链表详解及实例

    Java中双向链表详解及实例 写在前面: 双向链表是一种对称结构,它克服了单链表上指针单向性的缺点,其中每一个节点即可向前引用,也可向后引用,这样可以更方便的插入.删除数据元素. 由于双向链表需要同时维护两个方向的指针,因此添加节点.删除节点时指针维护成本更大:但双向链表具有两个方向的指针,因此可以向两个方向搜索节点,因此双向链表在搜索节点.删除指定索引处节点时具有较好的性能. Java语言实现双向链表: package com.ietree.basic.datastructure.dublin

  • java 中HttpClient传输xml字符串实例详解

    java 中HttpClient传输xml字符串实例详解 介绍:我现在有一个对象page,需要将page对象转换为xml格式并以binary方式传输到服务端 其中涉及到的技术点有: 1.对象转xml流 2.输出流转输入流 3.httpClient发送二进制流数据 POM文件依赖配置 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifact

  • java 中模式匹配算法-KMP算法实例详解

    java 中模式匹配算法-KMP算法实例详解 朴素模式匹配算法的最大问题就是太低效了.于是三位前辈发表了一种KMP算法,其中三个字母分别是这三个人名的首字母大写. 简单的说,KMP算法的对于主串的当前位置不回溯.也就是说,如果主串某次比较时,当前下标为i,i之前的字符和子串对应的字符匹配,那么不要再像朴素算法那样将主串的下标回溯,比如主串为"abcababcabcabcabcabc",子串为"abcabx".第一次匹配的时候,主串1,2,3,4,5字符都和子串相应的

  • java中的static{}块的实例详解

    java中的static{}块的实例详解 一直以来对static块不是很熟系,今天特意写了两个程序来搞清楚一下: 第一个小程序: package com.babyDuncan.Sohu; public class testStatic { static { int x = 5; } static int x, y; public static void main(String[] args) { x--; myMethod(); System.out.println(x + y + ++x);

随机推荐