package Fuleiyinyongzhixiang;
public class Animal {
public String str = "ZwZ";
public int i1;
public void eat(){
System.out.println("我是动物,我要吃饭");
}
public void sleep(){
System.out.println("我是动物,我要睡觉");
}
}
package Fuleiyinyongzhixiang;
public class Person extends Animal{
public int i2;
public String str2;
public void eat(){
System.out.println("我是人,我要吃大鱼大肉");
}
public void play(){
System.out.println("我是人,要玩");
}
}
package Fuleiyinyongzhixiang;
public class Test {
public static void main(String[] args) {
Animal animal = new Person();
//animal.play();//animal不能去调用Person中非重写的Animal中的方法
animal.eat();
}
}
其控制台输出是:我是人,我要吃大鱼大肉
所谓的父类引用指向子类对象就是:在栈中定义一个父类的引用去指向堆中子类的对象。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,父类引用是无法调用的;
1.该引用只能调用父类中定义的方法和变量;
2.如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
3.变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
具体用处的话比较抽象,就用以下代码说明吧:
public interface AnimalDemo {//定义一个“动物”接口
public static final int i = 981203;
public static final String str = "ZwZ";
public abstract void sleep();
public abstract void eat();
}
public class PersonDemo implements AnimalDemo{//定义一个“人”类去实现Animal接口
public void sleep() {
System.out.println("我是人每天睡8小时");
}
public void eat() {
System.out.println("我是人,我要吃大鱼大肉");
}
public void play(){
System.out.println("我是人,要玩");
}
}
public class CatDemo implements AnimalDemo{//定义一个“猫”类去实现Animal接口
public void sleep() {
System.out.println("我是猫,我一天睡10小时");
}
public void eat() {
System.out.println("我是猫,我吃猫粮");
}
public void teShu(){
System.out.println("我是猫,我要抓老鼠");
}
}
public class TestDemo {//定义一个测试类,其中里面有一个方法的形式参数的类型是AnimalDemo类型
public static void test(AnimalDemo animal){
animal.eat();
}
}
public class TestDmeo1 {
public static void main(String[] args) {
AnimalDemo animal2 = new CatDemo();//父类的引用指向子类对象
TestDemo.test(animal2);
}
}
其中控制台输出结果如下:
由于接口里面的方法都是抽象方法,所以说实现它的子类肯定会重写里面的方法。在例子中可看出,父类的引用指向子类对象的好处就是,如果用更改其子类对象只需要改TestDemo1中的new CatDemo( )就可以了,其他的全都不用改。或者说有其他动物要“加入”的话就直接让它去实现AnimalDemo这个接口,然后直接把TestDemo1中的new CatDemo( )改掉就可以了。便于维护,而且扩展起来也方便。