Наследование 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
.