有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:无“抽象静态”的变通方法

我正在写一个关于扭曲拼图的应用程序:魔方、皮拉米克斯、Skewb等等。 我有一个抽象类“TwistyPuzzle”和派生类:TwistyCube、TwistyPyraminx等。 我有一个对话框,提供了每个拼图的基本信息:它的名字、发明者、发明年份、拼图工作原理的基本描述

关于每个谜题的信息最好保存在每个“实现”类TwistyCube、TwistyPyraminx等中。静态方法强制自己:

class TwistyCube extends TwistyPuzzle

static String getName()
  {
  return "Rubik Cube";
  }  

但似乎没有办法让需要显示这些信息的对话框查询类,因为Java中没有“抽象静态”方法的概念

那么我有什么选择呢?Java中缺少“抽象静态”的标准解决方法是什么


共 (1) 个答案

  1. # 1 楼答案

    正如您所指出的,您不能声明abstract static方法(或字段)

    这不仅仅是语法。根本原因是Java static成员不是继承的。这意味着static成员通常不能多态使用。当您调用static方法或访问static字段时,调用/使用哪个类成员的决定在编译时确定,完全基于编译时类型的考虑

    所以。。。大体上你想做的事做不到

    但有一个解决办法。如果要在方法上使用abstract,请将其声明为实例方法。无论你这样做是为了让你可以多态地使用这个方法。。。或者其他原因

    你反驳说:

    A method like that should be non-static because you'll always call it on an instance. – Thomas 2 hours ago

    Of course not - the name of all instances of 'TwistyRubik' is the same. It clearly belongs to the class, not its instances. – Ralf Kleberhoff 1 hour ago

    但我认为你没有抓住重点。方法不“属于”实例。方法属于类。即使是非静态方法。我们称非静态方法为“实例”方法,因为它们通常对特定实例的状态进行操作。但他们不需要这么做。实例方法可以返回关于它所属类的信息

    下面是我将如何编写您的示例:

    public abstract class TwistyPuzzle {
        public abstract String getName();
        ...
    }
        
    public class TwistyCube extends TwistyPuzzle
        public String getName();
            return "Rubik Cube";
        }
        ...
    }
    

    让我们来分析一下:

    • 问:它是否具有所需的行为<是的。每个TwistyCube实例都将返回"Rubik Cube"

    • 问:让这成为一个非静态的方法有没有空间开销
      答:不。方法代码是共享的,而且由于Java不将方法视为实例的可更新属性,因此没有每个对象的存储开销

    • 问:将其作为一种非静态方法是否会带来性能开销
      答:在大多数情况下不会。如果有开销,那么它是最小的

    • 问:与static方法相比,有什么优势吗<是的。getName()可以多态地与运行时方法调度一起使用

    那么这里的实际问题是什么?“归属”是什么意思

    坦率地说,我认为这只是你概念化实例方法的方式。对实例调用方法并不意味着它需要返回特定于该实例的信息

    把Java看作一种工具。按照设计的方式使用它。如果您想要abstract(例如多态)方法来传递有关当前Java类的信息,那么标准的方法


    跟进

    How about a separate enum - one value per one type of a TwistyPuzzle - that would provide such info?

    我想那会管用的。但是现在,您遇到了一个问题,即获取与您正在查询的特定TwistyPuzzle实例(或类)相关的正确enum值。而且你有一个可读性/可维护性问题,与生活在一个单独的类中的每个TwistyPuzzle类有关的信息;i、 e.enum