Java中的this和super关键字

昨天在技术分享时,给工作室前端和UI的同学讲解OOP概述,但是感觉自己this和super没有给大家讲明白,特意自己复习了一遍JavaSE中的相关知识,总结成博客。

一、this 与 super 的地位

首先我们需要回忆一个概念,所有对象的父类都是 Object 类,这就意味着,所有的对象实例化的时候都需要先调用 Object 的无参构造方法;

而连接对象和 Object 至少需要一条道路,而 this 和 super 就是这个最重要的桥梁;

而 this 和 super 两个往往身藏功与名,默默无闻,很多情况都可以省略。
比如:

  • 本类方法调用本类属性
  • 本类方法调用另一个本类方法
  • 子类构造方法隐含调用 super()

二、类创建的过程


任何类在创建之初,都有一个默认的无参构造方法,它是 super() 的一条默认通路。构造方法的参数列表决定了调用通路的选择;如果子类指定调用父类的某个构造方法,super 就会不断的向上溯源(每个对象必然是继承一个父类,这块地意思就是沿着一层一层的路径找到 Object 类);如果没有指定,则调用 super() 。如果父类没有提供默认的构造方法,子类在继承时就会编译错误。

class Father{
    public Father(int a){
    }
}

//这块就会报错,因为子类没有明确的指定继承父类的某个构造方法,而且父类也没有默认的无参构造方法
class Son1 extends Father{          
}

//正确的方式
class Son2 extends Father{  
     public Son2{
           super(1);
     }        
}

如果父类坚持不提供无参的构造方法,就必须如上代码的Son2类的无参构造方法中使用 super 方式调用父类的某个有参构造方法。

2.1 this 的作用

一个实例变量可以通过 this. 赋值另一个实例变量;一个实例方法可以通过 this. 调用另一个实例方法;甚至一个构造方法也可以通过 this. 调用另一个构造方法。

2.2 super的作用

1、普通的直接引用

与this类似,super相当于是指向当前对象的父类,这样就可以用super.xxx来引用父类的成员。

2、子类中的成员变量或方法与父类中的成员变量或方法同名。

3、引用构造函数

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

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

2.3 this 和 super 使用注意

(1) 如果 this 和 super 指代构造方法,则必须位于方法体的第一行。换句话说,在一个构造方法中,this 和 super 只能出现一个,且只能出现一次,否则在实例化对象时,会因为子类调用多个构造方法而造成混乱。

(2) 由于 this 和 super 都在实例化阶段调用,所以不能在静态方法和静态代码块中使用 this 和 super 关键字。

(3) this 还可以值代当前对象,比如在同步代码块 synchronized(this){....}中,super 就不具备这种能力。但是 super 也有自己独特的功能,在子类覆盖父类方法的时候,可以使用 super 调用父类的同名方法。

3、 总结

Java中的this和super关键字_第1张图片

你可能感兴趣的:(javase,java)