2016-12-15 1 views
0

Я готовлю к экзамену в java. Пожалуйста, взгляните на следующие два упражнения (у меня есть решения, но решения без объяснений), поэтому, если кто-нибудь сможет проверить мои объяснения, это было бы весьма полезно.Статические и динамические типы

1)

public interface Sale{} 
public abstract class Clothing{} 
public class Jacket extends Clothing implements Sale{} 
public class LeatherJacket extends Jacket{} 

Какие из следующих возможны:

Sale var1 = new LeatherJacket(); 

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

Sale var2 = new Sale(); 

невозможно. Вы не можете создать объект типа интерфейса.

Clothing var3 = new Clothing(); 

невозможно. Вы не можете создать объект абстрактного класса.

Clothing var4 = new LeatherJacket(); 

возможно, но почему?

Jacket var5 = new LeatherJacket(); 

возможно, но почему именно?

LeatherJacket var6 = new Object(); 

невозможно, но почему бы и нет?

ответ

0
Clothing var4 = new LeatherJacket(); 

LeatherJacket распространяется куртка, которая распространяется на одежду.

Jacket var5 = new LeatherJacket(); 

оладья простирается куртка

LeatherJacket var6 = new Object(); 

Объект является суперклассом всех. Вы не можете сделать это, кроме наоборот. Yes Object o = new LeatherJacket();

1
Clothing var4 = new LeatherJacket(); 

возможно, но почему?

Это разрешено, так как LeatherJacket является производным классом Clothing. Это не создание через абстрактный класс Clothing. Он написал new LeatherJacket(), а не new Clothing().


Jacket var5 = new LeatherJacket(); 

возможно, но почему именно?

Это разрешено, потому что все кожаные куртки - это куртка. Но обратное неверно.Это как все Львы животных, то вы можете написать:

Animal lion = new Lion(); //where Lion extends Animal 

Но вы не можете написать:

Lion lion = new Animal(); //not all animals are lions 

LeatherJacket var6 = new Object(); 

не представляется возможным, но почему нет?

Причина такая же, как в предыдущем объяснении. Object находится на самой высокой иерархии в Java, каждый класс является подклассом класса Object. Следовательно, находясь на вершине иерархии, это не будет разрешено. Тем не менее, это будет позволено:

Object var6 = new LeatherJacket(); //allowed (all leather jackets are objects) 
LeatherJacket var 6 = new Object(); //not allowed (not all objects are leather jackets) 
+0

Благодарим вас за отложенный ответ. Итак, в первом var1 является переменной типа Sale и хранит объект LeatherJacket, не так ли? Тогда также должно быть правдой: Sale var7 = new Jacket() ;? – DerDieDasEhochWas

+0

@DerDieDasEhochWas Да, вы правы на обоих своих предположениях. Если это помогает, вы можете принять ** одно ** решение отсюда, которое помогло вам, щелкнув полый тик рядом с решением. – user3437460

0

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

enter image description here

Следующая должно дать вам очень хороший ключ, что разрешается и не допускается:

Object o = new Clothing();  //not allowed (Clothing is abstract!) 
Object o = new Jacket();   //allowed (jacket is a subset of object) 
OBject o = new LaatherJacket(); //allowed (leather jacket is a subset of object) 

Clothing c = new Object();  //not allowed (Object is not a subset of clothing, cannot assume object is definitely a Clothing) 
Clothing c = new Jacket();  //allowed (jacket is a subset of Clothing) 
Clothing c = new LaatherJacket(); //allowed (leather jacket is a subset of Clothing) 

Jacket j = new Object();   //not allowed (Object is not a subset of jacket, cannot assume object is definitely a jacket) 
Jacket j = new Clothing();  //not allowed (Clothing is abstract!) 
Jacket j = new LeatherJacket(); //allowed (leather jacket is a subset of jacket) 

LeatherJacket j = new Object;  //not allowed (Object is not a subset of jacket, cannot assume object is definitely a leather jacket) 
LeatherJacket j = new Clothing(); //not allowed (Clothing is abstract!) 
LeatherJacket j = new Jacket(); //not allowed (Jacket is not a subset of jacket, cannot assume jacket is definitely a leatherjacket)