Как я могу получить 2 вывода с помощью This (); - PullRequest
0 голосов
/ 18 марта 2019

Можно ли получить вывод 2, используя this(); для этого кода? Я не очень знаком с this();, поэтому объяснение поможет мне понять эту концепцию. Вывод, который я ищу, это 222 Morty & 222 Morty 25 или, если возможно, получить 111 Rick & 222 Morty 25.

class Student5 {  
    int id;  
    String name;  
    int age;  

    public Student5(int i,String n) {  
        id = i;  
        name = n;  
    }  

    public Student5(int i,String n,int a) {
        this(i, n);
        id = i;  
        name = n;  
        age=a;  
    }  

    void display() {
         System.out.println(id+" "+name+" "+age);
    }  

    public static void main(String args[]) {  
        // Student5 s1 = new Student5(111,"Rick");  
        Student5 s2 = new Student5(222,"Morty",25);  
        // s1.display();
        s2.display();
    }
}  

Ответы [ 5 ]

0 голосов
/ 18 марта 2019

Краткий ответ: нет .

Когда вы создаете 2 Student таких объектов:

Student5 s1 = new Student5(111,"Rick");  
Student5 s2 = new Student5(222,"Morty",25);

Они никак не связаны.
Таким образом, невозможно вывести вывод s1 Student из display() из s2 Student таким образом.

Ссылка может быть в виде добавления ссылки приятель на ваш Student5.

class Student5 {  
    int id;  
    String name;  
    int age;
    Student5 buddy;

    public Student5(int i,String n) {  
        id = i;  
        name = n;  
    }  

    public Student5(int i,String n,int a) {
        this(i, n);
        age = a;  
    }  

    public void setBuddy(Student5 b) {
        this.buddy = b;
        b.buddy = this;
    }

    private String getInfo() {
        StringBuffer buff = new StringBuffer();
        buff.append(id+" "+name);
        if (age > 0)
            buff.append(" "+age );
        return buff.toString();
    }

    public void display() {
        if (buddy != null)
            System.out.println(this.getInfo() +" & "+ buddy.getInfo());
        else
            System.out.println(this.getInfo());
    }  

    public static void main(String args[]) {  
        Student5 s1 = new Student5(111,"Rick");  
        Student5 s2 = new Student5(222,"Morty",25);

        s2.display();

        s1.setBuddy(s2);

        s1.display();
        s2.display();
    }
}

Будет напечатано

222 Морти 25
111 Rick & 222 Morty 25
222 Морти 25 и 111 Рик

<ч /> Теперь о вашей this путанице:

  • this - это ссылка Java на текущий объект изнутри объекта, например this.name
  • this() является ссылкой на конструктор без параметров текущего объекта.

Через перегрузка конструктора (конструкторы с разными типами / количеством параметров)
и цепочка конструктора (вызов одного конструктора из другого перегруженного конструктора)
Вы можете избежать повторения кода.

Преувеличенный пример использования this и this():

public Student5() {
    this.age = 0;
}

public Student5(int i) {  
    this();
    this.id = i;
}

public Student5(int i, String n) { 
    this(i);
    this.name = n;  
}  

public Student5(int i, String n, int a) {
    this(i, n);
    this.age = a;  
}

Если вы позвоните Student5(222, "Morty", 25), цепочка выполнения будет следующей:

Студент5 (222, "Морти", 25)
вызывает конструктор -> Student5 (222, "Морти")
конструктор вызовов -> Student5 (222)
вызывает конструктор -> Student5 (), который устанавливает возраст 0
возвращается к Student5 (222), который устанавливает идентификатор
возвращается к Student5 (222, «Морти»), который задает имя
возвращается к Студенту 5 (222, "Морти", 25), который устанавливает возраст

0 голосов
/ 18 марта 2019

это относится к текущему объекту.

Когда вы создаете объект как new Student5(222,"Morty",25);, он вызывает конструктор класса Student5, который имеет параметры (int, String, int) т.е. new Student5(int,String,int);, в вашем случае это

public Student5(int i,String n,int a){
this(i, n);
    id = i;  
    name = n;  
    age=a;  
    }  

теперь вы можете использовать i, n, a для инициализации переменных.Конечно, вы сделали это, но вы присваиваете значения дважды в следующих шагах

this(i, n);
    id = i;  
    name = n;  
    age=a;

, теперь измените его на

public Student5(int i,String n,int a){
   this(i, n); 
    age=a;  
    }  

здесь это (i, n) проверяет custroctor с Student5 (intСтроковые) типы.Итак, он переходит к приведенному ниже коду и выполняет инициализацию, если вы пропустите конструктор, он выдаст ошибку компиляции.

 public Student5(int i,String n){  
        id = i;  
        name = n;  
        }

display () выводит выходные данные в зависимости от того, какой объект вы вызываете методом.

Student5 s1 = new Student5(111,"Rick"); 
  s1.display()

печатает 111 Рик.поскольку вы вызываете display на s1, он не знает о данных объекта s2

Student5 s2 = new Student5(222,"Morty",25);  
s2.display()

печатает 222 Morty 25

, поскольку вы вызываете display на s2, он не знает об объекте s1data

, чтобы ответить на ваш вопрос "если возможно получить 111 Rick & 222 Morty 25."

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

0 голосов
/ 18 марта 2019

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

 class Student5{  
    int id;  
    String name;  
    int age;  
public Student5(){  

}
public Student5(int i,String n){  
    this();
    id = i;  
    name = n;  
    }  

public Student5(int i,String n,int a){
this(i, n);
    age=a;  
    }  

void display(){
     System.out.println(id+" "+name);
     if(age > 0){
        System.out.print(" "+age );
     }
   }  


public static void main(String args[]){  
   Student5 s1 = new Student5(111,"Rick");  
    Student5 s2 = new Student5(222,"Morty",25);  
   s1.display();
    s2.display();

   }  
}  
0 голосов
/ 18 марта 2019

Ключевое слово ЭТО - это ссылочная переменная в Java, которая ссылается на текущий объект.

позвольте понять ЭТО ключевое слово из примера:

class Example {
   int a,b;

   Example(int a, int b) {
       //During execution, the compiler is confused. Whether "a" and "b" on the left side
       //of the assigned operator is the instance variable or the local variable.
       // a=a; 
       // b=b;
       // To overcome this confusion we use THIS keyword to differentiate between
       // instiante variable and parameter varaible.
       this.a = a;
       this.b = b;
   }
}

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

void display(){
     System.out.println(id+" "+name+" "+age);
} 

void limitDisplay(){
     System.out.println(id+" "+name);
} 

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

class Student5{  
    int id;  
    String name;  
    int age;  

public Student5(int i,String n){  

    id = i;  
    name = n;  
    }  

public Student5(int i,String n,int a){
    id = i;  
    name = n;  
    age=a;  
    }  

void display(){
     System.out.print(id+" "+name+" ");
     if(age>0) {
         System.out.print(age);
     }
     System.out.println("");
   } 


public static void main(String args[]){  
   Student5 s1 = new Student5(111,"Rick");  
   Student5 s2 = new Student5(222,"Morty",25);  
   s1.display();
   s2.display();

   }  
} 

пробег:

111 Рик

222 Морти 25

0 голосов
/ 18 марта 2019
class Student5{  
    int id;  
    String name;  
    int age;  

public Student5(int i,String n){  
System.out.println(i+" "+n);
    id = i;  
    name = n;  
    }  

public Student5(int i,String n,int a){
this(i, n);
System.out.println(i+" "+n+" "+a);
    id = i;  
    name = n;  
    age=a;  
    }  

void display(){
     System.out.println(id+" "+name+" "+age);
   }  


public static void main(String args[]){  
//   Student5 s1 = new Student5(111,"Rick");  
    Student5 s2 = new Student5(222,"Morty",25);  
//   s1.display();
    //s2.display();

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