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/]
小猫吃鱼
---------------------------------------------------
{
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/]
小猫吃鱼
---------------------------------------------------
先父后子的加载个人理解 观望~~观望~~~~
2、访问类的静态成员时候加载
3、特殊语法,class.forName(“类名”)来加载
类发生加载的条件:
new对象的时候
调用静态成员的时候
Class.forName("类名")的时候
类加载的步骤:
申请内存空间
初始化静态语句块
初始化静态成员
调父类构造
调构造
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虚拟机会先初始化它。
小狗啃肉骨头
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>");
}
}