文章目录

  • 1、名词解释
  • 2、简单实例演示
  • 3、this的后期绑定 实例
  • 4、java动态绑定原理

1、名词解释

构造函数:和类同名的函数,主要作用是完成对象的初始化工作

1、如果没有写构造函数,编译器会默认添加一个无参构造函数在class文件里。
2、当有多个构造函数时,new对象时填几个参数,就调哪个构造函数,例:new A(”aa“);
3、父类构造函数比子类优先初始化,变量比构造函数优先初始化

this :代表“当前对象”

this():就是调用“当前对象”的无参构造方法
this、this(),new的谁就指向谁。父类里有this也是指向的new出来的对象。

this的动态绑定:包括静态方法和静态成员变量是前期绑定、访问方法是后期绑定

super:指向父类

super():就是调用父类的无参构造方法
super、super(),仅指向上一级父类。

2、简单实例演示

1、不写构造函数,编译器会默认添加一个

Java构造函数前需要加public java构造函数this_父类


2、当有多个构造函数时,new对象时填几个参数,就调哪个构造函数

Java构造函数前需要加public java构造函数this_this_02


3、父类构造函数比子类 优先初始化

Java构造函数前需要加public java构造函数this_this_03


4、变量比构造函数 优先初始化

Java构造函数前需要加public java构造函数this_父类_04


5、this指当前对象

Java构造函数前需要加public java构造函数this_构造函数_05


另外父类A里面不管永不用this,调用s1( )方法都是B里的,因为被覆盖了。

Java构造函数前需要加public java构造函数this_父类_06


6、调用方法时this是指向当前对象,但是调用属性时,是指的当前类的属性

这是java程序中易产生二义性之处,
1、this来指明当前对象 (后期绑定:在运行期间绑定方法)
2、如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名(前期绑定:静态方法和静态成员变量是编译期绑定)

如下例,区分有this、没this、父类中调用this的区别:

Java构造函数前需要加public java构造函数this_this_07


把this.方法、this.变量一起使用看看效果

如下例,区分this易产生二义性之处:

Java构造函数前需要加public java构造函数this_父类_08


7、this和this( )

this()只能写在构造方法中

Java构造函数前需要加public java构造函数this_构造函数_09


8、super( )

super(…);的调用只能放在构造方法的第一行.
super(…)和this(…)不能共存。

Java构造函数前需要加public java构造函数this_父类_10

3、this的后期绑定 实例

有两个类A、B,B继承自A,代码内容如下,判断最后输出的什么
A

public class A {
    private int n;
    public A(int n){
        setN(n);
    }
    
    public int getN() {
        try{
            n++;
            return n;
        }finally {
            this.setN(n);
            System.out.println(n);
        }
    }

    public void setN(int n) {
        this.n = n;
    }
    
}

B

public class B extends A{
    private int n;

    public B() {
        super(5);
        setN(getN() - 3);
    }

    @Override
    public void setN(int n) {
        super.setN( 2*n );
    }

    public static void main(String[] args) {
        System.out.println(new B().getN());
    }
}

答案

Java构造函数前需要加public java构造函数this_父类_11


解析

先看看B

Java构造函数前需要加public java构造函数this_构造函数_12


再看看A

Java构造函数前需要加public java构造函数this_动态绑定_13


调用图解运行流程1:new B() --> super(5) --> public A() --> B:setN(5) -->A:setN(25)

Java构造函数前需要加public java构造函数this_构造函数_14


流程1产生结果:A:n = 10
运行流程 2:getN() --> A:getN --> setN(11-3)

Java构造函数前需要加public java构造函数this_动态绑定_15


流程2产生结果:setN(8)
运行流程 3:B: setN(8)构造方法里面 --> fially后面 A:setN(2
11)

Java构造函数前需要加public java构造函数this_父类_16

流程3产生结果:A:n =22,输出第一个结果22

运行流程 4:setN(11 -3)

Java构造函数前需要加public java构造函数this_this_17


流程4产生结果:A:n =16

运行流程 5:

Java构造函数前需要加public java构造函数this_构造函数_18


流程5运行结果:输出17和34

最终结果

Java构造函数前需要加public java构造函数this_父类_19

4、java动态绑定原理