Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多态性/铸造/方法_Java_Casting_Polymorphism - Fatal编程技术网

Java多态性/铸造/方法

Java多态性/铸造/方法,java,casting,polymorphism,Java,Casting,Polymorphism,关于这一主题的澄清。因此,举例来说,我有: public interface Gaming { void play; } public abstract class Console implements Gaming { void play() {} } public class Xbox extends Console { void play() {} } public class XboxOne extends Xbox { void play() {} }

关于这一主题的澄清。因此,举例来说,我有:

public interface Gaming {
   void play;
}

public abstract class Console implements Gaming {
   void play() {}
}

public class Xbox extends Console {
   void play() {}
}

public class XboxOne extends Xbox {
   void play() {}
}
  • 我不能直接实例化
    控制台
    ,因为它是
    抽象的
  • 不过,我可以将控制台实例化为xbox

    Console fav = new Xbox();
    
    控制台fav=新Xbox()

  • 如果所有类都定义了
    play()
    方法。如果我调用
    fav.play()
    它将查看Xbox的播放方法,如果它没有播放方法,它将继续在层次结构上,直到找到该方法为止

  • 另外,如果我做了
    ((XboxOne)fav).play()
    ,它会执行XboxOne的播放方法吗?如果对象在层次结构中较低,我是否也只能强制转换对象

  • 如果
    Xbox
    类有
    getGamerscore
    方法,但控制台没有,我会吗 是否能够运行fav.getGamerScore()

  • 一般问题:

    =左边的类型显示了调用方法时java将查找哪个类(最特定的类)?(如果在那里找不到它,它将继续在层次结构中向上,直到找到该方法?)

    右边的类型仅代表编译类型。编译时,java将查看方法或数据是否属于编译类型,如果是,则一切正常?Java在运行时将不再查看它的编译类型

    强制转换只是帮助解决编译问题?比如,如果我想使用某个方法,但我的对象编译类型类似于接口、抽象类或其他东西,那么我强制转换,以便编译器在尝试访问运行时类型的方法时不会抱怨

    如果我说错了什么,请纠正我。我只是想把所有的规则都弄清楚。如果有人有任何有用的资源,那就太好了

    **我意识到我没有使用游戏界面

  • 是的,如果您在XBox上调用play方法,但它不在那里,它将调用基类中的方法

  • 您将无法将Xbox强制转换为派生类Xbox。您只能向上转换到控制台或向下转换到您创建的实际对象的类型(XBox)。如果你没有首先创建XBox,你会得到一个运行时ClassCastException

  • 如果XBox getGamerscore,但控制台没有。如果像这样在中构造,则无法调用该方法。如果getGamerscore是控制台的抽象方法,则可以调用它

  • 关于你的一些一般性问题。我鼓励你上网闲逛。但简单地说,当你做这样的事情时:

    Console fav =  new Xbox();
    
    您正在构造Xbox类型的对象,并将其分配给Console类型的变量。出于编译时检查的目的,XBox现在是一个控制台,可以传递给需要控制台的方法。请在此处查看此帖子:

  • 是的,如果您在Xbox中重写了play(),那么它将被调用,否则它将在抽象类中使用默认实现

  • 您不能将控制台强制转换为Xbox。然而,如果您已经声明fav属于Xbox类型,那么您就可以将其转换为Xbox

  • 没有


  • 你需要区分两件事

  • 静态类型
  • 这是编译时已知的内容,将用于方法签名查找。因此,如果您有
    Console fav=new Xbox()
    ,那么
    fav
    的静态类型将是
    Console
    。 因此,如果您尝试调用
    fav.play()
    ,编译器将在
    控制台
    类中查找
    播放
    签名;如果
    Console
    不支持此方法,那么Java甚至不会编译它

  • 动态类型
  • 这是变量在运行时的状态,因此在启动程序
    Console fav=new Xbox()
    后,
    fav
    的动态类型将是
    Xbox
    (但静态类型仍然是
    Console

    现在回答你的问题

    如果所有类都定义了播放方法。如果我叫fav.play();它将查看Xbox的播放方法,如果它没有播放方法,它将继续在层次结构上,直到找到该方法

    如果您所说的所有类都是指基本
    控制台
    类(至少是抽象方法),那么是的

    另外,如果我做了((XboxOne)fav.play(),它将执行XboxOne的play方法?,而且如果对象在层次结构中处于较低的位置,我是否也只能强制转换该对象

    您可以随时向上转换-从更具体的(
    Xbox
    )到更通用的(
    控制台
    );降级只有在一定程度上才有可能——如果有成功的机会的话。所以通常向下转换到动态类型应该会成功。(例如,
    控制台fav=新的Xbox()
    +
    (Xbox)控制台)

    如果Xbox类有一个getGamerscore方法,但控制台没有,我是否能够运行fav.getGamerscore()

    没有,如前所述
    fav
    Console
    ,因此不知道您所说的
    getGamerScore
    是什么意思。但是,您仍然可以执行
    ((XBox)fav).getGamerScore

    强制转换只是帮助解决编译问题

    强制转换可能非常危险,因为您正在对变量进行假设。 如果您正在调用
    ((XBox)fav).getGamerScore
    ,那么您已经知道类型必须是
    XBox
    ,并且拥有
    控制台fav
    可能是错误的,因为您无法在其中分配任何类型的控制台

    我不能直接实例化控制台,因为它是抽象的

    正确的

    不过,我可以将控制台实例化为xbox

    Console fav = new Xbox();
    
    正确的

    如果所有类都定义了
    play()
    方法。如果我调用
    fav.play()
    它将查看Xbox的播放方法,如果它没有播放方法,它将继续在层次结构上,直到找到该方法为止

    对。这并不是它在现实中是如何发生的(它是优化的),而是康塞普
    public abstract class Console implements Gaming {
       // no impl. not needed because already declared in Gaming
       // just for clarity
       public abstract void play(); 
    }
    
    Console myAnonymousConsole = new Console() {
       public void play() { System.out.println("Hello there"); }
    };
    
        Console a = new XBoxOne();
        XBox b = (XBox)a; // ok because a is-a Xbox
        XBoxOne c = (XBoxOne)a; // ok because a is-a XBoxOne
    
        Console a = new XBox();
        XBox b = (XBox)a; // ok because a is-a Xbox
        XBoxOne c = (XBoxOne)a; // ko! because a is-not-a XBoxOne
    
        public class XBox extends Console {
           public void play() { System.out.println("In XBox"); 
        }
        public class PS3 extends Console {
           public void play() { System.out.println("In PS3"); 
        }
        List<Console> consoles = Arrays.asList(new XBoxOne(), new PS3());
        for (Console c : consoles) {
           c.play(); // polymorphism here
        } 
    
    In XBox
    In PS3