有 Java 编程相关的问题?

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

java提供了不同的方法来建立常量

在java中,有没有一种公认的首选方法可以像下面这样做

public class SomeSubclass extends SomeSuperclass {

    private static int x = 3;

    public SomeSubclass() {
        super(x);
    }
}

如中所示,如果我有许多从一个超类扩展而来的子类,并且它们之间的差异是常数,那么实现这一点的最佳方法是什么?在这里,您可以想象每个子类只是改变x和任何其他常量的值

拥有大量实例变量并保持构造函数的一致性是一种好的做法吗?而且,当我意识到我的变量实际上不是常数时。将它们设置为公共静态决赛是否更好

此外,关于施工人员:

public class Someclass extends Aclass {
    public Someclass() {
        super(3);
        setY(9);
    }
}

假设扩展超类的每个子类都对构造函数进行单参数调用,同时也对setY进行调用,setY是超类中的setter方法。在构造函数中调用setter方法更好,还是在超类中调用构造函数更好,后者将接受并自动执行setY的功能


共 (1) 个答案

  1. # 1 楼答案

    这是我们进行面向对象编程的主要原因之一——对象是多态的。如果许多对象在某些属性或行为上存在差异,请将其作为虚拟getter/setter或方法:

    class SomeSubclass extends SomeSuperclass {
        @Override
        int getX() { return 3; }
    
        public SomeSubclass() {
            super();
        }
    }
    
    abstract class SomeSuperclass {
        abstract int getX();
        SomeSuperclass() {
            System.out.println( this.getX() );        
        }
    }
    

    在这里,它将起作用,因为在Java中,所有方法调用(甚至来自构造函数,sic!)它们是虚拟的

    通常避免从构造函数中调用可重写的方法(如果我们调用假定整个对象已构造的方法,则可能会导致内存和引用冲突)

    在您的情况下,请考虑:继承真的是您需要的最佳机制吗?也许封装、状态或类似的东西是更好、更自然的解决方案

    我的意思是,如果你真的需要超类的构造函数中的子类的属性,请考虑做^ {< CD1>}的成员EME> ^ {< CD2>},而不是继承它。p>

    如果它是更大的东西:请考虑将第三个对象——一个状态——包含所有成员和吸气剂,将存储在类的每一个实例中。p>

    在简单的场景中,只需生成static final int并将其作为参数传递给超级构造函数