我是一个java新手,所以请帮助我理解这一点。
e.g
class a{...}
class b extends a{
public static void main(...){
a x = new a();
b y = new b();
a z = new b();
}
三个实例之间有什么区别?我什么时候应该使用每一个?
编辑:更正了最后一句话
答案 0 :(得分:3)
您可以使用a
作为代码重用的方法的参数。即我们可以定义一个方法(带参数a
),以便它可以使用任何派生类(b
,..)
例如:考虑使用此方法来读取流
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
答案 1 :(得分:1)
这不会编译
b z = new a();
你在这里的意思是
a z = new b();
即。将子类对象分配给父类引用以使用多态。
基本上,如果你有一个分配给超类引用的子类型对象,运行时多态确保实例方法的子类型版本得到调用ie,如果它已在父类中定义,并且您希望覆盖它当然。如果没有,则呼叫将透明地回溯到超类版本。
作为旁注,请为课程使用CapitalCamelCase
。
答案 2 :(得分: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)。
点击link了解详情
答案 3 :(得分: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
}
声明1& 2:A x = new A();
& B y = new B();
这是创建对象的常规方法。你有一个类型A的引用指向类型A的对象(相同的类)。第二个也是如此。
声明3:B z = new A();
这不起作用,因为你不能使用子类类型的引用来指向超类的对象,因为你的子类引用可以有你的超类对象中没有定义的方法。
您可能想尝试A z = new B();
- 它被称为多态性。谷歌这个词的更多信息。那里有很多东西。