2015-01-05 121 views
1

我有一个关于类和对象的任务。 类是电视,电视对象将具有属性,其中一些是常量静态或静态最终

•制造商。制造商属性将保存品牌名称。一旦电视机被创建,这个不能改变,所以将会是一个命名常量。

•screenSize。 screenSize属性将保存电视屏幕的大小。这不能改变

我不知道我的常量字段的声明,我不明白他们将如何恒定 如果他们是静态的最终或最终的 我如何保证一旦对象被创建值不会改变

class Television { 

    private final String MANUFACTURER; 
    private final int SCREEN_SIZE; 
    private boolean powerOn; 
    private int channel ; 
    private int volume ; 

    public Television(String MANUFACTURER, int SCREEN_SIZE) { 
     this.MANUFACTURER = MANUFACTURER; 
     this.SCREEN_SIZE = SCREEN_SIZE; 
     this.volume = volume; 
    } 
+0

为了达到这个目的,使它们成为'final'是可以的,你不应该让它们成为'static',因为每个电视机可能有不同的值。但是你不应该用大写字母来写。只有'static final'和'immutable'变量应该用大写字母书写。 – Tom

+0

你需要关于这个问题的更多帮助吗? – Adam

回答

1

有三种形式最终变量:

  1. 级决赛中的变量,
  2. 实例变量最后,
  3. 本地最终变量。

There is no requirement to initialize a final variable at declaration but it must initialize before using it.

You can only initialize a final variable once.

class Program { 
    /* Class Final Variables*/ 
    //Static means its common for all the objects you are creating like tv1, tv2..... 
    static final int i1 = 10; 
    static final int i2; 
    static { 
     i2 = 10; 
    } 

    /*Instance Final Variables*/ 
    final int i1 = 10; 
    final int i2; 
    final int i3; 
    { 
     i2 = 10; 
    } 

    Program() { 
     i3 = 10; 
    } 

    /*local final variable*/ 
    final int i1 = 10; 
    final int i2; 
    i2 = 10; 
} 

更多的例子,你可以看看这个where-can-final-variables-be-initialized

0

你会想用最后的变量。静态意味着它在实例之外,所以无论对象的状态如何,它都应该是相同的。它与类相关,而不是对象本身。

每个对象的最终变量可能不同,但仅设置一次,不能更改。这是你正在寻找的:private final Object my_instance_final

+0

所以最近怎么样?例如? – A1t

+0

添加到我的答案。 –

2

我认为你混淆了一个常量变量和一个类属性是不可变的。

  • 常量通常指的是在整个程序中不变的事物。一个很好的例子是Math.PI,它们被声明为static + final。
  • 不可变的概念是在创建对象后无法更改的属性,可以使用final来强制执行,也可以简单地声明为private并且不提供setter。

您的电视对象可能会有不同的制造商和屏幕尺寸,因此您不能使用静态,因为这将使所有实例相同。

此外,仅对常量使用CAPITALS_WITH_UNDERSCORES是标准惯例,例如,静态+最终。

所以我宣布你的类为:

class Television { 

    private final String manufacturer; 
    private final int screenSize; 
    private boolean powerOn; 
    private int channel; 
    private int volume; 
    public Television(String manufacturer, int screenSize) { 
     this.manufacturer = manufacturer; 
     this.screenSize = screenSize; 
     this.volume = volume; 
    } 
} 

,也许你的声明作为厂家别处常量

public static final String SONY = "Sony"; 
public static final String SAMSUNG = "Samsung"; 
2

因为制造商和屏幕大小不需要Static关键字不同电视电视。我想你不会忘记在构造函数参数中提及音量。您的代码更改如下。

class Television { 

private final String manufacturer; // your declaration is correct as per your requirement but the naming convention is wrong final variables use lowerCamelCase instead of UPPERCASE. 
private final int screenSize; 
private boolean powerOn; 
private int channel; 
private int volume; 

public Television(String manufacturer, int screenSize, int volume) { 
    this.manufacturer= manufacturer; 
    this.screenSize= screenSize; 
    this.volume = volume; 
} 
} 

没有必要使用静态final关键字,除非你宣布比如一些通用常量说:

public static final float pi = 3.14; 

,其值为对象或以其他方式称为实例相同不管。