日期:2014-05-20  浏览次数:20679 次

关于继承的问题,有点想不明白!!
有一个疑问:
如果有两个子类,他们继承了父类的方法。两个人都没有重写该方法。
那么程序在运行的时候,两个子类是不是访问着同一个方法。(也就是可能出现安全问题)
我之前一直以为子类继承父类之后,都有了属于自己的方法,不同的子类的方法是不相干的。
可是刚写了一段代码。
发现有些问题。两个子类启动的时候,居然被锁上了。
被抽象类中一个非静态成员变量锁上了。

这是否说明,继承也存在安全问题呢。
还有,我不知道这个抽象类被分配在堆区中哪儿,怎么感觉他和一个静态成员一样。每一个子类都有可以访问它。

package cn.dzr.other;


abstract class Animal
{
int i=11;
Object o = new Object();
public void beforeEat()
{
System.out.println("Animal ready to eat!");
}

public  void eat() throws InterruptedException
{
synchronized(o)
{
System.out.println(i);
Thread.sleep(3000);
beforeEat();

System.out.println("Animal eat!");
}
}


}

class Tiger extends Animal implements Runnable
{
public void beforeEat()
{
System.out.println("Tiger ready to eat!");
}
int i = 13;
public void run()
{
try
{
eat();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

class Fish extends Animal implements Runnable
{
public void beforeEat()
{
System.out.println("Fish ready to eat!");
}

public void run()
{
try
{
eat();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

int i = 14;
}

class testExtend implements Runnable
{
static Object obj = new Object();
public  void run()
{
synchronized(obj)
{
System.out.println(Thread.currentThread().getName()+"sleep前....");
try
{
Thread.sleep(3000);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("3");
System.out.println(Thread.currentThread().getName()+"sleep后....");
}
}
}


public class InterfaceTest
{
public static void main(String[] args) throws InterruptedException
{
Fish f = new Fish();
Tiger t = new Tiger();
new Thread(f).start();
new Thread(t).start();

new Thread(new testExtend()).start();