приватный финальный статический атрибут против приватного финального атрибута - PullRequest
278 голосов
/ 12 сентября 2009

В Java какая разница между:

private final static int NUMBER = 10;

и

private final int NUMBER = 10;

Оба типа private и final, разница - атрибут static.

Что лучше? И почему?

Ответы [ 20 ]

1 голос
/ 09 декабря 2016

приватный статический финал будет считаться константой, а константа может быть доступна только внутри этого класса. Поскольку ключевое слово static включено, значение будет постоянным для всех объектов класса.

Значение закрытой конечной переменной будет одинаковым для каждого объекта.

Вы можете сослаться на строку java.lang.String или посмотреть пример ниже.

public final class Foo
{

    private final int i;
    private static final int j=20;

    public Foo(int val){
        this.i=val;
    }

    public static void main(String[] args) {
        Foo foo1= new Foo(10);

        Foo foo2= new Foo(40);

        System.out.println(foo1.i);
        System.out.println(foo2.i);
        System.out.println(check.j);
    }
}

// Выходные данные:

10
40
20
1 голос
/ 16 июля 2014

Поскольку переменная в классе объявлена ​​как окончательная И инициализирована в той же команде, нет абсолютно никаких причин не объявлять его как статическое, поскольку оно будет иметь одинаковое значение независимо от экземпляра. Таким образом, все экземпляры могут совместно использовать один и тот же адрес памяти для значения, что экономит время обработки, устраняя необходимость создавать новую переменную для каждого экземпляра и экономя память путем совместного использования 1 общего адреса.

1 голос
/ 13 сентября 2009

очень мало, а статично

Нет большой разницы, так как они оба постоянные. Для большинства объектов данных класса static будет означать что-то, связанное с самим классом, поскольку существует только одна копия независимо от того, сколько объектов было создано с новым.

Поскольку это константа, она не может быть сохранена ни в классе, ни в экземпляре, но компилятор по-прежнему не позволит вам получить доступ к объектам экземпляра из статического метода, даже если он знает, что они быть. Существование API отражения также может потребовать некоторой бессмысленной работы, если вы не сделаете его статичным.

0 голосов
/ 20 февраля 2018

Если вы используете static, значение переменной будет одинаковым во всех ваших экземплярах, при изменении в одном экземпляре другие тоже изменятся.

0 голосов
/ 07 апреля 2017

Просто Еще один простой пример для понимания использования статических, статических финальных, конечных переменных. Комментарии к коду имеют правильное объяснение.

public class City {

    // base price that is always same for all objects[For all cities].
    private static double iphone_base_price = 10000;

    // this is total price = iphone_base_price+iphone_diff;
    private double iphone_citi_price;

    // extra price added to iphone_base_price. It is constant per city. Every
    // city has its own difference defined,
    private final double iphone_diff;

    private String cityName = "";

    // static final will be accessible everywhere within the class but cant be
    // changed once initialized.
    private static final String countryName = "India";

    public City(String cityName, double iphone_diff) {
        super();
        this.iphone_diff = iphone_diff;
        iphone_citi_price = iphone_base_price + iphone_diff;
        this.cityName = cityName;

    }

    /**
     * get phone price
     * 
     * @return
     */
    private double getPrice() {

        return iphone_citi_price;
    }

    /**
     * Get city name
     * 
     * @return
     */
    private String getCityName() {

        return cityName;
    }

    public static void main(String[] args) {

        // 300 is the
        City newyork = new City("Newyork", 300);
        System.out.println(newyork.getPrice() + "  " + newyork.getCityName());

        City california = new City("California", 800);
        System.out.println(california.getPrice() + "  " + california.getCityName());

        // We cant write below statement as a final variable can not be
        // reassigned
        // california.iphone_diff=1000; //************************

        // base price is defined for a class and not per instances.
        // For any number of object creation, static variable's value would be the same
        // for all instances until and unless changed.
        // Also it is accessible anywhere inside a class.
        iphone_base_price = 9000;

        City delhi = new City("delhi", 400);
        System.out.println(delhi.getPrice() + "  " + delhi.getCityName());

        City moscow = new City("delhi", 500);
        System.out.println(moscow.getPrice() + "  " + moscow.getCityName());

        // Here countryName is accessible as it is static but we can not change it as it is final as well. 
        //Something are meant to be accessible with no permission to modify it. 
        //Try un-commenting below statements
        System.out.println(countryName);

        // countryName="INDIA";
        // System.out.println(countryName);

    }

}
0 голосов
/ 15 декабря 2015

Статическая переменная принадлежит классу (что означает, что все объекты имеют эту переменную). Нестатическая переменная принадлежит каждому объекту.

public class ExperimentFinal {

private final int a;
private static final int b = 999; 

public ExperimentFinal(int a) {
    super();
    this.a = a;
}
public int getA() {
    return a;
}
public int getB() {
    return b;
}
public void print(int a, int b) {
    System.out.println("final int: " + a + " \nstatic final int: " + b);
}
public static void main(String[] args) {
    ExperimentFinal test = new ExperimentFinal(9);
    test.print(test.getA(), test.getB());
} }

Как видно из приведенного выше примера, для "final int" мы можем назначить нашу переменную для каждого экземпляра (объекта) класса, однако для "static final int" мы должны назначить переменную в классе (статическая переменная принадлежит в класс).

0 голосов
/ 17 ноября 2015

Это может помочь

public class LengthDemo {
public static void main(String[] args) {
    Rectangle box = new Rectangle();
    System.out.println("Sending the value 10.0 "
            + "to the setLength method.");
    box.setLength(10.0);
    System.out.println("Done.");
    }
}
0 голосов
/ 02 марта 2012

Допустим, если у класса не будет более одного экземпляра, какой из них занимает больше памяти:

private static final int ID = 250; или же закрытый финал int ID = 250;

Я понял, что static будет ссылаться на тип класса только с одной копией в памяти, а non static будет в новом месте памяти для каждой переменной экземпляра. Однако внутренне, если мы просто сравниваем 1 экземпляр одного и того же класса когда-либо (то есть более 1 экземпляра не будет создано), то есть ли какие-либо издержки с точки зрения пространства, используемого 1 статической конечной переменной?

0 голосов
/ 01 сентября 2010

Если вы пометите эту переменную как статическую, то, как вы знаете, вам потребуется статические методы для повторного доступа к этим значениям, это будет полезно, если вы уже думаете об использовании этих переменных только в статических методах. Если это так, то это будет лучшим.

Однако вы можете сделать переменную общедоступной, поскольку никто не может изменить ее так же, как «System.out», она снова зависит от ваших намерений и того, чего вы хотите достичь.

0 голосов
/ 13 сентября 2009

Статический элемент является одним и тем же членом во всех экземплярах класса и самого класса.
Нестатический - один для каждого экземпляра (объекта), поэтому в ваш точный случай это пустая трата памяти, если вы не ставите статический.

...