если Person это класс (в Java), что делает Person персоной; делать? - PullRequest
0 голосов
/ 08 августа 2011

Person - это класс, имеющий Parent в качестве подкласса.

Рассмотрим следующие 2 утверждения:

  1. Person person = new Parent();
  2. Parent parent= (Parent)person;

Второй оператор typecasts person objectссылочная переменная на parent ... означает ли это, что она изменяет (вид перезаписи) переменную person или создает новую копию person ссылочной переменной, а затем выполняет тип?

Например:

double x = 10.5; 
int y = (int)x ;

Здесь значение в x не затрагивается и y будет равно 10.То же самое относится к примеру parent person или оно отличается?

Ответы [ 5 ]

1 голос
/ 08 августа 2011

Новый объект не создан.

Приведение (Parent) просто заставляет виртуальную машину интерпретировать person как экземпляр Parent. Если это не так, то будет выдано исключение ClassCastException.

Вы можете сделать:

Person person = new Parent();

, поскольку Person является суперклассом Parent, каждый экземпляр Parent также является экземпляром Person.

Но из person нельзя использовать методы, определенные в Parent.

Parent parent = new Parent();
Person person = parent; // Ok, two instances to the the same object.
parent.setNumberOfSons(2); // Ok
person.setNumberOfSons(2); // Compile error, Person does not have that method (even if the instance is a person).
Parent parent2 = (Parent) person;
parent2.setNumberOfSons(2); // Ok

Обратите внимание, что при этом:

Person person = new Person();
Parent parent = (Parent) person;

Выдает исключение ClassCastException (объект не является экземпляром Parent).

Также, если Person не расширяет String, то это

String myString = new String();
Person person = (Person) myString; 

будет ошибкой компиляции (хотя Person может быть Parent, String не может быть Person, так как один не расширяет другой).

1 голос
/ 08 августа 2011

И person, и parent являются ссылками и различаются (тип). Базовый объект остается тем же самым.

1 голос
/ 08 августа 2011

Это другое. double amd int - это примитивные типы, а Person и Parent - классы.

Когда вы приводите что-либо в Parent, объект не изменяется. Cast только заставляет вас сказать компилятору: «Я знаю, что я делаю. Я уверен, что это объект типа Parent».

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

0 голосов
/ 08 августа 2011

Пример (это может помочь понять):

class ClassA {
    public int i = 10;
}

class ClassB : ClassA {
}

ClassB b = new ClassB();
ClassA a = (ClassA)b;
a.i += 10;
// now b.i = 20

Когда вы приводите double к int, это создает новую переменную, когда вы приводите один класс к другому, вы не создаете новую переменную, вы только сообщаете компилятору, что эта переменная может рассматриваться как некоторый другой класс

0 голосов
/ 08 августа 2011

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

Set<string,object> mySet = new Hashset<>();

. Здесь вы присваиваете экземпляр реализованного класса переменной интерфейса.

На втором шаге вы создаете вторую переменную, которой вы назначаетеранее созданный экземпляр.Поскольку компилятор не замечает того факта, что вы создали экземпляр класса Parent, вы должны вручную привести приведение содержимого переменной Person-typeed к типу Parent.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...