我是java新手,所以请帮助我理解这一点。
例如
class a{...}
class b extends a{
public static void main(...){
a x = new a();
b y = new b();
a z = new b();
}
这三个实例有什么区别?我应该什么时候使用每一个?
编辑:更正了最后一条语句
您可以将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
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)。
点击链接了解更多信息
这不会编译
b z = new a();
你可能在这里的意思是
a z = new b();
即,将子类对象分配给父类引用以利用多态性。
基本上,如果您将子类型对象分配给超类引用,则运行时多态性确保调用子类型的实例方法版本,即,如果它也已在父类中定义并且您希望当然覆盖它。如果不是,则调用透明地返回到超类版本。
作为旁注,请使用CapitalCamelCase
课程。
首先请遵守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();
- 它被称为多态性。谷歌该术语以获取更多信息。那里有很多啧啧声。