快速JAVA继承问题

快速JAVA继承问题,java,inheritance,Java,Inheritance,如果我有一个名为Dog的抽象类和一个名为SpecialDog的类,该类使用构造函数设置其权重(double)和一个名为SpecialDog的类来扩展Dog,并且有一个接受double并使用super()将其传递给Dog的构造函数 以下各项之间的区别(如有): Dog dog = new SpecialDog(12.0); SpecialDog dog = new SpecialDog(12.0); Dog dog = new Dog(12.0); SpecialDog dog = new Dog

如果我有一个名为Dog的抽象类和一个名为SpecialDog的类,该类使用构造函数设置其权重(double)和一个名为SpecialDog的类来扩展Dog,并且有一个接受double并使用super()将其传递给Dog的构造函数

以下各项之间的区别(如有):

Dog dog = new SpecialDog(12.0);
SpecialDog dog = new SpecialDog(12.0);
Dog dog = new Dog(12.0);
SpecialDog dog = new Dog(12.0);

谢谢

如果你的
类是抽象类,那么

Dog dog = new Dog(12.0);
SpecialDog dog = new Dog(12.0);
不会编译

要回答您评论中的问题,请执行以下操作:

如果使用
Dog
变量,则只能使用
Dog
类的方法。
在这种情况下,若您试图使用
SpecialDog
的方法,编译器将生成一个错误。

若您的
Dog
类是abstract

Dog dog = new Dog(12.0);
SpecialDog dog = new Dog(12.0);
不会编译

要回答您评论中的问题,请执行以下操作:

如果使用
Dog
变量,则只能使用
Dog
类的方法。 在这种情况下,若您试图使用
SpecialDog
的方法,编译器将生成一个错误。

回答您的问题(它们都不同):

在这里,您正在创建一个SpecialLog,但使用了一个Dog引用来指向它。对象是一只特殊的狗,但是,除非您向下转换
dog
变量,否则只能将
dog
视为一只
dog
而不是
SpecialDog

SpecialDog dog = new SpecialDog(12.0);
这里,您正在创建一个SpecialLog,并使用SpecialLog引用指向它

Dog dog = new Dog(12.0);
这是一个编译器错误,因为无法实例化抽象类

SpecialDog dog = new Dog(12.0);
这只是一个编译器错误。不能将超类指定给子类引用。请记住:继承是一种“是一种”关系。虽然SpecialDog总是一只,但是在回答您的问题时可能并不总是SpecialDog(它们都不同):

在这里,您正在创建一个SpecialLog,但使用了一个Dog引用来指向它。对象是一只特殊的狗,但是,除非您向下转换
dog
变量,否则只能将
dog
视为一只
dog
而不是
SpecialDog

SpecialDog dog = new SpecialDog(12.0);
这里,您正在创建一个SpecialLog,并使用SpecialLog引用指向它

Dog dog = new Dog(12.0);
这是一个编译器错误,因为无法实例化抽象类

SpecialDog dog = new Dog(12.0);

这只是一个编译器错误。不能将超类指定给子类引用。请记住:继承是一种“是一种”关系。虽然SpecialDog始终是,但可能并不总是SpecialDog

创建一个SpecialDog,将其分配给一个Dog变量,如果只想使用SpecialDog函数,则需要强制转换

Dog dog = new SpecialDog(12.0);
创建SpecialLog并将其分配给SpecialLog变量。没什么特别的

SpecialDog dog = new SpecialDog(12.0);

其余两个尝试创建抽象类的实例,但不会编译。

创建一个SpecialLog,将其分配给一个Dog变量,如果只想使用SpecialLog函数,则需要强制转换

Dog dog = new SpecialDog(12.0);
创建SpecialLog并将其分配给SpecialLog变量。没什么特别的

SpecialDog dog = new SpecialDog(12.0);

剩下的两个试图创建抽象类的实例,但不会编译。

使用
Dog-Dog=new-SpecialDog(12.0)在代码中升级。换言之,它促进了API将来的可扩展性

例如,如果您的方法接受
Dog
作为参数,则任何Dog都可以传递到该方法中:-

// you can pass SpecialDog, SkinnyDog, UglyDog into this API to make the dog fat
public void makeMeFat(Dog dog) {
   ...
}
// you can only pass SpecialDog into this API
public void makeMeFat(Special dog) {
   ...
}
但是,如果该方法仅接受特定类型的狗,则该方法中只能使用该狗:-

// you can pass SpecialDog, SkinnyDog, UglyDog into this API to make the dog fat
public void makeMeFat(Dog dog) {
   ...
}
// you can only pass SpecialDog into this API
public void makeMeFat(Special dog) {
   ...
}

如果将
Dog
设置为抽象类,则不能使用它创建另一个Dog,因为抽象类只有部分实现。因此,不可能创建具有抽象类的dog。在现实世界中,你可能会得到一只三条腿的狗,还有一只抽象的狗。。。但至少在编程世界中,您会遇到编译错误,因为编译器之神不想要一只三条腿的狗。:)

使用
Dog Dog=newspecialdog(12.0)在代码中升级。换言之,它促进了API将来的可扩展性

例如,如果您的方法接受
Dog
作为参数,则任何Dog都可以传递到该方法中:-

// you can pass SpecialDog, SkinnyDog, UglyDog into this API to make the dog fat
public void makeMeFat(Dog dog) {
   ...
}
// you can only pass SpecialDog into this API
public void makeMeFat(Special dog) {
   ...
}
但是,如果该方法仅接受特定类型的狗,则该方法中只能使用该狗:-

// you can pass SpecialDog, SkinnyDog, UglyDog into this API to make the dog fat
public void makeMeFat(Dog dog) {
   ...
}
// you can only pass SpecialDog into this API
public void makeMeFat(Special dog) {
   ...
}

如果将
Dog
设置为抽象类,则不能使用它创建另一个Dog,因为抽象类只有部分实现。因此,不可能创建具有抽象类的dog。在现实世界中,你可能会得到一只三条腿的狗,还有一只抽象的狗。。。但至少在编程世界中,您会遇到编译错误,因为编译器之神不想要一只三条腿的狗。:)

我想是的。谢谢:)如果我宣布它是一只狗或一只特殊的狗,它会改变什么吗。我的意思是,如果dog被声明为dog类型,我可以使用SpecialDog类中的方法,如dog.someMethod(),前提是“SpecialDog”中的方法也是“dog”的一部分(即继承的方法)。此外,《狗》中的这些方法必须是公开的。谢谢:)如果我宣布它是一只狗或一只特殊的狗,它会改变什么吗。我的意思是,如果dog被声明为dog类型,我可以使用SpecialDog类中的方法,如dog.someMethod(),前提是“SpecialDog”中的方法也是“dog”的一部分(即继承的方法)。第4行有两个错误:构造抽象类的对象和超类赋值第4行有两个错误:构造抽象类的对象和超类赋值除了下面的答案之外,请看一看所谓的“策略”设计模式。如果你能理解