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

Java,什么';从不同的引用初始化对象时会有什么不同?,java,Java,当两个类被创建为超级类和子类时。如果其中一个对象是用不同的引用声明的,那么工作方式会有什么不同 class SubClass extends SuperClass SubClass s1 = new SubClass(); SuperClass s2 = new SubClass(); 与下一个进行比较 class SubClass extends SuperClass SubClass s1 = new SubClass(); SubClass s2 = new SubClass()

当两个类被创建为超级类和子类时。如果其中一个对象是用不同的引用声明的,那么工作方式会有什么不同

class SubClass extends SuperClass

SubClass   s1 = new SubClass();
SuperClass s2 = new SubClass();
与下一个进行比较

class SubClass extends SuperClass

SubClass s1 = new SubClass();
SubClass s2 = new SubClass();
s2
上,只能调用
超类中声明的方法。

s1
上,您可以调用在
超类中声明的方法以及在
子类中声明的方法

1) 子类s1=新的子类()

2) 超类s2=新的子类()

第一种解释:-

s1是子类的引用,持有子类的对象,因此它将调用子类的方法以及超类的方法,因为我们用子类方法扩展了超类方法,所以超类方法将自动可用于子类。我们可以在s1的帮助下调用超类和子类方法

第二种解释:-

S2是超类的引用,并持有子类的对象,所以这里我们必须考虑两种情况。 i) 方法重载:-方法重载是在编译时处理的,所以它总是调用超类的方法

ii)方法重写:-方法重写是在运行时处理的,因此它总是调用子类的方法。这个概念来自多态性

子类s1=新的子类()

子类s2=新的子类()


s1和s2都是子类的引用,并持有子类的对象,因此在这两种情况下,它都将调用子类对象。

多态性的好处在于能够有多个实现。正如您从下面的代码中所看到的那样,函数
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();

如果上述示例中的方法只接受猫,那么您需要另一种方法,该方法接受狗,始终尝试使用您能使用的最高级别。它为您提供了更大的灵活性,允许您以后切换子类。如果您只是在本地使用它,那么这并不是什么大问题,您可能会在没有任何副作用的情况下更改整个定义,但即使使用超类也会更好。这将表明在此上下文中,您只需要在超类中定义的功能,这是重要的部分

在参数中,它更为重要。想象一下,java标准库开发人员会定义Collections方法来获取ArrayList之类的子类。收集接口的每个子类不仅需要更多的代码,而且一旦创建了一个新的子类,代码就不完整了

小结:总是问自己完成操作真正需要哪些功能,需要哪个超类。是单子吗?收集也许可以迭代?以最抽象的一个为例

  • 调用一个方法将以不同的方式工作,若子类中声明的方法在超类中不存在,那个么它们对于超类的引用变量是不可见的。但您仍然可以通过向下转换调用它们,阅读更多关于静态和动态多态性的信息
  • 调用静态方法将以不同的方式工作。检查示例

    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
    
  • 了解更多信息:方法、重载、方法重写和方法隐藏。

  • 多态性…在第一种情况下,您只能调用
    s2
    上的
    SuperClass
    上定义的方法。我不确定多态性做什么。是方法的重写能力吗?试着给超类一个方法,你在子类中重写它。然后看看,当您在每个引用上调用它时,会调用哪一个
        Sub Method
        Base static method
          ..........
        Sub Method
       Sub static method