当创建2个类作为超类和子类时。如果使用不同的引用声明其中一个对象,那将会有什么不同?
class SubClass extends SuperClass
SubClass s1 = new SubClass();
SuperClass s2 = new SubClass();
与下一个比较
class SubClass extends SuperClass
SubClass s1 = new SubClass();
SubClass s2 = new SubClass();
答案 0 :(得分:2)
class SubClass扩展了SuperClass
1)SubClass s1 = new SubClass();
2)SuperClass s2 = new SubClass();
第一个解释: -
s1是子类的引用并且包含子类的对象,因此它将调用子类的方法以及超类,因为我们使用子类方法扩展超类方法,因此超类方法将自动可用于子类。我们可以在s1的帮助下调用超类和子类方法。
第二个解释: -
s2是Superclass的引用并且拥有子类的对象,所以这里有两个我们必须考虑的情况 i)方法重载:-method重载在编译时处理,因此它总是调用超类的方法
ii)方法覆盖:-method覆盖是在运行时处理的,因此它总是调用子类的方法。这个概念来自多态性。
SubClass s1 = new SubClass();
SubClass s2 = new SubClass();
s1和s2都是子类的引用并且保存子类的对象,因此在这两种情况下它都将调用子类对象。
答案 1 :(得分:2)
多态性的好处在于具有多个实现的能力。从下面的代码中可以看出,函数letsHear
接受任何类型的Animal
。所以这种方法是不可知的,它并不关心你经过什么类型的动物。
abstract class Animal {
abstract String talk();
}
class Cat extends Animal {
String talk() {
return "Meow!";
}
}
class Dog extends Animal {
String talk() {
return "Woof!";
}
}
void letsHear(final Animal a) {
println(a.talk());
}
int main() {
letsHear(new Cat());
letsHear(new Dog());
}
可以将具体实施分配给它的父母。
Animal cat = new Cat();
Animal dog = new Dog();
如果上述示例中的方法letsHear
仅接受Cat
,则您需要使用另一种接受Dog
的方法。
答案 2 :(得分:1)
尽量使用最高级别。它为您提供了更大的灵活性,让您可以在以后切换子类。如果您只是使用它本地,它并没有那么多,你可能可以改变整个定义没有任何副作用,但即使最好使用SuperClass。这表明在这种情况下你只需要在SuperClass中定义的功能,这是重要的部分。
在参数内部更为重要。想象一下,java标准库开发人员会定义Collections方法来获取像ArrayList这样的SubClasses。不仅需要更多的代码来接受Collection接口的每个SubClass,一旦创建一个新的子类,它将是不完整的。
总结:总是问自己,您真正需要哪些功能来完成您的操作,以及需要哪些超类。是List吗?采集?也许Iteratable?拿最抽象的一个。
答案 3 :(得分:1)
调用静态方法会以不同的方式工作。检查示例。
public class BaseClass {
public void compileSomeThing(){
System.out.println("Base Method ");
}
public static void doSomething(){
System.out.println("Base static method");
}
}
基类
public class SubClass extends BaseClass{
public void compileSomeThing(){
System.out.println("Sub Method" );
}
public static void doSomething(){
System.out.println("Sub static method");
}
}
子类。 和主要课程:
public static void main(String[]args){
BaseClass bs = new SubClass();
SubClass bs1 = new SubClass();
bs.compileSomeThing();
bs.doSomething();
System.out.println("..........");
bs1.compileSomeThing();
bs1.doSomething();
}
编译结果:
Sub Method
Base static method
..........
Sub Method
Sub static method
答案 4 :(得分:-1)
SubClass s1 = new SubClass(); SuperClass s2 = new SubClass();
在s2
上,您只能调用SuperClass
中声明的方法。
在s1
上,您可以调用SuperClass
中声明的方法以及SubClass
中声明的方法。