当前位置: 首页 > 面试题库 >

为什么我们不应该在Java中使用受保护的静态

楚鸿波
2023-03-14
问题内容

我正在解决这个问题,有没有一种方法可以覆盖Java中的类变量? 第36条反对意见是:

如果您看到protected static,请运行。

谁能解释为什么protected static皱眉呢?


问题答案:

这是一个风格上的问题,而不是直接的问题。这表明您没有正确考虑班上正在发生的事情。

考虑一下什么static意思:

此变量存在于类级别,在每个实例 中并不单独存在,并且在扩展me的类中没有独立存在

考虑一下什么protected意思:

该变量可以在此类,同一包中的 类以及扩展我的 类中看到。

这两种含义并不完全互斥,但非常接近。

我唯一可以看到的是可以将两者一起使用的情况是,如果您有一个设计成可扩展的抽象类,然后扩展类可以使用原始对象中定义的常量来修改行为。这种安排很可能最终会变得非常混乱,并且表明类的设计存在缺陷。

在大多数情况下,最好将常量设为public,因为这样会使所有内容更清洁,并使子类的子类具有更大的灵活性。在很多情况下,组合比继承要好得多,而抽象类则强制继承。

要查看一个示例,说明如何破坏事物,并说明变量没有独立存在的含义,请尝试以下示例代码:

public class Program {
    public static void main (String[] args) throws java.lang.Exception {
        System.out.println(new Test2().getTest());
        Test.test = "changed";
        System.out.println(new Test2().getTest());
    }
}

abstract class Test {
    protected static String test = "test";
}

class Test2 extends Test {
    public String getTest() {
        return test;
    }
}

您将看到结果:

test
changed

自己尝试一下:https://ideone.com/KM8u8O

Test2是能够访问静态成员testTest无需限定名称-但它没有继承或让自己的副本。它正在查看内存中完全相同的对象。



 类似资料:
  • 问题内容: 我有2个线程T1和T2,两者都有不同的工作,因此通常我们更喜欢通过线程Joins完成此任务。 但是我们无需使用join()就可以做到这一点。我们可以在T1线程中添加T2线程的代码。这有什么区别? 问题答案: 主要区别在于,当我们将T2线程与T1连接在一起时,T2执行该任务的时间也可以由T1占用,这意味着它们将并行执行不同的任务。但是,当您在T1中包含T2线程代码时,不会发生这种情况。线

  • 问题内容: 我在脚本顶部看到了几个使用此脚本的py脚本。在什么情况下应该使用它? 问题答案: 根据文档:这允许你从默认的ASCII切换到其他编码,例如UTF-8,Python运行时在必须将字符串缓冲区解码为unicode时将使用该编码。 此功能仅在Python扫描环境时在Python启动时可用。必须在系统范围的模块中调用,评估完该sys模块后,将从该模块中删除该功能。 实际使用它的唯一方法是将属性

  • 问题内容: 建议在处理现实世界的货币值时,使用BigDecimal而不是Double。但是我没有令人信服的解释,只是“通常是这样做的”。 您能谈谈这个问题吗? 问题答案: 这称为精度损失,在处理非常大的数字或非常小的数字时非常明显。在许多情况下,带小数的十进制数字的二进制表示形式是近似值,而不是绝对值。要了解为什么需要阅读二进制形式的浮点数表示形式。这是链接:http : //en.wikiped

  • 从外观上看-似乎创建了一个对象的克隆。如果是这样,那么对于实现可克隆接口(只有不可变对象是新的,因为可变对象有引用复制)的关注,哪一个是最好的,为什么? 我昨天实现了克隆,然后意识到我必须为非字符串/首字母元素提供自己的修改。然后我被告知我现在正在使用的。这两个实现似乎都提供了类似的功能。 谢谢

  • 问题内容: 为什么我不能在包外部使用受保护的构造函数来编写这段代码: Check.java 即使我扩大了班级,为什么仍会收到错误消息?请解释 编辑: 编译错误: 构造函数Example()不可见 问题答案: protected修饰符仅用于包中以及包外部的子类中。使用对象创建对象时,默认情况下将调用父类的构造函数。 由于父类构造函数受到保护,因此您会遇到编译时错误。您需要根据JSL 6.6.2.2调

  • 问题内容: Java中的原始类型是什么?为什么我经常听到不应该在新代码中使用它们的信息? 如果我们不能使用原始类型,那有什么选择呢?有什么更好的选择? 问题答案: 什么是原始类型? Java语言规范对原始类型的定义如下: JLS 4.8原始类型 原始类型定义为以下之一: 通过采用通用类型声明的名称而没有随附的类型参数列表而形成的引用类型。 数组类型,其元素类型为原始类型。 未从的超类或超接口继承s