Java наследуется Супер контент копируется? - PullRequest
0 голосов
/ 01 ноября 2018

Я действительно пытаюсь понять, как работает наследование,

скажем, у нас есть классы A и B, B расширяет A, A содержит некоторые атрибуты (ссылочный тип, а также тип примитива), установленные для public и методы

скопированы ли эти атрибуты и методы в класс B? Я читал, что методы не копируются, но доступны по ссылке.

Как насчет атрибутов ссылочного типа, которые наследуются при создании экземпляра B? они должны занять некоторое место в памяти, и где хранится эта ссылка? в классе А или В? а как насчет примитивного типа они копируются в класс B и находятся ли они в том же месте, где находятся другие атрибуты B?

или когда вы создаете объект класса B, вы фактически создаете объект A и B, и они поддерживают некоторое отношение?

Некоторое объяснение было бы полезно.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Наследование Java это Супер контент копируется?

действительно пытаюсь понять, как работает наследование,

скажем, у нас есть класс A и B, B расширяет A, A содержит некоторые атрибуты (ссылочный тип, а также тип примитива), установленный на public и методы

скопированы ли эти атрибуты и методы в класс B?


Открытые атрибуты и методы наследуются подклассом B. Рассмотрим классы A и его подкласс B:

public class A {

    public int aNumber = 99;
    public StringBuilder aString = new StringBuilder("sb");
    private String privateVar = "private stuff";

    public A() {
    }

    public A(int i, StringBuilder s) {
        aNumber = i;
        aString = s;
    }

    public int getMyNumber() {
        return aNumber*2;
    }
    public StringBuilder getMyString() {
        return aString.append("!!");
    }
    @Override
    public String toString() {
        return aNumber + " : " + aString;
    }
}

public class B extends A {

    public B() {
    }

    public B(int i, StringBuilder s) {
        super(i, s);
    }
}


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

public class TestingInheritance {
    public static void main(String [] args) {

        A a = new A(3, new StringBuilder("test1"));
        System.out.println("A: " + a);

        B b = new B();
        System.out.println("b: " + b);
        System.out.println("b.aNumber: " + b.aNumber);
        System.out.println("b.getMyNumber: " + b.getMyNumber());
        System.out.println("");

        B b2 = new B(2, new StringBuilder("xx"));
        System.out.println("b2: " + b2);
        System.out.println("b2.aString: " + b2.aString);
        System.out.println("b2.getMyString: " + b2.getMyString());

        //System.out.println("Private: " + b.privateVar);
    }
}


Выход:

A: 3 : test1
b: 99 : sb
b.aNumber: 99
b.getMyNumber: 198

b2: 2 : xx
b2.aString: xx
b2.getMyString: xx!!


Обсуждение:

Есть два класса A и B. Класс B расширяется A. A - суперкласс, а B - его подкласс. У этих двух классов есть два конструктора - один конструктор по умолчанию без аргументов и конструктор, который принимает аргументы.

Класс A имеет открытые атрибуты типа примитив и ссылка: int aNumber и java.lang.StringBuilder aString. Существуют открытые методы getMyNumber, getMyString и java.lang.Object класса, переопределенные toString. Обратите внимание, что есть также личная переменная privateVar.

Код детали от TestingInheritance:


(i) Рассмотрим:

B b = new B();

Это создает экземпляр B. Это наследует атрибуты и методы своего суперкласса A.

System.out.println("b: " + b); // b: 99 : sb

Вновь созданный объект b имеет унаследованные значения атрибута от своего суперкласса A; следовательно, он печатает значения атрибута по умолчанию из переопределенного метода toString. Обратите внимание, что значения по умолчанию, определенные в классе A для атрибутов: 99 и StringBuilder объект со строковым значением "sb".

Следующий вывод атрибута и метода выводится из унаследованного A с использованием значений атрибута по умолчанию.

System.out.println("b.aNumber: " + b.aNumber); // 99
System.out.println("b.getMyNumber: " + b.getMyNumber()); // 198


(ii) Рассмотрим:

B b2 = new B(2, new StringBuilder("xx"));

Это создает экземпляр B с предоставленными параметрами: 2 и new StringBuilder("xx"). Обратите внимание в конструкторе класса B на оператор super(i, s); это требуется. И, если не указано, будет ошибка времени компиляции.

System.out.println("b2: " + b2); // 2 : xx

Это печатает предоставленные значения параметров в конструкторе класса B, которые в свою очередь передаются конструктору класса A с аргументами: super(i, s). Когда создается экземпляр класса B (с использованием конструктора), запускается конструктор класса A, first - см. Оператор super(...) (и это был первый оператор в коде конструктора) .

Ниже выведите унаследованное значение атрибута и возвращаемое значение метода.

System.out.println("b2.aString: " + b2.aString); // xx
System.out.println("b2.getMyString: " + b2.getMyString()); // xx!!


(iii) Наконец, следующее утверждение, если оно не будет прокомментировано, TestingInheritance не будет скомпилировано Там будет ошибка: TestingInheritance.java:18: error: privateVar has private access in A.

System.out.println("Private: " + b.privateVar);

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

0 голосов
/ 01 ноября 2018

Предположим, есть класс Animal:

public class Animal {
    private String _name;

    public Animal(String name) { _name = name;}

    public String getName() {return _name;}
}

Теперь есть класс Dog:

public class Dog extends Animal {
    public Dog() {
        super("Dog");
    }
}

Теперь, если вам это нравится:

 Animal dog = new Dog();
 System.out.println(dog.getName());

Так вы можете сделать имя переменной доступным от Dog класса до Animal.

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