1、名词解释
构造函数:和类同名的函数,主要作用是完成对象的初始化工作
1、如果没有写构造函数,编译器会默认添加一个无参构造函数在class文件里。
2、当有多个构造函数时,new对象时填几个参数,就调哪个构造函数,例:new A(”aa“);
3、父类构造函数比子类优先初始化,变量比构造函数优先初始化
this :代表“当前对象”
this():就是调用“当前对象”的无参构造方法
this、this(),new的谁就指向谁。父类里有this也是指向的new出来的对象。
this的动态绑定:包括静态方法和静态成员变量是前期绑定、访问方法是后期绑定
super:指向父类
super():就是调用父类的无参构造方法
super、super(),仅指向上一级父类。
2、简单实例演示
1、不写构造函数,编译器会默认添加一个

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

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

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

5、this指当前对象

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

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

把this.方法、this.变量一起使用看看效果
如下例,区分this易产生二义性之处:

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

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

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());
}
}
答案

解析
先看看B

再看看A

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

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

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

流程3产生结果:A:n =22,输出第一个结果22
运行流程 4:setN(11 -3)

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

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

4、java动态绑定原理
参考:https://www.cnblogs.com/mibloom/p/9613280.html
本文介绍Java中的构造函数、this和super的概念,通过实例演示不同构造函数的调用过程及this和super的使用方法,并深入探讨this的后期绑定原理。
1370

被折叠的 条评论
为什么被折叠?



