Понимание скрытого поведения Java-метода java [duplicate]

Внутри отдельных скобок для теста условий (т. е. [...]) некоторые операторы, такие как single =, поддерживаются всеми оболочками, тогда как использование оператора == не поддерживается некоторыми из старых оболочек.

Внутренние двойные скобки для теста условий (т. е. [[...]]), нет никакой разницы между использованием = или == в старых или новых оболочках.

Изменить : Я должен также отметить, что: В bash всегда используйте двойные скобки [[...]], если это возможно, потому что это безопаснее, чем отдельные скобки. Я проиллюстрирую, почему в следующем примере:

if [ $var == "hello" ]; then

, если $ var оказывается пустым / пустым, то это то, что видит скрипт:

if [ == "hello" ]; then

, который будет сломайте свой скрипт. Решение состоит в том, чтобы либо использовать двойные скобки, либо всегда помнить о том, чтобы помещать кавычки вокруг ваших переменных ("$var"). Двойные скобки - лучшая защитная практика кодирования.

6
задан Chris Martin 22 January 2016 в 04:39
поделиться

5 ответов

Вы не можете переопределить метод private. Это не видно, если вы добавили A в B. Вы можете переопределить метод protected, но это не то, что вы здесь делаете (и да, здесь, если вы переместите свой main в A, вы получите другой метод. Я бы рекомендовал @Override, когда вы намерены переопределить

class A extends B {
    @Override
    public void don() { // <-- will not compile if don is private in B.
        System.out.println("hoho public");
    }
}

. В этом случае почему компилятор не предоставил ошибку для использования t.don(), который является private?

Учебные пособия по Java: предопределенные типы аннотаций говорят (частично)

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

6
ответ дан Elliott Frisch 27 August 2018 в 03:41
поделиться

- это потому, что основная функция находится в том же классе, что и метод «дон»

Нет, это потому, что A 's don() не имеет отношения к B don(), несмотря на то же имя и список аргументов. private методы скрыты внутри своего класса. Они не могут быть вызваны непосредственно внешними вызывающими лицами, такими как main метод в вашем случае, поскольку они инкапсулируются внутри класса. Они не участвуют в переопределении методов.

4
ответ дан dasblinkenlight 27 August 2018 в 03:41
поделиться

личные члены не видны ни для каких других классов, даже для детей

Вы не можете переопределить частный метод, но опять же вы не можете его вызвать. Однако вы можете создать идентичный метод с тем же именем у ребенка.

public class A
{
    private int calculate() {return 1;}
    public void visibleMethod()
    {
        System.out.println(calculate());
    };
}

public class B extends A
{
    private int calculate() {return 2;}
    public void visibleMethod()
    {
        System.out.println(calculate());
    };
}

Если вы вызываете A.visibleMethod (), он печатает 1.

Если вы вызываете B.visibleMethod (), он печатает 2.

Если вы не реализуете частный метод вычисления () в B, он не будет компилироваться, потому что публичный метод, который его вызывает, не может видеть частный метод в A.

2
ответ дан Jim W 27 August 2018 в 03:41
поделиться

Вы не можете переопределить частный метод, но вы можете ввести его в производном классе без проблем. Класс вывода не может получить доступ к частному методу для предка.

Так как t является объектом on типа B, вызов метода don () будет вызывать метод, определенный в B. Он даже не знает, что есть метод, названный также don () в классе A

4
ответ дан Manuel Vieda 27 August 2018 в 03:41
поделиться

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

4
ответ дан Nitin Dhomse 27 August 2018 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: