我有一个JavaScript类,我想这样做它不能被子类化.(类似于在Java中使用"final"关键字标记类.)这是我的JavaScript类:
function Car(make, model) {
this.getMake = function( ) { return make; }
this.getModel = function( ) { return model; }
}
Run Code Online (Sandbox Code Playgroud) 有没有什么情况下使用最终实例变量而不是静态最终实例变量是有意义的,当你在编译时已经知道它的值时它对所有实例都是一样的?
我的意思是,尽管这种初始化在语法上是有效的:
class Test {
final int size = 3;
...
}
Run Code Online (Sandbox Code Playgroud)
它将为每个实例创建一个副本,所以问题是,是否有任何情况下,这样做是有意义的,而不是:
class Test {
static final int size = 3;
...
}
Run Code Online (Sandbox Code Playgroud)
并为所有实例制作一份副本.
谢谢
如果你能弄清楚如何重命名这个问题,我愿意接受建议。
在 Dart 语言中,可以编写一个带有 final 字段的类。这些是只能在构造函数体运行之前设置的字段。这可以在声明时(通常用于类内的静态常量),在声明构造函数或使用this.field速记时的初始化列表语法中:
class NumBox{
final num value;
NumBox(this.value);
}
Run Code Online (Sandbox Code Playgroud)
假设我实际上需要对实例创建进行一些处理,并且不能只是在构造函数之前初始化该字段。我可以切换到使用带有 getter 的私有非最终字段:
class NumBox{
num _value;
NumBox(num v) {
_value = someComplexOperation(v);
}
num get value => _value;
}
Run Code Online (Sandbox Code Playgroud)
或者我可以使用工厂构造函数获得类似的行为:
class NumBox{
final num value;
factory NumBox(num v) {
return new NumBox._internal(someComplexOperation(v));
};
NumBox._internal(this.value);
}
Run Code Online (Sandbox Code Playgroud)
几年前我尝试学习 Dart 时遇到了类似的问题,现在我有更多的包袱,我仍然不知道。什么是更聪明的方法来做到这一点?
Flutter 正在抱怨 ,_isSelected因为它不是final。问题是这是must not最终的,因为它是在buttonPressed......
class SelectionButton extends StatefulWidget {
final String title;
final Function(String) onSelectionButtonTap;
bool isSelected;
SelectionButton({
required this.title,
required this.onSelectionButtonTap,
required this.isSelected,
});
@override
_SelectionButtonState createState() => _SelectionButtonState();
}
class _SelectionButtonState extends State<SelectionButton> {
@override
Widget build(BuildContext context) {
return Expanded(
child: GestureDetector(
onTap: () {
setState(() {
widget.onSelectionButtonTap(widget.title);
widget.isSelected = !widget.isSelected;
});
},
child: Container(
decoration: BoxDecoration(
color: widget.isSelected ? AppColors.primary : AppColors.white,
borderRadius: BorderRadius.circular(
scaleWidth(10),
),
),
child: …Run Code Online (Sandbox Code Playgroud) 我想知道为什么方法本地的变量不能被声明为final.有什么具体原因吗?
这是否意味着Java中没有局部常量?
private final List<KeyListener> keyListeners= new CopyOnWriteArrayList<KeyListener>();
public void addKeyListener(KeyListener keyListener){
keyListeners.add(keyListener);
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我将keyListeners声明为final,也是线程安全的.我假设最终我的意思是听众的状态在施工后无法改变.但是我在addKeyListener()方法中没有做同样的事情吗?为什么编译器没有给我一个警告?我在这里错过了什么?
有什么区别final static int x = 1;和static final int x=1?换句话说,java编译器x在两种情况下都会以完全相同的方式表示吗?
编辑:编译器在静态和最终方面有任何优先级或优先级吗?
我知道静态意味着,内存中只有一个实例.我知道final意味着它不能被改变或子类化,我也知道在java接口中定义的任何变量都是静态final
所以现在问题是,为什么我可以在"XFace"类的界面"MyFace"中超越最终的静态变量"a"?
例:
public interface MyFace {
static final int a = 15;
void smile();
}
Run Code Online (Sandbox Code Playgroud)
然后在课堂上,我可以轻松地骑过a,与当地人一起,
public class XFace implements MyFace {
@Override
public void smile() {
int a=3; // over riding interface's a variable and suprsingly it works !
System.out.println(a*2); // will print 6
}
Run Code Online (Sandbox Code Playgroud)
为什么我可以在smile()方法中定义int a = 3?是不是"一个"最终和静态?它怎么可能被覆盖?
我似乎无法弄清楚这个错误说"世界必须被宣布为最终".有什么建议?我正在制作一个gridworld项目(匹配游戏).细分市场
temparray.add(world.getLocation().getColor() );
Run Code Online (Sandbox Code Playgroud)
要求它是最终的...但是添加最终的world.get等等表示非法的表达开始.
import info.gridworld.actor.ActorWorld;
import info.gridworld.actor.*;
import info.gridworld.grid.*;
import info.gridworld.world.*;
import java.awt.Color;
import java.util.ArrayList;
public class cardGameDriver extends ActorWorld
{
public static void main( String[] args )
{
World world = new World();
world.show();
world.add( new card1());
world.add( new card1());
world.add( new card2());
world.add( new card2());
world.add( new card3());
world.add( new card3());
world.add( new card4());
world.add( new card4());
world.add( new card5());
world.add( new card5());
world.add( new card6());
world.add( new card6());
world.add( new card7());
world.add( new card7());
world.add( new …Run Code Online (Sandbox Code Playgroud) 因此,根据我对final的理解,之后不能更改变量的值。在a的情况下,private final foo HashSet<>() = new HashSet<>()我可以将foo用作HashSet并在其中编辑值,但不能重新分配foo吗?