小编Cli*_*ira的帖子

在像Java这样的静态类型语言中动态方法解析背后的原因是什么

我对Java的动态/静态类型和动态方法解析的概念感到有点困惑.

考虑:

public class Types {

    @Override
    public boolean equals(Object obj){
        System.out.println("in class Types equals()");
        return false;//Shut-up compiler!
    }

    public static void main(String[] args){
        Object typ = new Types();
        typ.equals("Hi");//can do this as String is a subclass of Object
    }
}
Run Code Online (Sandbox Code Playgroud)

第一:引用变量typ的类型是Type,不是吗?!

那么,为了方法覆盖,打包有静态类型对象和动态类型类型的原因是什么?

第二:编译器是否有足够的信息来调用正确的equals()?

如果类类型没有重写的equals(),那么它可以调用Object.equals()方法.

在这种情况下类类具有,并且编译器知道它.

为什么这不能像重载一样早期绑定?为什么要把它留给JVM?

java overriding

3
推荐指数
1
解决办法
138
查看次数

在Java中使用没有实例变量的实例方法

我是Java语法的新手,正在研究有关受保护访问修饰符的问题.标题为"受保护的成员从java中的不同包访问 - 一种好奇心".

受保护的成员访问java中不同的包 - 一个好奇心

在该问题中,提到了以下代码:

package packageOne;

public class Base{
    protected void display(){
    system.out.println("in Base");
    }
}

package packageTwo;

public class Derived extends packageOne.Base{
    public void show(){
    new Base().display();//this is not working throws compilation error that
                         //display() from the type Base is not visible   
    new Derived().display();//is working
    display();//is working
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是关于最后一行代码.

display(); //is working
Run Code Online (Sandbox Code Playgroud)

对我来说,这行不编译,这是有道理的,因为该方法是从静态上下文中引用的.

我理解了使用受保护成员和引用变量类型的规则,但使用没有引用变量的非静态受保护成员似乎让我感到困惑.

阅读答案,我没有看到其他人有这个问题,除了最后的答案.但这个答案似乎与提出的问题无关.

对不起,这个问题可能看起来很迂腐或原始,但它打扰了我,因为这打破了OO编程.

我在这里错过了什么吗?请指教,

谢谢

java

1
推荐指数
1
解决办法
69
查看次数

标签 统计

java ×2

overriding ×1