class A {
int i;
A() {
add(1);
}
void add(int v) {
i = i + v;
}
void print() {
System.out.println(i);
}
}
class AA extends A {
AA() {
add(2);
}
void add(int v) {
i = i + v * 2;
}
}
public class Test2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
show(new AA());
}
static void show(A b) {
b.add(8);
b.print();
}
}
运行结果为22.
能详细解释一下show方法是什么意思吗?
谢谢大家的回答。
主函数中有个show()方法,show()方法上面有个方法调用,show()方法中有两个字母但其实是一个参数类型--A类的成员b 即A b=new A();只是没有实例化即没有new A(),从而作为一个参数类型。
而上面的调用show()方法---show(new AA()) 代表传入了一个实例化对象进入show()方法中。它的作用是将对这个传入的实例化对象进行add(8)和print()操作**
静态方法,子类,父类的关系
show(A b) 方法需要一个A,而传入的是A的子类AA对象,因此会先调用A的构造函数,再调用AA的构造函数。
计算过程如下:
1、AA中的i为2 AA中的v为1。调用了A的构造函数。
2、AA中的i为6 AA中的v为2。调用了AA的构造函数。
3、AA中的i为22 AA中的v为8,i=i+v*2 ,也就是i = 6+8*2 = 22
4、输出结果:22
主函数中有个show()方法,show()方法上面有个方法调用,show()方法中有两个字母但其实是一个参数类型--A类的成员b 即A b=new A();只是没有实例化即没有new A(),从而作为一个参数类型。
而上面的调用show()方法---show(new AA()) 代表传入了一个实例化对象进入show()方法中。它的作用是将对这个传入的实例化对象进行add(8)和print()操作**
java采用运行时绑定,将子类对象赋值给父类,调用的依然是子类的方法。
class A {
int i;
A() {
System.out.println("初始化A:");
System.out.println(this);
//调用父类add还是子类add,关键在于调用对象是父类还是子类,重点在于this是什么对象
add(1);
System.out.println("A:i----->" + i);
}
void add(int v) {
System.out.println("调用A:add();");
i = i + v;
}
void print() {
System.out.println(i);
}
public String toString(){
return "当前对象类型:A";
}
}
class AA extends A {
AA() {
System.out.println("初始化AA:");
add(2);
System.out.println("AA:i----->" + i);
}
void add(int v) {
System.out.println("调用AA:add();");
i = i + v * 2;
}
public String toString(){
return "当前对象类型:AA";
}
}
public class TestFunction {
public static void main(String[] args) {
// TODO 自动生成的方法存根
show(new AA());
}
static void show(A b) {
b.add(8);
b.print();
}
}
你可以编译运行下上述代码,就可以看到执行顺序,其实重点在于this是谁