大家先看看下面这个例子。我想明白它的工作原理是什么?
它的输出是A.a与A.b。可是我不太明白为什么是这个样子啊,B继承了A后,A的ab()方法不是传给它了吗,这个时候方法ab()不是直接在B中可以调用了吗?
或者按我对继承的原理的理解应该是,主方法调用了B的默认构造函数,B是A的子类,所以先调用A的默认构造函数。但是这之后发生了什么啊,不还是调用了B中从A继承来ab()方法了,为什么结果会是那样??
帮忙给我讲讲它的原理。谢谢class A{
private void a(){
System.out.println("A.a");
}
private void b(){
System.out.println("A.b");
}
public void ab(){
a();
b();
}
}
public class B extends A{
private void a(){
System.out.println("B.a");
}
protected void b(){
System.out.println("B.b");
}
public static void main(String[] args){
new B().ab();
}
}
它的输出是A.a与A.b。可是我不太明白为什么是这个样子啊,B继承了A后,A的ab()方法不是传给它了吗,这个时候方法ab()不是直接在B中可以调用了吗?
或者按我对继承的原理的理解应该是,主方法调用了B的默认构造函数,B是A的子类,所以先调用A的默认构造函数。但是这之后发生了什么啊,不还是调用了B中从A继承来ab()方法了,为什么结果会是那样??
帮忙给我讲讲它的原理。谢谢class A{
private void a(){
System.out.println("A.a");
}
private void b(){
System.out.println("A.b");
}
public void ab(){
a();
b();
}
}
public class B extends A{
private void a(){
System.out.println("B.a");
}
protected void b(){
System.out.println("B.b");
}
public static void main(String[] args){
new B().ab();
}
}
private的方法只有类自己看得到,就算子类也看不到.你可以把a,b方法都改为public的话,结果就是B.a和B.b了!
给你个例子:
public class PrivateOverride{
private void f(){
System.out.println("private f()");
}
public static void main(String[] args){
PrivateOverride po = new PrivateOverride();
po.f();
}
}
class Derived extends PrivateOverride{
void f(){
System.out.println("public f()");
}
}
偶也8 知道why
private void f(){
System.out.println("private f()");
}
public static void main(String[] args){
PrivateOverride po = new Derived();
po.f();
}
}
class Derived extends PrivateOverride{
void f(){
System.out.println("public f()");
}
}
似乎是因为Class A 中的a,b 2个方法是private的,无法被子类覆写的缘故。把A中的ab()方法copy至B中后,就会输出“B.a,B.b”这说明A中的a(),b()和B中的a(),b()是同时存在的。
private void a(){
System.out.println("A.a");
}
private void b(){
System.out.println("A.b");
}
public void ab(){
a();
b();
}
}
public class B extends A{
private void a(){
System.out.println("B.a");
}
protected void b(){
System.out.println("B.b");
}
public static void main(String[] args){
new B().ab();
}
}----------------------------------------------------------
首先B是继承于A的,当然就继承了了A的所有public 的方法和变量,A中的a()和b()方法都是为public 的ab()服务的,意思是ab()中同步调用了a()和b()。我们再看一下类B,它自己的类体里没有ab()函数,然而在程序入口处调用了new B.ab(),所以这里的调用方法其实就是A.ab()方法,呵呵,谁叫A.ab()方法是public的呢,如果你把权限换成private ,那这段程序将会失败。
------------罗毅
而A类的ab()中的a(),b()执行的是A类的a(),b()方法啊
而不是B类中重载的方法