鍍金池/ 問答/Java  C  Linux/ 關(guān)于Java當中繼承的疑問

關(guān)于Java當中繼承的疑問

這是我運行的Test.java文件的源碼,Sub類繼承的是Main類,MyThreadA和MyThreadB都是線程類

package service;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Sub subRef = new Sub();
        MyThreadA a = new MyThreadA(subRef);
        a.setName("A");
        a.start();
        MyThreadB b = new MyThreadB(subRef);
        b.setName("B");
        b.start();
    }

}

如下是控制臺的運行結(jié)果,我的疑問是為什么Main類里面的serviceMethod()方法也被調(diào)用了?線程MyThreadA和線程MyThreadB的run()方法不是只是調(diào)用了Sub類里面的serviceMethod()方法嗎?

int sub 下一步 sleep begin threadName=A time=1521894980829
int sub 下一步 sleep begin threadName=B time=1521894980829
int sub 下一步 sleep end threadName=A time=1521894985834
int sub 下一步 sleep end threadName=B time=1521894985834
int main 下一步 sleep begin threadName=A time=1521894985835
int main 下一步 sleep end threadName=A time=1521894990838
int main 下一步 sleep begin threadName=B time=1521894990838
int main 下一步 sleep end threadName=B time=1521894995840

如下是MyThreadA類

package service;

public class MyThreadA extends Thread {
    
    private Sub sub;

    public MyThreadA(Sub sub) {
        super();
        this.sub = sub;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        sub.serviceMethod();
    }
    
    
}

如下是MyThreadB類

package service;

public class MyThreadB extends Thread {
    
    private Sub sub;

    public MyThreadB(Sub sub) {
        super();
        this.sub = sub;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        sub.serviceMethod();
    }
    
    
    
}

如下是Main類

package service;

public class Main {
    synchronized public void serviceMethod() {
        try {
            System.out.println("int main 下一步 sleep begin threadName="
                    + Thread.currentThread().getName() + " time="
                    + System.currentTimeMillis());
            Thread.sleep(5000);
            System.out.println("int main 下一步 sleep end threadName="
                    + Thread.currentThread().getName() + " time="
                    + System.currentTimeMillis());
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

如下是Sub類,繼承Main類

package service;

public class Sub extends Main {
    @Override
    public void serviceMethod() {
        try {
            System.out.println("int sub 下一步 sleep begin threadName="
                    + Thread.currentThread().getName() + " time="
                    + System.currentTimeMillis());
            Thread.sleep(5000);
            System.out.println("int sub 下一步 sleep end threadName="
                    + Thread.currentThread().getName() + " time="
                    + System.currentTimeMillis());
            super.serviceMethod();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}
回答
編輯回答
厭遇

去掉super.serviceMethod();

2017年6月7日 12:38
編輯回答
爆扎

基本概念都沒有搞清楚,就去學(xué)線程合適嗎?

2018年4月9日 21:26