Это ключевое слово ссылается на родительскую переменную - PullRequest
0 голосов
/ 22 января 2019

Сегодня один ученик предложил интересный запрос.Мы знаем, что ключевое слово this используется для ссылки на текущий объект.Но я не мог объяснить ему, как ведет себя ключевое слово this, как показано в следующем фрагменте.Я знаю, что такое наследование: разрешает доступ к переменным и методам родительского класса. Но скопированы ли они в область памяти дочернего экземпляра ?, потому что я могу использовать это ключевое слово для доступа к свойству родительского класса.

Мне удалось сослаться на переменную родительского класса.Я искал и обнаружил, что ничего не копируется фактически в дочерний класс, но почему происходит следующее поведение?Пожалуйста, объясните этот случай использования this.

class Parent {
   int a=10;
}

public class Child extends Parent{

  void m1(){
    System.out.println(a);
    System.out.println(this.a);
    System.out.println(super.a);
  }

  public static void main(String[] args){
    new Child().m1();
  }
}

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Рассмотрите ниже Код:

  • это ссылочная переменная, которая будет указывать на текущий объект.
  • super используется для ссылки на свойство Parent в случае, если у вас естьсоздал то же самое у ребенка.

    class Product{
    
        String color;
    
        public Product() {
            color = "Black";
        }
    }
    
    class Mobile extends Product{
    
        String color;
    
        Mobile(){
            color = "White";
        }
    
        void showMobileData(){
    
            System.out.println("this hashCode is "+this.hashCode());
            System.out.println("super hashCode is: "+super.hashCode());
    
            System.out.println("color is: "+color);
            System.out.println("this.color is: "+this.color);
            System.out.println("super.color is: "+super.color);
        }
    }
    
    public class Test {
    
        public static void main(String[] args) {
    
            //new Mobile().showMobileData();
            Mobile mRef = new Mobile();
            System.out.println("mRef HashCode: "+mRef.hashCode());
    
            mRef.showMobileData();
        }
    
    }
    
0 голосов
/ 22 января 2019

Свойство a наследуется Child. Следовательно, вы можете использовать this.a в child для ссылки на него.

Где должна была быть проблема?

Я искал и обнаружил, что ничего не копируется виртуально в дочерний класс

У вас неправильный пример, иллюстрирующий это утверждение.

Способ понять это (примерно): «переменные экземпляра не переопределяются при повторном объявлении в подклассах, поэтому вы не можете объявить экземпляр как Parent и ожидать получения Child.a, если экземпляр был создан с new Child() ". Вот пример проблемного случая:

class Parent {
   int a = 10;
}

public class Child extends Parent{

  int a = 12; //not overridden

  public static void main(String[] args){
    Parent child = new Child();
    System.out.println(child.a); //This will print 10, not 12
  }
}

System.out.println(child.a); напечатает 10, потому что поля экземпляра переменных не переопределяются. Вы получаете значение на основе объявленного типа (Parent в данном случае)

0 голосов
/ 22 января 2019

Когда вы создаете экземпляр класса Child, он содержит всех членов себя и Parent. Тем не менее, частные члены Parent не доступны из Child:

class Parent {
   private int p = 10;
}

public class Child extends Parent{

  void m1(){
    System.out.println(p); // compilation error
  }

}

Еще один интересный случай - когда один экземпляр Parent пытается получить доступ к закрытому полю другого экземпляра Parent. Как вы думаете, что происходит?

public class Parent {
    private int p = 11;

    public boolean same(Parent other) {
        return other.p == p;
    }
}

Вы можете подумать, что other.p приведет к ошибке компиляции, поскольку p является приватным полем. Однако, поскольку конфиденциальность относится не к экземплярам объектов, а к классам. Таким образом, все закрытые поля в Parent видны во всех экземплярах Parent, поэтому это работает!

...