Есть ли Java эквивалентный модификатору 'new' в C#?

Возможный дубликат:
Есть ли "новый" модификатор для методов в Java?

В C# метод подкласса может быть изменен как новый.

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

Есть ли такое же ключевое слово в Java?

2 ответа

Решение

Нет.

В C# вы используете new, чтобы скрывать / скрывать не виртуальные функции базового класса. Вам нужно это ключевое слово в C#, потому что вы не можете переопределить не виртуальные функции.

В Java все функции являются виртуальными по умолчанию, поэтому вы всегда можете переопределить их, и вам не нужно ключевое слово, такое как new.

Надеюсь это поможет.

В C# любой метод, который вы хотите переопределить из базового цикла, должен быть abstract, virtual или override сам. Новое ключевое слово фактически не выполняет переопределение. Это работает немного по-другому:

Если вы объявляете функцию с ключевым словом new, скрывая функцию базового класса, ЭТА реализация будет использоваться, только если у вас есть объект того же дочернего типа. Пример:

class TopClass
    {
        public String getHello()
        {
            return "Hello";
        }

        public virtual String getWorld()
        {
            return "World";
        }
    }

    class ChildClass : TopClass
    {
        public new String getHello()
        {
            return "Hi";
        }

        public override string getWorld()
        {
            return "Earth";
        }
    }

Это приведет к:

        TopClass tc = new TopClass();
        Console.WriteLine(tc.getHello() + " " + tc.getWorld()); // Hello World

        ChildClass cc = new ChildClass();
        Console.WriteLine(cc.getHello() + " " + cc.getWorld()); // Hi Earth

        TopClass tc2 = new ChildClass();
        Console.WriteLine(tc2.getHello() + " " + tc2.getWorld()); // Hello Earth

        Console.ReadLine();

Вы можете увидеть разницу нового ключевого слова по сравнению с типичным переопределением: если расширяющий класс приведен к родительскому ClassType, переопределяющие функции (возвращающие Землю вместо World) все равно будут действовать, а новые функции - нет (Привет НЕ возвращается вместо Привет).

Другие вопросы по тегам