快速JAVA继承问题
如果我有一个名为Dog的抽象类和一个名为SpecialDog的类,该类使用构造函数设置其权重(double)和一个名为SpecialDog的类来扩展Dog,并且有一个接受double并使用super()将其传递给Dog的构造函数 以下各项之间的区别(如有):快速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 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行有两个错误:构造抽象类的对象和超类赋值除了下面的答案之外,请看一看所谓的“策略”设计模式。如果你能理解