class A { public int Avar; public A() { System.out.println("AAA"); doSomething(); } public void doSomething() { Avar = 1111; System.out.println("A.doSomething()"); } }public class B extends A { public int Bvar = 2222; public B() { System.out.println("BBB"); doSomething(); System.out.println("Avar=" + Avar); } public void doSomething() { super.doSomething(); System.out.println("Bvar=" + Bvar); } public static void main(String[] args) { new B(); } }Patrick_DK(疾风摩郎) 你有没有这样试过?在sub_class里用super.doSomething();结果执行了A.doSomething(); 按照你的说法,A.doSomething()已经被B.doSomething()覆盖了,那怎么还会执行呢?并且我看到有人说初始化的顺序是:继承类的静态变量、基类的静态变量、继承类的变量、基类的变量、基类的构造函数、继承类的构造函数,我觉得不太对,找不到你原来的帖子,贴个地址出来吧!
class A { public int Avar; public A() { System.out.println("AAA"); doSomething(); } public void doSomething() { Avar = 1111; System.out.println("A.doSomething()"); } }public class B extends A { public int Bvar = 2222; public B() { System.out.println("BBB"); doSomething(); System.out.println("Avar=" + Avar); } public void doSomething() { super.doSomething(); System.out.println("Bvar=" + Bvar); } public static void main(String[] args) { new B(); } } 输出结果: AAA A.doSomet Bvar=0 BBB A.doSomet Bvar=2222 Avar=1111
Patrick_DK(疾风摩郎) 帮我解开这个疑团,就结帐! class A class A { { public A() public A() { { Print(); Print(); } } public Print() public Print() { { System.out.println("A"); System.out.println("A"); } } } } public class B public class B { { Print() Print() { { System.out.println("B"); super.Print(); } } public static void main(String args[]) public static void main(String args[]) { { new B(); new B(); } } } } 输出结果: B A为什么?这不能用覆盖来解释吧?
Patrick_DK(疾风摩郎) 帮我解开这个疑团,就结帐! class A class A { { public A() public A() { { Print(); Print(); } } public Print() public Print() { { System.out.println("A"); System.out.println("A"); } } } } public class B extends A public class B extends A { { Print() Print() { { System.out.println("B"); super.Print(); } } public static void main(String args[]) public static void main(String args[]) { { new B(); new B(); } } } } 输出结果: B A为什么?这不能用覆盖来解释吧?
AAA
123
CCC
BBB
2.AAA
BVar=0
BBB
BVar=222
AVar=0
1。为什么不是先执行constructor而是先执行一个{}?直接写一个{}有什么特殊含义吗?
2。super_class constructor中调用的doSomething()为什么执行的是sub_class中的doSomething()?
规则比较多,应该看看入门的书
public int Avar;
public A() {
System.out.println("AAA");
doSomething();
}
public void doSomething() {
Avar = 1111;
System.out.println("A.doSomething()");
}
}public class B extends A {
public int Bvar = 2222;
public B() {
System.out.println("BBB");
doSomething();
System.out.println("Avar=" + Avar);
}
public void doSomething() {
super.doSomething();
System.out.println("Bvar=" + Bvar);
}
public static void main(String[] args) {
new B();
}
}Patrick_DK(疾风摩郎) 你有没有这样试过?在sub_class里用super.doSomething();结果执行了A.doSomething();
按照你的说法,A.doSomething()已经被B.doSomething()覆盖了,那怎么还会执行呢?并且我看到有人说初始化的顺序是:继承类的静态变量、基类的静态变量、继承类的变量、基类的变量、基类的构造函数、继承类的构造函数,我觉得不太对,找不到你原来的帖子,贴个地址出来吧!
public int Avar;
public A() {
System.out.println("AAA");
doSomething();
}
public void doSomething() {
Avar = 1111;
System.out.println("A.doSomething()");
}
}public class B extends A {
public int Bvar = 2222;
public B() {
System.out.println("BBB");
doSomething();
System.out.println("Avar=" + Avar);
}
public void doSomething() {
super.doSomething();
System.out.println("Bvar=" + Bvar);
}
public static void main(String[] args) {
new B();
}
}
输出结果:
AAA
A.doSomet
Bvar=0
BBB
A.doSomet
Bvar=2222
Avar=1111
我牛什么!?菜鸟一个而已,呵呵
class A class A
{ {
public A() public A()
{ {
Print(); Print();
} }
public Print() public Print()
{ {
System.out.println("A"); System.out.println("A");
} }
} }
public class B public class B
{ {
Print() Print()
{ {
System.out.println("B"); super.Print();
} }
public static void main(String args[]) public static void main(String args[])
{ {
new B(); new B();
} }
} }
输出结果:
B A为什么?这不能用覆盖来解释吧?
class A class A
{ {
public A() public A()
{ {
Print(); Print();
} }
public Print() public Print()
{ {
System.out.println("A"); System.out.println("A");
} }
} }
public class B extends A public class B extends A
{ {
Print() Print()
{ {
System.out.println("B"); super.Print();
} }
public static void main(String args[]) public static void main(String args[])
{ {
new B(); new B();
} }
} }
输出结果:
B A为什么?这不能用覆盖来解释吧?
Overriding的方法(不包括static,private和final修饰的方法)是多态的运行期动态绑定。1.你左边这个例子,父类的print()方法被子类的print()方法覆盖了,在运行期绑定为子类的那个,所以输出B2.这个和左边那个不是一样啊,在运行期绑定了子类的print()方法,执行的时候,方法里调用了super。print(),也就是父类的print()方法。所以输出是A其实这两个程序完全一样的嘛,只不过子类中print()方法中的内容不同而已。
现在应该明白了吧,结账哦。