我遇到了一个问题,我正在创建一个ThreadLocal并用新的ThreadLocal初始化它.问题是,我在概念上只是想要一个持久的列表,这个列表会延续线程的生命,但我不知道是否有办法在Java中初始化每个线程的东西.
例如,我想要的是:
ThreadLocal static {
myThreadLocalVariable.set(new ArrayList<Whatever>());
}
Run Code Online (Sandbox Code Playgroud)
这样它就可以为每个线程初始化它.我知道我可以这样做:
private static Whatever getMyVariable() {
Whatever w = myThreadLocalVariable.get();
if(w == null) {
w = new ArrayList<Whatever>();
myThreadLocalVariable.set(w);
}
return w;
}
Run Code Online (Sandbox Code Playgroud)
但是每次使用它时我都不需要检查它.我能在这做什么更好的事情吗?
据说java中的静态块只在加载该类时运行一次.但它究竟意味着什么?在哪一点上是由JVM(Java虚拟机)加载的类?
是在调用该类中的main方法时?并且当main方法开始执行时,是否还加载了同一类的所有超类?
考虑A扩展B和B扩展C.所有都有静态块.如果A有main方法,那么静态块的执行顺序是什么?
C#静态构造函数和Java静态块之间的真正区别是什么?
它们都必须是无参数的.当首次使用相关类时,它们都只被调用一次.
我错过了什么,或者他们是同一件事,只是用不同的名字?
我想用magento中的JSON类型的块代码传递一个变量,
{{block type="multibanners/multibanners" category_id="9" name="multibanners" alias="multibanners" template="multibanners/multibanners.phtml"}}
Run Code Online (Sandbox Code Playgroud)
来自cms页面的内容区域,但我没有收到任何东西.
如果我使用块动作方法比我轻易获得我的价值.任何人都知道如何使用我的自定义块传递变量?
我想通过一个例子知道c或c ++中的静态块是什么?我知道什么是静态但静态和静态块有什么区别?
在假设的情况下,我有一个这样的课:
import java.io.File;
import java.util.Scanner;
class X
{
static Scanner scanner;
static
{
scanner = new Scanner(new File("X.txt"));
}
}
Run Code Online (Sandbox Code Playgroud)
在编译时,我明白了
未报告的例外
java.io.FileNotFoundException; 必须被抓住或宣布被抛出
因为public Scanner(File source) throws FileNotFoundException.
要解决这个问题,我可以scanner = new...在try/catch语句中添加一行:
static
{
try
{
scanner = new Scanner(new File("X.txt"));
}
catch(Exception e)
{
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我有什么方法可以做到这样的事情:
static throws java.io.FileNotFoundException
{
scanner = new Scanner(new File("X.txt"));
}
Run Code Online (Sandbox Code Playgroud)
这是一个假设的情况.请不要说"那你为什么要那样做?" 或者"这是制作扫描仪的更好方法!"
我有一个关于静态块的问题:
假设我的班级看起来像这样:
class SomeClass {
static {
System.out.println("static block");
}
}
Run Code Online (Sandbox Code Playgroud)
我在SomeClass某处定义了一个类型的变量.
public static void main(String args[]) {
SomeClass foo;
}
Run Code Online (Sandbox Code Playgroud)
现在我认为静态块将被执行,但事实并非如此.据我所知,只要类加载器加载SomeClass类,就会执行静态块.现在我真正的问题:
一旦我定义了该类型的变量,是不是加载了类?.如果是,为什么不执行静态块?
如果答案应该是no,那么我怎么知道类加载器是否已经加载了类以及加载类的不同可能性(我知道2:初始化变量并使用静态字段/方法)
class DemoClass {
public static void main(String args[]) {
System.out.println("Start");
A a=new D();
}
}
class A {
static {
System.out.println("Static A");
A c=new C();
}
public A() {
System.out.println("Constr A");
}
}
class B extends A {
static {
System.out.println("Static B");
}
public B() {
System.out.println("Constr B");
}
}
class C extends B {
static {
System.out.println("Static C");
}
public C() {
System.out.println("Constr C");
}
}
class D extends C {
static {
System.out.println("Static D");
}
public D() { …Run Code Online (Sandbox Code Playgroud) 我可以在静态初始化块中添加abstract关键字,但我不能添加抽象方法
abstract void draw();
Run Code Online (Sandbox Code Playgroud)
所以我只能在静态块中添加抽象类,如下所示:
static {
abstract class Abstract {
abstract String test();
}
class Extends extends Abstract {
@Override
String test() {
return null;
}
}
new Extends().test();
Run Code Online (Sandbox Code Playgroud)
但是在静态块中添加类层次结构并不是真实的,它将在低于私有的访问级别,abstract静态块内是否有其他用法?
As per java doc, static block is executed when the class is initialized.
Could anyone please tell me why static block is not executed when I run below code?
class A {
static {
System.out.println("Static Block");
}
}
public class Main {
public static void example1() {
Class<?> class1 = A.class;
System.out.println(class1);
}
public static void example2() {
try {
Class<?> class1 = Class.forName("ClassLoading_Interview_Example.ex1.A");
System.out.println(class1);
}catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
example1();
}
}
Run Code Online (Sandbox Code Playgroud) static-block ×10
java ×8
c ×1
c# ×1
c++ ×1
classloader ×1
classloading ×1
execution ×1
magento ×1
static ×1
thread-local ×1
throws ×1
try-catch ×1