当前位置:编程学习 > JAVA >>

面向对象的 父类引用指向子类对象 怎么理解?

abstract class Animal {
  private String name;
  Animal(String name) {this.name = name;}

  public void enjoy(){
    System.out.println("叫声......");
  }
 
  public abstract void enjoy();
}

abstract class Cat extends Animal {
  private String eyesColor;
  Cat(String n,String c) {super(n); eyesColor = c;}
  
  public void enjoy() {
    System.out.println("猫叫声......");
  }
  
我自己理解成只要能重写 public void enjoy(){
    System.out.println("叫声......");
  }  
他就是了   求指点
--------------------编程问答-------------------- 你这是要问啥?没看懂你的标题,父类引用指向子类对象,你是想在子类里面保存一个成员指向父类的引用呢,还是想问虚基类和虚函数的继承实现呢?Ps:楼主你俩类都是虚基类,所以,其实在Cat类里面,根本不用override enjoy函数。你什么都不写都没关系。编译器不会抱错。 --------------------编程问答-------------------- 看不懂要问什么 --------------------编程问答-------------------- 马士兵的视频吗? --------------------编程问答-------------------- 你这是抽象类的继承,子类必须实现抽象方法。而你所问的应该是多态,看看概念应该不难理解! --------------------编程问答-------------------- 这个例子我刚学的时候也看过。。。你先记着这用法,用多了自然就会理解了。。这就是多态 --------------------编程问答-------------------- 子父类中是重写方法~ --------------------编程问答-------------------- 这么理解吧


public class Parent
{
public void printName()
{
System.out.println("parent");
}


}

public class Son extends Parent
{
@Override
public void printName()
{
System.out.println("son");
}
}


public class Test
{
public static void main(String[] args)
{
Parent parent = new Son();
parent.printName();

                //这时候 print 的结果是 "son";
                //虽然是用父类引用,但是方法是指向子类的方向
}
}


--------------------编程问答-------------------- 父类 父类对象 = new 子类();
因为子类是父类的一个类型 --------------------编程问答-------------------- 多态的体现!就如你的例子,动物分为好多阿猫阿狗了等等,阿猫阿狗就是动物的两种形态,但是你不能说动物是阿猫阿狗的体现吧?这就是父类的引用指向子类的对象。
父类  父类的引用=new 子类(); --------------------编程问答-------------------- 如果没错的话,他表达的意思是:
List<String> list = new ArrayList<>();
类似于这行代码的意思,父类的引用  其实 就是指向子类的对象或者子类的实例的。也就是多态的用法,
用抽象类来指向具体的实现,实现变了,抽象定义可以不变,给程序带来良好的扩展性。 --------------------编程问答-------------------- LZ所问的是多态问题,

多态:可以理解为事物存在的多种体现形态。

人:男人,女人

动物:猫,狗。

猫 x = new 猫();

动物 x = new 猫();

1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
2,多态的前提
必须是类与类之间有关系。要么继承,要么实现。
通常还有一个前提:存在覆盖。

3,多态的好处
多态的出现大大的提高程序的扩展性。

4,多态的弊端:
虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。




举个简单的例子:多态和子类复写抽象方法就全明了:

/*
需求:
电脑运行实例,
电脑运行基于主板。
*/


interface PCI
{
public void open();
public void close();
}

//主板
class MainBoard
{
public void run()
{
System.out.println("mainboard run ");
}

//这个方法就是说只要你实现了PCI接口你就能"插在我身上"
//PCI p = new NetCard(),接口型引用指向自己的子类对象,同理网卡也是
//注:你还可以建立更多的对象实现PCI接口丰富电脑配置
public void usePCI(PCI p)
{
//这里的P代表你传给他哪个对象,他就代表哪个对象对应的方法
if(p!=null)
{
p.open();
p.close();

}
}
}

//网卡实现了PCI接口复写了他的方法
class NetCard implements PCI
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard close");
method();
}

}

//声卡实现了PCI接口复写了他的方法
class SoundCard implements PCI
{
public void open()
{
System.out.println("SoundCard open");
}
public void close()
{
System.out.println("SoundCard close");
}
}

class MainBoardTest 
{
public static void main(String[] args) 
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(null);
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());

}
}


--------------------编程问答-------------------- 本来想进来贡献一下,发现看了7楼和11楼的贴,学了不少
看来好心有好报 --------------------编程问答-------------------- 11L 说的正解,但是需要注意的是  父类与子类 静态代码快和非静态代码块 以及 构造函数的顺序 --------------------编程问答--------------------


abstract class Animal {
  private String name;
  Animal(String name) {this.name = name;}

  public void enjoy(){
    System.out.println("叫声......");
  }
 
  public abstract void enjoy();
}



可以写两个enjoy吗  我一开始觉得不行 放eclipse 还是编译出错
Duplicate method enjoy() in type Animal

是不是视频里的例子? --------------------编程问答-------------------- 涉及到多态,也为了方便以后的代码管理和维护。 --------------------编程问答-------------------- 楼上正解
父类引用用子类构造函数去实例化,要注意的是父类引用只能调用父类里有定义或声明的方法,不能调用子类特有的方法 --------------------编程问答-------------------- 多态 父类引用指向子类对象
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,