Подтвердить что ты не робот

Кастинг объектов в Java

Я запутался в том, что значит бросать объекты в Java.

Скажите, что у вас есть...

Superclass variable = new Subclass object();
(Superclass variable).method();

Что здесь происходит? Изменяется ли тип переменной, или это изменяется объект внутри переменной? Очень смутно.

4b9b3361

Ответ 1

Посмотрите на этот образец:

public class A {
  //statements
}

public class B extends A {
  public void foo() { }
}

A a=new B();

//To execute **foo()** method.

((B)a).foo();

Ответ 2

Скажем, у вас есть суперкласс Фрукты и подкласс Банан, и у вас есть метод addBananaToBasket()

Метод не примет виноград, например, чтобы вы захотели добавить банан в корзину.

Итак:

Fruit myFruit = new Banana();
((Banana)myFruit).addBananaToBasket(); ⇐ Это называется литье

Ответ 3

Пример, на который вы ссылаетесь, называется "Ускорение в java".

Создает объект подкласса с переменной суперкласса, указывающей на него.

Переменная не изменяется, она по-прежнему является переменной суперкласса, но указывает на объект подкласса.

Например, скажем, у вас есть два класса Machine and Camera; Камера является подклассом Machine

class Machine{

    public void start(){

        System.out.println("Machine Started");
    }
}

class Camera extends Machine{
     public void start(){

            System.out.println("Camera Started");
        }
     public void snap(){
         System.out.println("Photo taken");
     }
 }
Machine machine1 = new Camera();
machine1.start();

Если вы выполните указанные выше инструкции, он создаст экземпляр класса Camera со ссылкой на класс Machine, указывающий на него. Таким образом, теперь выход будет " Camera Started". Эта переменная по-прежнему является ссылкой на класс Machine. Если вы попытаетесь выполнить machine1.snap();, код не будет компилироваться

Вынос здесь - все. Камеры - это машины, поскольку камера является подклассом Machine, но все машины не являются камерами. Таким образом, вы можете создать объект подкласса и указать его на суперкласс, но вы не можете просить ссылку суперкласса выполнять все функции объекта подкласса (в нашем примере machine1.snap() не компилировать). Ссылка на суперкласс имеет доступ только к функциям, известным суперклассу (в нашем примере machine1.start()). Вы не можете запросить ссылку на станцию, чтобы сделать щелчок.:)

Ответ 4

Superclass variable = new subclass object();
Это просто создает объект подкласса типа, но присваивает его классу суперкласса. Все данные подклассов создаются и т.д., Но переменная не может получить доступ к данным/функциям подкласса. Другими словами, вы не можете вызывать какие-либо методы или получать доступ к данным, специфичным для подкласса, вы можете получить доступ только к материалам суперкласса.

Однако вы можете использовать Superclassvariable для подкласса и использовать его методы/данные.

Ответ 5

Иногда вам нравится получать в качестве аргумента родительскую ссылку и внутри вы, вероятно, хотите сделать что-то конкретное для ребенка.

abstract class Animal{
 public abstract void move();
}
class Shark extends Animal{
 public void move(){
  swim();
 }
 public void swim(){}
 public void bite(){}
}
class Dog extends Animal{
 public void move(){
  run();
 }
 public void run(){}
 public void bark(){}
}

...

void somethingSpecific(Animal animal){
 // Here you don't know and may don't care which animal enters
 animal.move(); // You can call parent methods but you can't call bark or bite.
 if(animal instanceof Shark){
  Shark shark = (Shark)animal;
  shark.bite(); // Now you can call bite!
 }
 //doSomethingSharky(animal); // You cannot call this method.
}

...

В вышеприведенном методе вы можете пройти либо Shark, либо Dog, но что, если у вас есть что-то вроде этого:

void doSomethingSharky(Shark shark){
 //Here you cannot receive an Animal reference
}

Этот метод может быть вызван только путем передачи ссылок акулы Поэтому, если у вас есть Animal (и это глубоко Shark), вы можете называть его следующим образом:

Animal animal...
doSomethingSharky((Shark) animal)

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

Ответ 6

Допустим, что у вас есть класс A как суперкласс и подкласс класса B. A.

public class A {

    public void printFromA(){
        System.out.println("Inside A");
    }
}
public class B extends A {

    public void printFromB(){
        System.out.println("Inside B");
    }

}

public class MainClass {

    public static void main(String []args){

        A a = new B();
        a.printFromA(); //this can be called without typecasting

        ((B)a).printFromB(); //the method printFromB needs to be typecast 
    }
}

Ответ 7

В этом примере ваша переменная суперкласса сообщает объекту подкласса реализовать метод суперкласса. Это относится к кастомизации типов объектов java. Здесь метод method() первоначально является методом суперкласса, но переменная суперкласса не может обращаться к другим методам объекта подкласса, которые отсутствуют в суперклассе.

Ответ 8

Например, у вас есть суперкласс класса животных и подкласс Cat. Пусть ваш подкласс имеет слово(); Метод.

class Animal{

  public void walk(){

  }

}

class Cat extends Animal{

  @Override
  public void walk(){

  }

  public void speak(){

  }

  public void main(String args[]){

    Animal a=new Cat();
    //a.speak(); Compile Error
    // If you use speak method for "a" reference variable you should downcast. Like this:

    ((Cat)a).speak();
  }

}

Ответ 9

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

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

Ответ 10

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

class Parent{
   void method(){ System.out.print("this is the parent"); }
}

class Child extends Parent{
   @override
   void method(){ System.out.print("this is the child"); }
}
...
Parent o = new Child();
o.method();
((Child)o).method();  

Два вызова метода будут напечатаны: "это ребенок".