文章目录
- 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、不写构造函数,编译器会默认添加一个
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动态绑定原理