2016-06-28 5 views
-2
public class Link { 
     public static Link LAST = new Link(-1); 
     public Link next; 
     public int myId; 
     public Link() { 
       this(10); 
} 
     public Link(Link next) { 
       this(20); 
       this.next = next; 
} 
     protected Link(boolean b) { 
       this(99); 
} 
     private Link(int myId) { 
       this.myId = myId; 
} 
@Override 
     public String toString() { 
      return "Link #" + myId; 
} 
} 
     public class DataLink<T> extends Link { 
     private T value; 
     public DataLink(T value) { 
       this(value, new Link(false)); 
} 
     public DataLink(T value, Link parent) { 
       super(parent); 
       this.value = value; 
} 
     @Override 
     public String toString() { 
      return super.toString() + " (" + value.toString() +")"; 
} 
} 
     public class Main { 
     public static void main(String[] args) { 
************************ 
} 
} 

Заменяя линию ************************ ссвязанный список наследования Java

System.out.println (новый DataLink <> (новый Link()) далее);

печатает Ссылка # 99, Как это достичь защищенного Link (Boolean б)?

+4

Я не понимаю твое замешательство. Если 'DataLink' и' Link' находятся в одном пакете, DataLink будет иметь доступ к защищенным членам в 'Link'. Ваш результат имеет смысл. Вы вызываете 'new Link (false)', который запускает логический конструктор. –

+0

, предположим, что для достижения 'public Link (Link next)', а не 'protected Link (boolean b)', конструктором, не так ли? – student

+0

Но 'System.out.println (новый DataLink <> (новая ссылка()) next); 'означает' (новый DataLink <> (новый Link()) 'вызывает' DataLink (значение T) ', так как' new Link' возвращает значение, но есть также '.next', а не' null'? – student

ответ

1

Вы можете использовать любой Java IDE, чтобы проследить шаги

new DataLink<>(new Link()).next 

получает следующий объект звену канальном в родительский класс (Link), потому что DataLink класс не имеет следующий объект.

это шаги

1.new DataLink<>(new Link()) 
2.this(value, new Link(false)); 
    3.protected Link(boolean b) { //from new Link(false) 
      this(99); 
    4. this.myId = myId; // myId = 99, from this(99) 
5.super(parent); //calling public Link(Link next) 
6.this.next = next; //next = link object with myId=99 

поэтому, когда вы звоните новый DataLink <> (новый Link()). Следующий, .next будет вызывать следующий объект в родительском классе, который будет печатать Ссылка № 99

+0

Почему следующий объект с myId = 99? Не так ли это раньше. myId? – student

+1

«родительский» объект myId = 99. супер (родительский) вызов общедоступной ссылки (ссылка следующая), которой присваивается следующий родительский – CSK

+0

Почему вызывается 'public DataLink (T value, Link parent)'? Нет 2 параметры .. – student

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