2

我是java新手,所以请帮助我理解这一点。

例如

class a{...}
class b extends a{
   public static void main(...){
      a x = new a();
      b y = new b();
      a z = new b();
    }

这三个实例有什么区别?我应该什么时候使用每一个?

编辑:更正了最后一条语句

4

4 回答 4

3

您可以将a其用作方法的参数以进行代码重用..即我们可以定义一个方法(带参数a)如此通用,以便它可以与任何派生类一起使用(b,..)


例如:考虑用这个方法读取一个Stream

public void Read(Stream s)
{
   //read s
}

deriving现在你可以在所有的类中重用这个方法Stream

Read(new FileStream(PATH));//read File
Read(new NetworkStream(URL));//read url
Read(new MemoryStream(object));//read memory object
于 2013-09-13T06:36:37.907 回答
1

a z=new b();这是运行时多态性

class a{...}
class b extends a{
   public static void main(...){
      a x = new a();
      b y = new b();
      a z = new b();
    }

a x=new a();-> 这是父类的对象。

b y =new b();y 是子类的对象。

a z=new b();z 它是引用子实例的父类的对象

假设如果您在父类中有一些函数(hello())并且子类覆盖了函数(hello()),那么您的 z 对象使用该函数();仅在子类中,子类中的其他功能不能用于该对象(z)。

点击链接了解更多信息

于 2013-09-13T06:36:07.797 回答
1

这不会编译

b z = new a();

你可能在这里的意思是

a z = new b();

即,将子类对象分配给父类引用以利用多态性

基本上,如果您将子类型对象分配给超类引用,则运行时多态性确保调用子类型的实例方法版本,即,如果它也已在父类中定义并且您希望当然覆盖它。如果不是,则调用透明地返回到超类版本。

作为旁注,请使用CapitalCamelCase课程。

于 2013-09-13T06:32:20.213 回答
0

首先请遵守java约定。类名以大写字母开头,方法/变量名以 camle 大小写。

class A{...}
class B extends A{
   public static void main(...){
      A x = new A();
      B y = new B();
      B z = new A(); // will not work
    }

Statement 1 & 2 : A x = new A();&B y = new B(); 这是创建对象的正常方式。您有一个 A 类型的引用,指向 A 类型的对象(同一类)。第二个也是一样。

声明 3:B z = new A(); 这不起作用,因为您不能使用子类类型的引用来指向超类的对象,因为您的子类引用可以具有未在超类对象中定义的方法。

您可能想尝试A z = new B();- 它被称为多态性。谷歌该术语以获取更多信息。那里有很多啧啧声。

于 2013-09-13T06:36:41.457 回答