简述java中this,和super关键字的区别和作用

简介: 简述java中this,和super关键字的区别和作用

super

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

所以,super关键字有以下用法:

1, 引用: 父类对象 访问父类被遮盖的属性或调用父类被覆盖的方法。

super. :调用父类中属性或者方法

super.父类属性名:调用父类中的属性

super.父类方法名:调用父类中方法


2,super():用在子类的构造方法中,能够决定jvm在去构造父类对象时,调用父类哪一个构造方法

super(); 调用父类的无参构造方法

super(实参);调用父类的有参构造方法

super必须放在构造方法中的第一个语句

如果一个构造方法的第一句话,不是this(。。。),也不是super(。。。),
系统会默认添加 super();

  • super常常用来把构造参数传给父类,去设置父类的属性;
  • 构造方法常常用来设置属性,给属性赋值。
    构造方法中无参构造方法很重要,要尽量保证每个类都写一个无参构造方法

this关键字:

this关键字两个重要用法:

1, 引用 当前对象 当实例变量和局部变量命名冲突的时候,用this,表示实例变量

this.属性名 表示当前对象的属性

this.方法名(实参); 表示调用当前对象的方法

用在构造方法或者成员方法中

注意:当局部变量和成员变量 发生冲突时,使用this.进行区分

若不冲突,写不写this.都可以


2, 用在构造方法中 this(参数1,参数2,….) 调用本类的其他构造方法

必须是构造方法中的第一个语句,所以this只能用一次调用其他构造方法(同super)

this();调用当前对象的无参构造方法

this(实参); 调用当前对象的有参构造方法

只能定义在构造方法内,只能定义在有效代码第一行


注意:避免构造方法的递归调用

下面程序清晰讲明了super,this关键字的区别和作用:

   class TestSuper{
      public static void main(String[] args) {
         new B();//调用B  的无参构造方法
          System.out.println("--------------");
          new B("abcd");
      }
    }
    class A{
      private String name;
      public A(){
        System.out.println("A()");
      }
      public A(String str){
        this.name = str;
        System.out.println("A(String)"+name);
      }
    }
    class B extends A{
      public B(){
        super();  //默认添加,可写可不写,调用父类无参构造方法
        System.out.println("B()");
      }
      public B(String str){
        super(str);
        System.out.println("B(String)");
      }
    }
    //测试super关键字和this关键字的使用与区别
    class Super{
      protected int a= 10;
      public void method(){
        System.out.println("Super method()");
      }
    }
    //继承父类Super
    class Sub extends Super{
      int a = 20;
      //方法 的覆盖
      public void method(){
        System.out.println("Sub method()");
      }
      public void print(){
        int a = 30;
        System.out.println(a);//30,局部变量优先
        System.out.println(this.a);//20    引用当前实例对象
        System.out.println(super.a);//10  父类引用
        method();//sub method();  
        super.method();//Super method();
      }
    }
目录
相关文章
|
16天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
24天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
1月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
23 1
|
1月前
|
Java 编译器 C语言
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
42 2
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
35 1
|
27天前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
29天前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
67 0
|
6月前
|
Java
【JAVA学习之路 | 基础篇】super关键字
【JAVA学习之路 | 基础篇】super关键字
|
6月前
|
Java
Java中的super关键字
Java中的super关键字
51 0
|
数据安全/隐私保护
java------方法的覆盖[重写],super和final关键字
java------方法的覆盖[重写],super和final关键字