拜托有没有java高手给看看,不要让我一次次问了啊~~~~

来源:百度知道 编辑:UC知道 时间:2024/05/29 06:33:59
class Animal{
int weight,height;
void eat(){
System.out.println("animal eat");
}
void sleep(){
System.out.println("animal sleep");
}
void breathe(){
System.out.println("animal breathe");
}
}

class Fish extends Animal{
void breathe(){
System.out.println("fish breathe");
}
}

class Test {

static void fn(Animal an){
an.breathe();
}

public static void main(String [] args){
Fish fh=new Fish();
Animal an;
an=fh;
Test.fn(an);

}
}

主方法里面的句子全体不懂。
fh和an的内存空间不一样吧?那为什么可以相互赋值??

Fish fh=new Fish();//声明一个Fish类的引用fh,并将它实例化
Animal an;//声明一个Animal类的引用an,但并不实例化
an=fh;//将fh所指向的实例赋值给an
Test.fn(an); 调用Test.fn(),并将fn做参数传入。

你所不理解就是an=fh;
其实在java中,内存被细分成堆(heap)和栈(stak)。
对象的实例被放到堆内存,原始类型和引用放到栈内存。
在fh=new Fish();实际上是先去栈中声明fh,再在堆里实例化Fish,最后将fh指向堆中的实例;
Animal an;就是去栈中声明an;
an=fh;就是将fh指向的堆中的实例,也让an指向那个实例。

这个就是继承关系啊

不知道我这样给你演化你能否看懂:
Fish fh = new Fish();

被注释的两行其事就是第3行中的写法。
// Animal an;
// an = fh;
Animal an = new Fish();

因为Fish继承了Animal类并且将void breathe()方法重载,所以Animal对象会从new Fish()子类中调用,如果没有则调用Animal类中的void breathe()方法。

哈哈,这个问题怎么刚才我看到有人回你了呢?

我在帮你看看,先留名.

我看LZ应该去看看什么是OOP思想!再来问这个问题!当你 够OO时你就会明白了!