Что такое upcast java

что такое «upcast»?

Я вижу, что термин “upcast” связан с ООП, но я не могу найти точное определение путем поиска в Интернете.

Может ли кто-нибудь объяснить, что означает этот термин, и в какой ситуации этот метод полезен?

Из описания тега, который вы опубликовали:

Ускорение позволяет объекту типа подкласса рассматриваться как объект любого типа суперкласса.

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

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

Было бы целесообразно создать базовый класс “Enemy” с этими полями и пустыми методами, но затем расширить его, чтобы иметь SmallEnemy, EvilEnemy, BossEnemy и т.д. С их различными моделями и анимациями, заполняя пустые методы. Эти “пустые” методы можно также назвать абстрактными или чистыми методами.

Upcasting – это в основном механизм создания объекта, в котором мы создаем объекты, ссылаясь на их базовый класс. Мы делаем это путем замены подкласса базовым классом в определении объекта. Это особенно полезно, когда вы знаете, что созданный специализированный объект не обязательно будет использовать все функции, которые он может предложить. Итак, замените подкласс (унаследованный класс) базовым классом, и все, что вы сделали, – это Upcasting.

Эта концепция может быть хорошо понята, если взять пример. Предположим, что у нас есть три класса. Один родительский или обобщенный класс, называемый классом LIVING_THINGS, и два подкласса ANIMAL и BIRD, которые наследуют от первого. Родительский класс или базовый класс имеют функцию, например Born() и Die(). Специализированный класс имеет функцию, например Run() и Fly() для ЖИВОТНЫХ и BIRD соответственно.

Чтобы создать объект ANIMAL и BIRD, вы обычно используете синтаксис ниже:

В приведенном выше коде методы Run() и Fly() отлично работают с созданными объектами. Это обычный способ создания объектов. Ссылка, используемая для создания объекта, точно такая же, как тип объекта, созданный во время выполнения. Методы подкласса работают очень хорошо.

Но, чтобы создать Upcast, вы должны использовать синтаксис ниже:

В приведенном выше коде, хотя мы создали объект типа ANIMAL и BIRD, используемая ссылка фактически относится к базовому классу. Поэтому методы Run() и Fly() недоступны для этих объектов. Вместо этого доступны только функции, доступные в базовом классе, такие как Born() и Die(). Это может быть полезно, если вы хотите, чтобы в начале были доступны только базовые функции, и хотите позже преобразовать эти объекты своих исходных типов, чтобы впоследствии сделать их специализированные функции. Это можно сделать с помощью Downcasting. Downcasting может изменить ссылочные типы этих объектов на специализированный подкласс, чтобы предоставить доступным функциям, которые не были доступны в противном случае. Посмотрите код ниже:

В приведенном выше коде мы создали новый объект и преобразовали его в тип ANIMAL. Должна быть хорошая практика, чтобы действительно проверить, поддерживает ли конвертируемый объект преобразование. Это можно сделать с помощью ключевого слова is

С помощью Downcasting мы восстановили все функции и свойства, которые должен иметь объект ANIMAL. Теперь он ведет себя как правильный объект ANIMAL.

Источник

Зачем использовать Upcasting в java?

Я просмотрел большинство газет в сети, но я все еще не могу понять, почему мы должны использовать upcasting.

вы можете рассмотреть этот пример для upcasting. Какой смысл поднимать здесь тосты? Оба!—1—> и a дает тот же результат!

9 ответов

в большинстве ситуаций явный апкаст совершенно не нужен и не имеет никакого эффекта.

в вашем примере явный upcast

можно заменить этот:

тем не менее, есть ситуации, когда наличие явного upcast изменяет значение заявления / выражения.

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

где код не будет компилироваться без приведения типа. (Я не уверен, что это считается ударом, но вот он в любом случае.)

вторая ситуация включает в себя варадические параметры:

третья ситуация при выполнении операций с примитивными числами типы; например

какая необходимость использовать Upcasting в java?

не уверен, что вы правильно поняли терминологию, но вот цитата уточнения:

upcasting
выполнение приведения из производного класса в более общий базовый класс.

и вот один сценарий, где это действительно имеет значение:

Upcasting может быть необходимо, когда вы перегружены методы и не хотите, чтобы вызвать специализированный, как aioobe написал. (Вы могли бы назначить новую переменную типа A вместо того, чтобы есть.)

если мы хотим передать Object[] array как одиночный параметр (не свои объекты как индивидуальные), мы должны написать либо

Upcasting не имеет абсолютно никакого значения в вашем примере (на самом деле я не могу представить себе ни одного случая, когда у него есть), и его следует избегать, поскольку он только смущает разработчиков. Некоторые IDEs (IntelliJ наверняка) выдадут предупреждение в этой строке и предложат удалить upcasting).

EDIT: этот код дает те же результаты, потому что все методы объекта в Java являются виртуальными, что означает, что целевой метод обнаруживается фактическим типом объекта во время выполнения, а не ссылочным типом. Попробуйте сделать callme() static и посмотреть, что произойдет.

рассмотрим сценарий, банк-это класс, который предоставляет метод для получения процентной ставки. Но, процентная ставка может отличаться в зависимости от банков. Например, банки SBI, ICICI и AXIS предоставляют 8,4%, 7,3% и 9,7% процентной ставки.

учитывая, что методы объектов Java являются виртуальными по умолчанию, я не вижу никакого использования для upcasting вообще.

где вы видели учебники, сообщающие, что upcasting был необходим? Это первый раз, когда я слышу об этом для Java. (Обратите внимание, что это имеет значение в C# или C++, но это обычно знак плохого дизайна.)

в этом примере мы создаем два класса Bike и Splendar. Класс Splendar расширяет класс Bike и переопределяет его метод run (). Мы вызываем метод run по ссылочной переменной родительского класса. Поскольку он ссылается на объект подкласса, а метод подкласса переопределяет метод родительского класса, метод подкласса вызывается во время выполнения.

поскольку вызов метода определяется компилятором JVM not, он известен как полиморфизм времени выполнения.

простое объяснение Upcasting.

есть 2 класса, один-родительский класс (Demo1), второй-его подкласс (Demo).

если метод run1 не имеет параметров, то выход метода будет таким же. Нет Upcasting.

выход д’.run1(); и d1.run1(); будет то же самое.

если используется Параметрировать перегрузка использование upcasting хорошо видно. Есть смысл для Upcasting.

выход д’.run1(); и d1.run1(); будет по-другому.

Источник

What is Upcasting and Downcasting in Java

As you read on, you will realize that upcasting and downcasting are really simple.

Before we go into the details, suppose that we have the following class hierarchy:

Mammal > Animal > Dog, Cat

Mammal is the super interface:

Animal is the abstract class:

Dog and Cat are the two concrete sub classes:

1. What is Upcasting in Java?

Note that the actual object type does not change because of casting. The Dog object is still a Dog object. Only the reference type gets changed. Hence the above code produces the following output:

This is also another example of upcasting:

2. Why is Upcasting in Java?

3. What is Downcasting in Java?

Unlike upcasting, downcasting can fail if the actual object type is not the target object type. For example:

The Java language provides the instanceof keyword to check type of an object before casting. For example:

So if you are not sure about the original object type, use the instanceof operator to check the type before casting. This eliminates the risk of a ClassCastException thrown.

4. Why is Downcasting in Java?

Consider the following example:

Okay, so far you have got the nuts and bolts of upcasting and downcasting in Java. Remember:

Other Recommended Tutorials:

About the Author:

Что такое upcast java. Смотреть фото Что такое upcast java. Смотреть картинку Что такое upcast java. Картинка про Что такое upcast java. Фото Что такое upcast javaNam Ha Minh is certified Java programmer (SCJP and SCWCD). He started programming with Java in the time of Java 1.4 and has been falling in love with Java since then. Make friend with him on Facebook and watch his Java videos you YouTube.

Add comment

Comments

Đọc qua bài của anh em vẫn chưa hiểu tại sao lại phải cần sử dụng downcasting? Tại sao không sử dụng luôn upcasting đi?

Nếu được anh có thể cho em một vài ví dụ cụ thể không?

I’m confused, isn’t this downcasting:

Let’s say I have a two classes:

class Dog extends Mammal.

m is a reference to an allocated memory that represents
a Dog so m is superclass referencing a subclass

Источник

В чем разница между up-casting и down-casting относительно переменной класса

в чем разница между up-casting и down-casting относительно переменной класса?

например, в следующем классе программы Animal содержит только один метод, но класс Dog содержит два метода, а затем мы приводим переменную Dog к переменной Animal.

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

9 ответов

Downcasting было бы что-то вроде этого:

однако, если вы должны были сделать это:

чтобы вызвать метод суперкласса, вы можете сделать super.method() или путем выполнения upcast.

чтобы вызвать метод подкласса, вы должны сделать downcast. Как показано выше, вы обычно рискуете ClassCastException при этом, однако, вы можете использовать instanceof оператор для проверки типа выполнения объект перед выполнением броска, что позволяет предотвратить ClassCastException s:

Down-casting и up-casting было следующим образом:
Что такое upcast java. Смотреть фото Что такое upcast java. Смотреть картинку Что такое upcast java. Картинка про Что такое upcast java. Фото Что такое upcast java

Upcasting: когда мы хотим привести подкласс к супер классу, мы используем Upcasting (или расширение). Это происходит автоматически, не нужно ничего делать явно.

Downcasting: когда мы хотим привести супер класс к подклассу, мы используем Downcasting (или сужение), а Downcasting непосредственно невозможно в Java, явно мы должны это сделать.

Upcasting и downcasting являются важной частью Java, которая позволяет нам создавать сложные программы с использованием простого синтаксиса и дает нам большие преимущества, такие как полиморфизм или группирование различных объектов. Java разрешает объект типа подкласса рассматриваться как объект любого типа суперкласса. Это называется upcasting. Upcasting выполняется автоматически, в то время как downcasting должен выполняться вручную программистом, и я собираюсь дать все возможное, чтобы объяснить почему это так.

Upcasting и downcasting не похожи на кастинг примитивов от одного к другому, и я считаю, что это вызывает много путаницы, когда программист начинает изучать объекты кастинга.

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

вы можете увидеть пример ниже как!—6—> работы согласно типу предмета (собаки,любимчика,собаки полиции).

Предположим, у вас есть три собаки

полицейская собака-полицейская собака расширяет собаку.

полиморфизм : все методы в Java являются виртуальными по умолчанию. Это означает, что любой метод может быть переопределен при использовании в наследовании, если этот метод объявляется как final или static.(Объяснение относится к концепции виртуальных таблиц)

виртуальная таблица / таблица отправки: таблица отправки объекта будет содержать адреса динамически связанных методов объекта. Вызовы метода выполняются путем извлечения адреса метода из таблицы отправки объекта. Таблица отправки одинакова для всех объектов, принадлежащих к одному классу, и поэтому обычно используется совместно их.

Downcasting нужно сделать программистом вручную

при попытке вызвать secretID(); метод on obj3 что это PoliceDog object но ссылаться на Dog который является супер-классом в иерархии, он выдает ошибку, так как obj3 нет доступа к secretId() метод.In чтобы вызвать этот метод, вам нужно вручную понизить obj3 до PoliceDog

, который печатает ID

аналогичным образом вызвать dogName(); метод PetDog класс нужно опустить obj2 до PetDog поскольку obj2 ссылается на Dog и не имеют доступа к dogName(); метод

это причина, по которой вам нужно опустить объекты вручную если вы ссылались на свои объекты на тип супер класса.

Примечание: здесь ссылка означает вы не меняете адрес памяти ваших объектов, когда вы опускаете его, он все еще остается тем же, вы просто группируете их к определенному типу в этом случае Dog

Я знаю, что этот вопрос задан довольно давно, но для новых пользователей этого вопроса. Пожалуйста, прочитайте эту статью, где содержится полное описание по upcasting, downcasting и использованию instanceof оператор

нет необходимости поднимать вручную, это происходит само по себе:

Mammal m = (Mammal)new Cat(); равна Mammal m = new Cat();

но downcasting необходимо всегда делать вручную:

Почему это так, что upcasting является автоматическим, но downcasting должен быть ручным? Видите ли, апкастинг никогда не подводит. Но если у вас есть группа разных животных и вы хотите унизить их всех до кошки, то есть шанс, что некоторые из этих животных на самом деле собаки, и процесс терпит неудачу, бросая ClassCastException. Именно здесь следует ввести полезную функцию под названием «instanceof», который проверяет, является ли объект экземпляр некоторого класса.

для получения дополнительной информации, пожалуйста, прочитайте в этой статье

Источник

What is the difference between up-casting and down-casting with respect to class variable

What is the difference between up-casting and down-casting with respect to class variable?

For example in the following program class Animal contains only one method but Dog class contains two methods, then how we cast the Dog variable to the Animal Variable.

If casting is done then how can we call the Dog’s another method with Animal’s variable.

Что такое upcast java. Смотреть фото Что такое upcast java. Смотреть картинку Что такое upcast java. Картинка про Что такое upcast java. Фото Что такое upcast java

10 Answers 10

Downcasting would be something like this:

However, if you were to do this:

To call a superclass’s method you can do super.method() or by performing the upcast.

To call a subclass’s method you have to do a downcast. As shown above, you normally risk a ClassCastException by doing this; however, you can use the instanceof operator to check the runtime type of the object before performing the cast, which allows you to prevent ClassCastException s:

Downcasts can be expressed more succinctly starting from Java 16, which introduced pattern matching for instanceof :

Что такое upcast java. Смотреть фото Что такое upcast java. Смотреть картинку Что такое upcast java. Картинка про Что такое upcast java. Фото Что такое upcast java

Down-casting and up-casting was as follows:
Что такое upcast java. Смотреть фото Что такое upcast java. Смотреть картинку Что такое upcast java. Картинка про Что такое upcast java. Фото Что такое upcast java

Upcasting: When we want to cast a Sub class to Super class, we use Upcasting(or widening). It happens automatically, no need to do anything explicitly.

Downcasting : When we want to cast a Super class to Sub class, we use Downcasting(or narrowing), and Downcasting is not directly possible in Java, explicitly we have to do.

Что такое upcast java. Смотреть фото Что такое upcast java. Смотреть картинку Что такое upcast java. Картинка про Что такое upcast java. Фото Что такое upcast java

Upcasting and downcasting are important part of Java, which allow us to build complicated programs using simple syntax, and gives us great advantages, like Polymorphism or grouping different objects. Java permits an object of a subclass type to be treated as an object of any superclass type. This is called upcasting. Upcasting is done automatically, while downcasting must be manually done by the programmer, and i’m going to give my best to explain why is that so.

Upcasting and downcasting are NOT like casting primitives from one to other, and i believe that’s what causes a lot of confusion, when programmer starts to learn casting objects.

Polymorphism: All methods in java are virtual by default. That means that any method can be overridden when used in inheritance, unless that method is declared as final or static.

You can see the example below how getType(); works according to the object(Dog,Pet,Police Dog) type.

Assume you have three dogs

Polymorphism : All methods in java are virtual by default. That means that any method can be overridden when used in inheritance, unless that method is declared as final or static.(Explanation Belongs to Virtual Tables Concept)

Virtual Table / Dispatch Table : An object’s dispatch table will contain the addresses of the object’s dynamically bound methods. Method calls are performed by fetching the method’s address from the object’s dispatch table. The dispatch table is the same for all objects belonging to the same class, and is therefore typically shared between them.

Downcasting need to be done by the programmer manually

When you try to invoke the secretID(); method on obj3 which is PoliceDog object but referenced to Dog which is a super class in the hierarchy it throws error since obj3 don’t have access to secretId() method.In order to invoke that method you need to Downcast that obj3 manually to PoliceDog

In the similar way to invoke the dogName(); method in PetDog class you need to downcast obj2 to PetDog since obj2 is referenced to Dog and don’t have access to dogName(); method

This is the reason you need to downcast your objects manually if you have referenced your objects to the super class type.

Note: Here by referencing means you are not changing the memory address of your ojects when you downcast it it still remains same you are just grouping them to particular type in this case Dog

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *