静态或静态最终

时间:2015-01-05 12:39:23

标签: java class object static final

我有关于类和对象的作业。 阶级是电视,电视对象会有属性,有些是不变的

•制造商。制造商属性将保留品牌名称。一旦电视被创建,这就不会改变,因此将是一个命名常数。

•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;
    }

4 个答案:

答案 0 :(得分:2)

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

  • 常量通常指的是整个程序中不变的东西。一个很好的例子是Math.PI,它们被声明为static + final。
  • 不可变是一个概念,一个在创建对象后无法更改的属性,可以使用final强制执行,或者只是声明私有而不提供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";

答案 1 :(得分:2)

由于制造商和屏幕尺寸因电视而异,因此不需要静态关键字。我想你并没有忘记在构造函数参数中提到卷。您的代码将更改为以下内容。

 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;

,无论对象或其他被称为实例的值都是相同的。

答案 2 :(得分:1)

最终变量有三种形式:

  1. 类最终变量,
  2. 实例最终变量,
  3. 本地最终变量。
  4. <强> 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

答案 3 :(得分:0)

您将需要使用最终变量。静态意味着它在实例之外,因此无论对象的状态如何,它对于所有对象应该是相同的。它与类相关联,而不是与对象本身相关联。

每个对象的最终变量可以不同,但​​只设置一次,不能更改。这就是您正在寻找的内容:private final Object my_instance_final