interface Animal
{
public void eat(Food food);
}class Cat implements Animal
{
public void eat(Food food)
{
System.out.println("小猫吃"+food.getName());
}
}class Dog implements Animal
{
public void eat(Food food)
{
System.out.println("小狗啃"+food.getName());
}
}
abstract class Food
{
protected String name;
public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}
}
class Fish extends Food
{
public Fish(String name) {
this.name = name;
}
}class Bone extends Food

public Bone(String name) {
this.name = name;
}
}
class Feeder
{public void feed(Animal animal,Food food)
{
animal.eat(food);
}
}
public class TestFeeder {public static void main(String[] args) {
Feeder feeder=new Feeder();
Animal animal=new Dog();
Food food=new Bone("肉骨头");
feeder.feed(animal,food); //给狗喂肉骨头
animal=new Cat();
food=new Fish("鱼");
feeder.feed(animal,food); //给猫喂鱼}
}
帮忙解释一下出现执行时加载类的顺序(结果如下)
---------------------------------------------------
[Loaded TestFeeder from file:/E:/Java/]
[Loaded Animal from file:/E:/Java/]
[Loaded Food from file:/E:/Java/]
[Loaded Bone from file:/E:/Java/]
[Loaded Fish from file:/E:/Java/]
[Loaded Feeder from file:/E:/Java/]
[Loaded Dog from file:/E:/Java/]
小狗啃肉骨头
[Loaded Cat from file:/E:/Java/]
小猫吃鱼
---------------------------------------------------

解决方案 »

  1.   

    先从父类开始加载 TestFeeder 在加载接口中的 然后在加载子类 
    先父后子的加载个人理解 观望~~观望~~~~
      

  2.   

    类加载,1、生成对象时候加载
            2、访问类的静态成员时候加载
            3、特殊语法,class.forName(“类名”)来加载
      

  3.   


    类发生加载的条件:
    new对象的时候
    调用静态成员的时候
    Class.forName("类名")的时候
    类加载的步骤:
      申请内存空间
      初始化静态语句块
      初始化静态成员
      调父类构造
      调构造
      

  4.   

    你可以参考下我下面写的,你能看的懂,你的问题也就解决了,而且比直接结你答案好多了:    在类或接口被加载和连接的时机上,Java虚拟机规范给实现提供了一定的灵活性,但是它严格定义了初始化的时机,所有的Java虚拟机实现必须在每个类或接口被Java程序“首次主动使用”时才初始化它们。Java程序对类的使用方式可分为主动使用和被动使用两种。以下动作被看做是首次主动使用一个类或接口:
    1、创建类的实例。创建类的实例的途径包括用new语句创建实例,或者通过反射、克隆及反序列化手段来创建实例。
    2、调用类的静态方法。
    3、访问某个类或接口的静态变量,或者对该静态变量赋值。
    4、调用Java API中某些反射方法,比如调用Class.forName(“Worker“)方法,假如Worker类还没有被初始化,那么forName()方法就会初始化Worker类,然后返回代表这个Worker类的Class实例。forName()方法是java.lang.Class类的静态方法。
    5、初始化一个类的子类。例如父类是Base类,子类是Sub类,对Sub类的初始化可以看做是对它父类Base类的主动使用,因此会先初始化Base类。
    6、Java虚拟机启动时被标明为启动类的类。例如对于“java MyJava”命令,MyJava类就是启动类,Java虚拟机会先初始化它。
      

  5.   

    谁能就本例给我解释一下为什么类的加载顺序是TestFeeder , Animal  ,Food , Bone, Fish , Feeder ,Dog Cat 这样子的。比如为什么加载的第二个类不是Feeder.
      

  6.   

    我的结果和你的不一样:Feeder <clinit>
    小狗啃肉骨头
    Fish <clinit>
    小猫吃鱼改了如下的2个类:
    class Feeder 

      public void feed(Animal animal,Food food) 
      { 
        animal.eat(food); 
      } 
      static 
      {
        System.out.println("Feeder <clinit>");
      }
    } class Fish extends Food 

      public Fish(String name) { 
      this.name = name; 

      static
      {
      System.out.println("Fish <clinit>");
      }