Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
#1

static final методы - Java SE

25.08.2013, 23:45. Просмотров 1298. Ответов 16
Метки нет (Все метки)

Здравуствуйте. Определя два десятка констант, на автомате дописал final к статичекскому. На мое удивление IDE ничего против не имела. Ровно на столько на сколько и комилятор. "Ну обьявил ты static final метод, что тут такого?" Вродебы ничего, но вот всплыл вопрос, а накой нужен final в статическом методе? Ведь статческие методы не переопределяются, а final применен к методу говорит компилятору(да и нам тоже), что его нельзя переопределять.
зы: подразумеваю, что это из той же оперы, что и запятая после последнего элемента масива - не холдно и не жарко - оно есть и все. Однако интересно узнать что-то от более опытных дядей(или тётей даже), мож истинна кроется где-то глубже?
ззы:
однако на такой вот код получаю ругань от компилятора, мол unresolved compilation problem: can't override the final method from Super
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Super {
    public static final void method(){
        System.out.println("Super.method()");
    }
}
 
class Sub extends Super {
    public static void method() {
        System.out.println("Sub.method()");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Super.method();
        Sub.method();
        Super sup = new Super();
        sup.method();
        Super supSub = new Sub();
        supSub.method();    
    }
}
ну и ясен-красен, что при вызове статического метода через имя класса, полиморфизма тем более не добится. да и вообще глуповато как-то его искать среди статических методов. но все же интереса ради нырнул глубже чтобы проверить. вот такие вот дела.
нырять пришлось потому что не нагуглил.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2013, 23:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос static final методы (Java SE):

R.java - генерирует public static без final (Android)
Добрый день. Сделали приложение, потом обнаружили,что в файле R.java объявление...

Static методы
Всем привет! Народ, подскажите пожалуйста, хочу переделать IsDate на статичный...

Методы, реализующие данные функции должны иметь прототипы следующего вида: public static int getSumNumbers(int
Написать программу, которая для введенной с консоли последовательности целых...

Ошибка “non-static method cannot be referenced from a static context”
Проблема в том, что в одном классе он просто сделать методы static, а в другом...

Ошибка: non-static variable this cannot be referenced from a static context
Добрый вечер! Не пинайте сильно ногами, недавно решил взяться за обучение...

Non-Static method cannot be referenced from a static context
Всем привет! Не могу никак разобраться со статическими и нестатическими...

16
Divizal
38 / 38 / 10
Регистрация: 04.02.2013
Сообщений: 106
25.08.2013, 23:50 #2
final метод нельзя переопределить в классе наследнике.
0
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
25.08.2013, 23:56  [ТС] #3
Divizal, будьте внимательнее. я упомянул об этом. а еще упомянул о том, что сатические методы не переопределяются по своей "статической природе".
0
Divizal
38 / 38 / 10
Регистрация: 04.02.2013
Сообщений: 106
26.08.2013, 00:05 #4
Цитата Сообщение от lowercase Посмотреть сообщение
Divizal, будьте внимательнее. я упомянул об этом. а еще упомянул о том, что статические методы не переопределяются по своей "статической природе".
В общем, есть такая фишка, называется redefine. Хз как ее перевести. Так вот, статические методы нельзя override в силу "статической природы", но можно redefine, что вы и сделали в своем примере.
0
verylazy
Заблокирован
26.08.2013, 00:10 #5
я слыхал, что вот так вот sup.method(); писать не по феншую вообще

и объясните мне кто-то, почему это нельзя переопределять статические методы?
0
Divizal
38 / 38 / 10
Регистрация: 04.02.2013
Сообщений: 106
26.08.2013, 00:18 #6
Цитата Сообщение от verylazy Посмотреть сообщение
я слыхал, что вот так вот sup.method(); писать не по феншую вообще

и объясните мне кто-то, почему это нельзя переопределять статические методы?
Потому что статические методы не наследуются. ПОэтому их нельзя override. Но можно redefine:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Parent {
    static void print() {
         System.out.println("Parent");
   }
}
 
 
class Child extends Parent {
   static void print() {
         System.out.println("Child");
   }
}
 
public class Test {
   public static void main (String... args) {
      Parent test = new Child();
      test.print();
   }
}
Так вот, тут метод redefined, и поэтому на выводе получим не Child, а Parent.
0
verylazy
Заблокирован
26.08.2013, 00:21 #7
Вы что, не видите - создается ОБЪЕКТ, а обращение идет к методу класса? Я далек от программирования, но точно знаю что так делать нельзя.
А редефайн там или оверрайд, это все жонглирование словами. Метод переопределяется и становится методом потомка, если к нему корректно обращаться через имя КЛАССА.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TestStatic {
 
    static void chukNorris() {
        System.out.println("parent static");
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestStatic.chukNorris();
        C.chukNorris();
    }
}
 
class C extends TestStatic {
 
    static void chukNorris() {
        System.out.println("child static");
    }
}
выведет, как и ожидается
Bash
1
2
parent static
child static
0
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
26.08.2013, 00:27  [ТС] #8
Цитата Сообщение от verylazy Посмотреть сообщение
Метод переопределяется и становится методом потомка, если к нему корректно обращаться через имя КЛАССА.
ничего подобного. выбор статического метода определяется фактическим типом ссылки, а когда статика о полиморфизме и речи итди не может. см. спойлер первого поста данного топика - я говорил об этом.
Цитата Сообщение от Divizal Посмотреть сообщение
Потому что статические методы не наследуются. ПОэтому их нельзя override. Но можно redefine:
по сути redefine - это сокрытие. вы скрываее метод базового класса в производно создавая метод с той же сигнатурой.

и наконец. дабы прекратить срачи по поводу вызова метода класса через экземляр обьекта обьясню:
я делал вызовы через екземпляры только и только для того чтобы показать что они не вызаваются полиморфно!!!
0
Divizal
38 / 38 / 10
Регистрация: 04.02.2013
Сообщений: 106
26.08.2013, 00:29 #9
verylazy, боюсь вы не до конца поняли в чем смысл применения наследования. Понятное дело, что при явном указании класса вызовется нужный метод, но ведь дело в том что применяя наследование мы стремимся избавиться от такой зависимости.
0
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
26.08.2013, 00:31  [ТС] #10
Цитата Сообщение от verylazy Посмотреть сообщение
выведет, как и ожидается
это обычное скорытие. никаким переопределеним тут и не пахнет.
0
verylazy
Заблокирован
26.08.2013, 00:37 #11
я умные слова путаю, но в голове понимаю что происходит
не совсем понятно о чем тогда тема, кэп как бы подсказывает что ни о чем
0
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
26.08.2013, 00:43  [ТС] #12
Цитата Сообщение от verylazy Посмотреть сообщение
не совсем понятно о чем тогда тема
гвоздем топика является следующий вопрос
какой спрос от использования final в статических методах, если оные не переопредляются?
0
Divizal
38 / 38 / 10
Регистрация: 04.02.2013
Сообщений: 106
26.08.2013, 00:49 #13
Цитата Сообщение от lowercase Посмотреть сообщение
гвоздем топика является следующий вопрос
какой спрос от использования final в статических методах, если оные не переопредляются?
Видимо для того, чтобы в классе наследнике не redefine эти методы.

P.S. - http://stackoverflow.com/questions/1...-static-method
0
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
26.08.2013, 01:20  [ТС] #14
Divizal, а это вариант.
0
MaxNevermind
38 / 38 / 11
Регистрация: 21.05.2013
Сообщений: 128
26.08.2013, 08:08 #15
lowercase,
Вместо "can't override the final method from Super" должно быть "can't hide the final static method from Super" и все встает на свои места.
0
lowercase
212 / 201 / 85
Регистрация: 09.05.2012
Сообщений: 494
26.08.2013, 11:06  [ТС] #16
MaxNevermind, если бы компилятор так писал - без сомнения, этого топика небыло бы. а случай тут инной. потому здесь, как говорится не попробуешь - не узнаешь.
0
mutagen
2564 / 2237 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
26.08.2013, 22:08 #17
Цитата Сообщение от lowercase Посмотреть сообщение
по сути redefine - это сокрытие. вы скрываее метод базового класса в производно создавая метод с той же сигнатурой.
немного неверно, так как эти методы оба будут доступны через статический вызов с именем класса, простыми словами, вы можете "заново определить" такой же метод (или другой с похожим видом) для класса потомка.

и сокрытием там и рядом никаким не пахнет, так как статик методы вызываются не на обьекте а на классе.
1
26.08.2013, 22:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2013, 22:08
Привет! Вот еще темы с решениями:

Non static method cannot be referenced from static
на 12й строчке выдает такую ошибку и я правда не знаю почему package...

О чем говорит ошибка "Non-static variable D cannot be referenced from a static context"
non-static variable D cannot be referenced from a static context Вот эта...

Final переменная
Добрый день! Нужно создать final переменную, которая была бы видна во всех...

Final для полей
Здравствуйте, подскажите почему в первом случае компилятор ругается, а во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru