有一个疑问:
如果有两个子类,他们继承了父类的方法。两个人都没有重写该方法。
那么程序在运行的时候,两个子类是不是访问着同一个方法。(也就是可能出现安全问题)
我之前一直以为子类继承父类之后,都有了属于自己的方法,不同的子类的方法是不相干的。
可是刚写了一段代码。
发现有些问题。两个子类启动的时候,居然被锁上了。
被抽象类中一个非静态成员变量锁上了。这是否说明,继承也存在安全问题呢。
还有,我不知道这个抽象类被分配在堆区中哪儿,怎么感觉他和一个静态成员一样。每一个子类都有可以访问它。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();
new Thread(new testExtend()).start();

}
}

解决方案 »

  1.   


    你设置object为静态成员,就会被锁住的。
      

  2.   

    为什么会调用父类的int呢,而不是调用自己的int.
      

  3.   

    如果是static当然会出现被锁住的问题,因为static后o无论你new多少个对象都只会存在一份,如果一个对象获取到了,那么另一个肯定就会需要等待了。为什么会调用父类的int i?当然这个时候你对象中的i肯定是被覆盖了,但是这个方法是属于父类的撒,并不是属于你子类的,那么这个i肯定是从父类中取撒...假设如果真的是取的子类的i,那么以后你还敢些全局变量么,别人继承你的的类之后就可以改变你的方法的执行结果了。那不是很恐怖的一件事啊!!!
      

  4.   

    把object加上static 正是多线程访问静态数据的方法之一