Java,从不同的引用初始化对象时会有什么不同?

时间:2017-03-03 11:34:19

标签: java

当创建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();

5 个答案:

答案 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)

  1. 调用方法将以不同的方式工作,如果在子类中声明的方法在超类中不存在,那么它们对于超类的引用变量是不可见的。但你仍然可以通过向下转换调用它们,阅读更多关于静态和动态多态,
  2. 调用静态方法会以不同的方式工作。检查示例。

    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();
    

    }

  3. 编译结果:

        Sub Method
        Base static method
          ..........
        Sub Method
       Sub static method
    
    1. 详细了解:方法,重载,方法重写和方法隐藏。 http://www.javatpoint.com/method-overloading-in-java http://beginnersbook.com/2013/04/runtime-compile-time-polymorphism/ http://crunchify.com/java-method-hiding-and-overriding-override-static-method-in-java/

答案 4 :(得分:-1)

SubClass   s1 = new SubClass();
SuperClass s2 = new SubClass();

s2上,您只能调用SuperClass中声明的方法。 在s1上,您可以调用SuperClass中声明的方法以及SubClass中声明的方法。