2015-03-10 5 views
0

Я только что наткнулся на это потрясающее учебное видео о Java, и я узнал, что класс Object - это суперкласс всех классов за кулисами. Таким образом, это легко справляется с проблемой наличия нескольких типов данных в arraylist, просто объявляя класс Object при работе с самим списком.Почему бы просто не объявить класс Object для всех объектов?

Мой вопрос: Почему бы не просто объявить Object object = new SubObjectClass(); для всех объектов?

Это из-за какой-то неэффективности производительности или проблемы с памятью, с которыми я еще не сталкивался? Я нашел другой вопрос, но я не видел, чтобы кто-нибудь объяснял, почему у НЕ просто есть объявление класса Object?

Я понимаю, почему он там. Прошу прощения, если это основной вопрос.

+6

Попробуйте, посмотрите, как легко получить доступ к свойствам класса после того, как вы сделали это ... – MadProgrammer

+0

JavaScript более или менее делает то, что вы описываете; вы используете 'var' для всех переменных, и вы не указываете имя типа. У этого есть преимущества, но также и недостатки: (1) он позволяет легко назначить переменную объекту неправильного типа, тогда как в Java сильная типизация позволяет уловить многие из этих ошибок во время компиляции; (2) всякий раз, когда вы вызываете метод, программа должна выполнить поиск, чтобы узнать, имеет ли объект метод с этим именем, хотя я думаю, что в Java он просто загружает виртуальный адрес из массива, что немного быстрее. – ajb

ответ

1

Вы можете diclare список объектов, как вы сказали:

List<Object> list = new ArrayList<Object>(); 

Какой будет универсальный список «объектов» может хранить любой вид объекта.

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

Мы не будем знать, какой объект собирается выбраться из списка.

2

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

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

1

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

Например:

Object obj = new SubObjectclass(); 
SubObjectClass subobj = obj;// This will throw error. 
SubObjectClass subobj = (SubObjectClass)obj;//This will work. 
0

Есть еще одна проблема с этим: вы не можете получить доступ к переменной или методу подкласса с объектом суперкласса. Он может получить доступ только к переменной или методу суперкласса

Вот пример

import java.util.*; 
import java.lang.*; 
import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone 
{ 
public static void main (String[] args) throws java.lang.Exception 
{ 
    Object obj= new subclass(); 
    System.out.println(obj.i); 
    System.out.println(obj.abc()); 

    // your code goes here 
} 
} 

class subclass 
{ 
int a; 
public int abc(){ 
    return 1; 
} 
} 

Вот ошибка я получаю, когда я пытаюсь скомпилировать его:

Main.java:13: error: cannot find symbol 
    System.out.println(obj.i); 
         ^
symbol: variable i 
location: variable obj of type Object 
Main.java:14: error: cannot find symbol 
    System.out.println(obj.abc()); 
         ^
symbol: method abc() 
location: variable obj of type Object 
2 errors 
0

Тип стиранием в Java создает огромную производительность так как все должно быть в коробке и распаковано. Как уже упоминалось, вы можете создавать коллекции объектов в C#, но их следует избегать.

What are the differences between Generics in C# and Java... and Templates in C++?

http://www.jprl.com/Blog/archive/development/2007/Aug-31.html

+0

Я не вижу, как этот ответ имеет отношение к вопросу. – ajb

+0

Во-первых, вопрос, возможно, был задан видео, в котором упоминались дженерики, но вопрос не в том, что касается дженериков. Во-вторых, стирание типа является отличительной чертой всех дженериков, поэтому вы не можете этого избежать, и я не думаю, что это приводит к поражению производительности. Возможно, вы думаете о сырых типах, в которых вы говорите «Список списка = ...» без параметра типа. И необработанные типы не имеют отношения к вопросу, потому что OP ссылается на «Список », который не является сырым типом. – ajb

+0

Тип стирания происходит на Java, но не на C#. Вот почему высокая производительность Java сильно страдает. – SKall

Смежные вопросы