对于以下代码:
public class StaticFinal
{
private final static int i ;
public StaticFinal()
{}
}
Run Code Online (Sandbox Code Playgroud)
我得到编译时错误:
StaticFinal.java:7: variable i might not have been initialized
{}
^
1 error
Run Code Online (Sandbox Code Playgroud)
这符合JLS8.3.1.2,其中说:
如果空白的final(§4.12.4)类变量未被声明它的类的静态初始化程序(第8.7节)明确赋值(第16.8节),则为编译时错误.
所以,完全理解上述错误.
但现在考虑以下内容:
public class StaticFinal
{
private final static int i ;
public StaticFinal()throws InstantiationException
{
throw new InstantiationException("Can't instantiate"); // Don't let the constructor to complete.
}
}
Run Code Online (Sandbox Code Playgroud)
这里,构造函数永远不会完成,因为它InstantiationException是在构造函数的中间抛出的.这段代码编译得很好!!
为什么?为什么这段代码没有显示关于final变量非初始化的编译时错误i?
编辑
我正在使用javac 1.6.0_25命令提示符编译它(不使用任何IDE)
如果我有一个带有a的类attr_accessor,则默认创建一个实例变量以及相应的getter和setter.但是,有没有办法让它来创建一个类变量或类实例变量而不是创建一个实例变量?
ruby instance-variables class-variables class-instance-variables
ruby类实例的东西让我很头疼.我明白了......
class Foo
@var = 'bar'
end
Run Code Online (Sandbox Code Playgroud)
...这@var是创建的类的实例上的变量.
但是如何创建子类可覆盖的类变量?
这是我在Python中做的一个例子:
class Fish:
var = 'fish'
def v(self):
return self.var
class Trout(Fish):
var = 'trout'
class Salmon(Fish):
var = 'salmon'
print Trout().v()
print Salmon().v()
Run Code Online (Sandbox Code Playgroud)
哪个输出:
trout
salmon
Run Code Online (Sandbox Code Playgroud)
我如何在ruby中做同样的事情?
假设我有一个这样的类(并且还假设所有私有变量:
public class Item {
private String _id = null;
private String _name = null;
private String _description = null;
...
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想构建这个类的toString()表示,我会在Item类中做这样的事情:
@Override
public String toString() {
return (_id + " " + _name + " " + _description);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我在课堂上说15个私有变量呢?我是否必须像这样写出每个变量的名称?
理想情况下,我想通过遍历此类的私有变量列表并构造字符串表示来完成任务:
@Override
public String toString() {
ArrayList<String> members = getClass().getMembers(); //Some method like this
String string = "";
for(...)
string += members[i] + " ";
}
Run Code Online (Sandbox Code Playgroud)
或者也许是一个toJSON方法,我仍然需要访问这些变量的名称.有什么建议?
PHP在无共享环境中运行,在这种情况下,这意味着每个Web请求都在一个干净的环境中运行.除了通过单独的持久层(文件系统,数据库等)之外,您无法访问其他请求的数据.
Ruby on Rails怎么样?我刚看了一篇博文,说明单独的请求可能会访问同一个类变量.
我想到这可能取决于Web服务器. Mongrel的FAQ说明Mongrel每个请求使用一个线程 - 建议无共享环境.FAQ继续说RoR不是线程安全的,这进一步表明RoR不会存在于共享环境中,除非新请求重用从先前请求创建的内存中对象.
显然这具有巨大的安全后果.所以我有两个问题:
更新:我会进一步澄清. 在Java servlet容器中,您可以拥有跨多个请求持久化的对象.这通常用于缓存多个用户可以访问的数据,数据库连接等.在PHP中,这不能在应用程序层完成,它必须在像Memcached这样的单独的持久层中完成.因此,双重问题是:哪种情况是RoR(PHP或Java),如果像Java一样,哪些数据类型在多个请求中持续存在?
我需要制作一堆类变量,我想通过循环遍历这样的列表来实现:
vars=('tx','ty','tz') #plus plenty more
class Foo():
for v in vars:
setattr(no_idea_what_should_go_here,v,0)
Run Code Online (Sandbox Code Playgroud)
可能吗?我不想让它们成为一个实例(在__init__中使用self),而是作为类变量.
如果我在PHP中有一个实例,那么获取该实例的静态属性('类变量')的最简单方法是什么?
这个
$classvars=get_class_vars(get_class($thing));
$property=$classvars['property'];
Run Code Online (Sandbox Code Playgroud)
声音真的太过分了.我期待
$thing::property
Run Code Online (Sandbox Code Playgroud)
要么
$thing->property
Run Code Online (Sandbox Code Playgroud) 我无法运行这段代码.该课程是学生,它有一个IdCounter,它就是问题所在.(第8行)
class Student:
idCounter = 0
def __init__(self):
self.gpa = 0
self.record = {}
# Each time I create a new student, the idCounter increment
idCounter += 1
self.name = 'Student {0}'.format(Student.idCounter)
classRoster = [] # List of students
for number in range(25):
newStudent = Student()
classRoster.append(newStudent)
print(newStudent.name)
Run Code Online (Sandbox Code Playgroud)
我想把这个idCounter放在我的Student班级里面,所以我可以将它作为学生名字的一部分(例如,它真的是一个ID#Student 12345.但我一直在收到错误.
Traceback (most recent call last):
File "/Users/yanwchan/Documents/test.py", line 13, in <module>
newStudent = Student()
File "/Users/yanwchan/Documents/test.py", line 8, in __init__
idCounter += 1
UnboundLocalError: local variable …Run Code Online (Sandbox Code Playgroud) 我知道有人说@@class_var在Ruby中应该避免使用类变量(例如),而应该@instance_var在类范围中使用实例变量(例如):
def MyClass
@@foo = 'bar' # Should not do this.
@foo = 'bar' # Should do this.
end
Run Code Online (Sandbox Code Playgroud)
为什么在Ruby中使用类变量不受欢迎?
class-variables ×10
class ×3
ruby ×3
java ×2
python ×2
static ×2
compilation ×1
final ×1
inheritance ×1
late-binding ×1
objective-c ×1
oop ×1
php ×1
reflection ×1
security ×1
tostring ×1