我的问题是静态关键字的一个特定用法.可以使用static关键字来覆盖不属于任何函数的类中的代码块.例如,以下代码编译:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
Run Code Online (Sandbox Code Playgroud)
如果你删除static它抱怨的关键字,因为变量a是final.但是,可以删除两个final和static关键字并使其编译.
这两种方式让我感到困惑.我怎么能有一个不属于任何方法的代码部分?如何调用它?一般来说,这种用法的目的是什么?或者更好,我在哪里可以找到关于此的文档?
我最近在工作中遇到过这个问题.虽然我不确定这是一个好主意,但我不明白编译器如何处理静态块.
这是一个例子:
考虑你有类A和B:
public class A {
public final static List<Integer> list;
static {
list = new ArrayList<>();
}
}
public class B {
public final static int dependsOnA;
static {
dependsOnA = A.list.size();
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个只读的主要课程B.dependsOnA.
静态块B依赖于in A,因为它使用list静态变量.
现在,代码正确执行,并且NullPointerException在运行时不会引发.但是什么是确保list在其他地方潜在使用之前进行初始化的机制是什么?
我注意到最近在很多项目中,我都注意到了
static {
//some code here
}
Run Code Online (Sandbox Code Playgroud)
我只是在寻找一些关于此的信息,特别是我习惯于在方法中使用的代码块,或者只是类,这只是用静态修饰符设置块中的所有代码,还是有更多的东西给它?
假设我有一些每类数据:(AandB.h)
class A
{
public:
static Persister* getPersister();
}
class B
{
public:
static Persister* getPersister();
}
Run Code Online (Sandbox Code Playgroud)
......还有很多课程.我想做的事情如下:
persistenceSystem::registerPersistableType( A::getPersister() );
persistenceSystem::registerPersistableType( B::getPersister() );
...
persistenceSystem::registerPersistableType( Z::getPersister() );
Run Code Online (Sandbox Code Playgroud)
......为每个班级.
我的问题是:有没有办法自动构建每类数据列表,这样我就不必枚举大块中的每个类型(如上例所示)?
例如,您可以这样做的一种方法是:(AutoRegister.h)
struct AutoRegisterBase
{
virtual ~AutoRegisterBase() {}
virtual void registerPersist() = 0;
static AutoRegisterBase*& getHead()
{
static AutoRegisterBase* head= NULL;
return head;
}
AutoRegisterBase* next;
};
template <typename T>
struct AutoRegister : public AutoRegisterBase
{
AutoRegister() { next = getHead(); getHead() = this; }
virtual void registerPersist()
{
persistenceSystem::registerPersistableType( T::getPersister() …Run Code Online (Sandbox Code Playgroud) 我认为这比直接编码问题更多是针对设计的问题。
我想实现一个websocket服务,该服务将来自国外http://资源的更新数据集提供给客户端。但是我想在第一个客户端连接之前就可以使用数据,所以@OnLoad表示法不会做。
在HttpServlet世界上我会
@Override
public void init() throws...
仅使用JSR-356我无法找到合适的方法。我尝试使用custom,ServerEndpointConfig.Configurator但这似乎无法让我访问类似于init()from的方法HttpServlet。
所以我的问题是:
让websocket Endpoint类扩展HttpServlet使我可以访问该init()方法,并且可以在其中放置初始逻辑。这是解决我的问题的合适方法,还是我错过了JSR-356中的某些功能,它可以很好地完成工作并且无需导入大部分未使用的servlet包?
非常感谢你!
我遇到了以下情况:
class Foo {
static {
// setup for logging and configuration
}
public static void setup() {
// do nothing
}
}
Run Code Online (Sandbox Code Playgroud)
这是惯用的Java代码吗?是否应该避免这种具体原因?
这是在测试套件中找到的.
我最初担心的是理论上可以在不调用#setup()的情况下进行初始化.
可能重复:
Java中的静态块
我遇到了以下用途,static并没有弄清楚它的作用.我知道使用例如static String hello = "World";但我不明白以下内容.
static {
loadFromProperties(new Properties());
}
Run Code Online (Sandbox Code Playgroud) 我从Oracle Java教程得到以下代码你可以在这里找到这个在"12.4.类和接口的初始化"标题下的执行
类的初始化包括执行其静态初始化程序和类中声明的静态字段(类变量)的初始化程序.
如果有人向我解释如何"静态字段的初始化器"指的是"类变量",那将会很棒.
我不是OOP的专业人员所以请耐心等待我.
这段代码来自android的自动生成Master/Detail Flow项目:
static {
// Add 3 sample items.
addItem(new DummyItem("1", "Item 1"));
addItem(new DummyItem("2", "Item 2"));
addItem(new DummyItem("3", "Item 3"));
}
Run Code Online (Sandbox Code Playgroud)
那是什么?我的意思是它是一个方法?一个构造函数?或者是什么?
我正在Head First Java中进行练习.它具有以下代码:
static {
System.out.println("Super constructor block");
}
Run Code Online (Sandbox Code Playgroud)
我没有得到大括号之前的静态修饰符.这叫什么?我知道静态变量等我尝试在线搜索但无法得到答案.谢谢.
假设一个类中有一个静态块
public class Menu {
private static Map<String, String> buttonEventMap = new HashMap<String, String>();
static {
buttonEventMap.put("show-user","show");
buttonEventMap.put("delete-user","delete");
}
public static Map<String, String> getHashMap() // To get the hash map
}
Run Code Online (Sandbox Code Playgroud)
什么是块的生命周期,何时实例化,程序启动时或者我们创建类的第一个对象时
我不确定这是做什么的,我以前没见过,也找不到任何有关它的信息.
private static String[] names = { "A.ttf" };
private static Map<String, Font> cache = new ConcurrentHashMap<String, Font>(names.length);
static {
for (String name : names) {
cache.put(name, getFont(name));
}
}
Run Code Online (Sandbox Code Playgroud) 当我没有为该类的对象(匿名)创建引用变量时,为什么不执行类中的静态块?
例如,让我们考虑一下这个简单的类:
public class StaticDemo {
private static int x;
public static void display(){
System.out.println("Static Method: x = "+x);
}
static {
System.out.println("Static Block inside class");
}
public StaticDemo(){
System.out.println("Object created.");
}
}
Run Code Online (Sandbox Code Playgroud)
使用它的另一个类:
public class UseStaticDemo {
public static void main(String[] args) {
StaticDemo Obj = new StaticDemo();
Obj.display();
System.out.println("------------");
new StaticDemo().display();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Static Block inside class
Object created.
Static Method: x = 0
------------
Object created.
Static Method: x = 0
Run Code Online (Sandbox Code Playgroud) java ×12
static ×7
c++ ×1
classloader ×1
fonts ×1
glassfish-4 ×1
idioms ×1
java-8 ×1
java-ee-7 ×1
jvm ×1
member ×1
oop ×1
static-block ×1
tomcat8 ×1
websocket ×1