Mein Junior fragte mich nach der Vererbung von Java-Klassen, aber ich konnte sie nicht sofort beantworten, also habe ich viel recherchiert.
Alter @ IT-Besprechungsraum: Informationen zur Vererbung von Variablen
Auszug, weil es schwer zu lesen ist
Wenn in der Oberklasse eine gleichnamige Variable vorhanden ist, die Methode der Oberklasse Bei der Ausführung bezieht sich die gleichnamige Variable auf die Oberklasse. Wie kann ich in meiner Klasse auf eine gleichnamige Variable verweisen?
Unten finden Sie eine Beispielquelle. Was ich dachte, würde zurückkehren "Ich bin ein Kind" gab zurück "Ich bin ein Elternteil".
Main.java
//Ausführungsklasse
public class Main{
public static void main(String args[]){
Child c1 = new Child();
c1.print();
}
}
//Super Klasse
class Parent{
private String JIBUN = "Elternteil";
public void print(){
System.out.println("ich" + JIBUN + "ist.");
}
}
//Kinderklasse
class Child extends Parent{
private String JIBUN = "Kinder";
}
Er sagte, dass er nicht verstehe, selbst wenn er die Erklärung lese.
In dem Moment, als ich es sah, dachte ich, dass JIBUN privat ist, so dass es nicht aus anderen Klassen referenziert werden kann und Eltern und Kind unterschiedlich sind, oder? Es war das.
Aber was ist, wenn es geschützt (öffentlich) ist? Ich kam auf die Frage, also habe ich sie richtig untersucht.
Unten finden Sie die Quelle, die für den Test verwendet wurde. piza.io
Main.java
//Ausführungsklasse
public class Main{
public static void main(String args[]){
Child c1 = new Child();
c1.print();
c1.print2();
Parent parent = new Child();
c1.print();
c1.print2();
}
}
//Super Klasse
class Parent{
private String JIBUN1 = "Elternteil 1";
protected String JIBUN2 = "Elternteil 2";
protected String JIBUN3 = "Elternteil 3";
public void print(){
System.out.println("print");
System.out.println("ich" + JIBUN1 + "ist.");
System.out.println("ich" + JIBUN2 + "ist.");
System.out.println("ich" + JIBUN3 + "ist.");
}
// final public void print2(){Wenn Sie es nicht überschreiben möchten, fügen Sie final hinzu und Sie erhalten einen Kompilierungsfehler.
public void print2(){
System.out.println("print2");
System.out.println("Eltern" + JIBUN1 + "ist.");
System.out.println("Eltern" + JIBUN2 + "ist.");
System.out.println("Eltern" + JIBUN3 + "ist.");
}
}
//Kinderklasse
class Child extends Parent{
// @Override //Kompilierungsfehler, da er nicht überschrieben werden kann
private String JIBUN1 = "Kind 1";
// @Override //Kompilierungsfehler, da er nicht überschrieben werden kann
protected String JIBUN2 = "Kind 2";
Child() {
this.JIBUN3 = "Kind 3";
}
@Override //Die Überschreibungsanmerkung gibt eindeutig an, dass es sich um eine Überschreibung handelt
public void print2(){
System.out.println("print2");
System.out.println("Kinder" + JIBUN1 + "ist.");
System.out.println("Kinder" + JIBUN2 + "ist.");
System.out.println("Kinder" + JIBUN3 + "ist.");
}
}
Ausführungsergebnis
print
Ich bin Elternteil 1.
Ich bin Elternteil 2.
Ich bin 3 Kinder
print2
Das Kind ist Kind 1.
Das Kind ist Kind 2.
Das Kind ist Kind 3.
print
Ich bin Elternteil 1.
Ich bin Elternteil 2.
Ich bin 3 Kinder
print2
Das Kind ist Kind 1.
Das Kind ist Kind 2.
Das Kind ist Kind 3.
Die Ergebnisse sind unten zusammengefasst.
Eigentlich habe ich die Objektorientierung in C # gelernt, daher war das Schreiben einfacher.
Dieses Mal gibt es Methodenüberschreibungen und Ausblenden, also gibt es print2 (Überschreiben) und print3 (Ausblenden).
Main.cs
using System;
public class Test {
public static void Main(){
Child c1 = new Child();
c1.print();
c1.print2();
c1.print3();
Parent parent = new Child();
parent.print();
parent.print2();
parent.print3();
}
}
//Super Klasse
public class Parent{
// virtual //Kompilierungsfehler, da er nicht überschrieben werden kann
private string JIBUN1 = "Elternteil 1";
// virtual //Kompilierungsfehler, da er nicht überschrieben werden kann
protected string JIBUN2 = "Elternteil 2";
// virtual //Kompilierungsfehler, da er nicht überschrieben werden kann
protected string JIBUN3 = "Elternteil 3";
public void print(){
Console.WriteLine("print");
Console.WriteLine("ich" + JIBUN1 + "ist.");
Console.WriteLine("ich" + JIBUN2 + "ist.");
Console.WriteLine("ich" + JIBUN3 + "ist.");
}
virtual public void print2(){
Console.WriteLine("print2");
Console.WriteLine("Eltern" + JIBUN1 + "ist.");
Console.WriteLine("Eltern" + JIBUN2 + "ist.");
Console.WriteLine("Eltern" + JIBUN3 + "ist.");
}
public void print3(){
Console.WriteLine("print3");
Console.WriteLine("Eltern" + JIBUN1 + "ist.");
Console.WriteLine("Eltern" + JIBUN2 + "ist.");
Console.WriteLine("Eltern" + JIBUN3 + "ist.");
}
}
//Kinderklasse
public class Child : Parent{
// override //Kompilierungsfehler, da er nicht überschrieben werden kann
private string JIBUN1 = "Kind 1";
// override //Kompilierungsfehler, da er nicht überschrieben werden kann
protected string JIBUN2 = "Kind 2";
public Child() {
this.JIBUN3 = "Kind 3";
}
override public void print2(){
Console.WriteLine("print2");
Console.WriteLine("Kinder" + JIBUN1 + "ist.");
Console.WriteLine("Kinder" + JIBUN2 + "ist.");
Console.WriteLine("Kinder" + JIBUN3 + "ist.");
}
// override public void print3(){Kompilierungsfehler, da print3 nicht virtuell ist
public void print3(){ //Nur eine Überschreibungsdefinition
Console.WriteLine("print3");
Console.WriteLine("Kinder" + JIBUN1 + "ist.");
Console.WriteLine("Kinder" + JIBUN2 + "ist.");
Console.WriteLine("Kinder" + JIBUN3 + "ist.");
}
}
Ausgabeergebnis
print
Ich bin Elternteil 1.
Ich bin Elternteil 2.
Ich bin 3 Kinder
print2
Das Kind ist Kind 1.
Das Kind ist Kind 2.
Das Kind ist Kind 3.
print3
Das Kind ist Kind 1.
Das Kind ist Kind 2.
Das Kind ist Kind 3.
print
Ich bin Elternteil 1.
Ich bin Elternteil 2.
Ich bin 3 Kinder
print2
Das Kind ist Kind 1.
Das Kind ist Kind 2.
Das Kind ist Kind 3.
print3
Der Elternteil ist Elternteil 1.
Der Elternteil ist Elternteil 2.
Elternteil ist Kind 3.
Kompilierungsfehler (Warnung)
Compilation succeeded - 2 warning(s)
Main.cs(49,22): warning CS0108: `Child.JIBUN2' hides inherited member `Parent.JIBUN2'. Use the new keyword if hiding was intended
Main.cs(21,22): (Location of the symbol related to previous warning)
Main.cs(60,17): warning CS0108: `Child.print3()' hides inherited member `Parent.print3()'. Use the new keyword if hiding was intended
Main.cs(36,17): (Location of the symbol related to previous warning)
Die Ergebnisse sind unten zusammengefasst.
Nun, dieses Gefühl ist ein persönlicher Eindruck, weil es in C # kultiviert wurde.
Ich habe C ++ nicht ernsthaft codiert, daher werde ich versuchen, es zu googeln.
Hier gibt es auch print2 und print3.
Main.cpp
#include <iostream>
using namespace std;
//Super Klasse
class Parent{
private:
// virtual //Kompilierungsfehler, da er nicht überschrieben werden kann
string JIBUN1 = "Elternteil 1";
protected:
// virtual //Kompilierungsfehler, da er nicht überschrieben werden kann
string JIBUN2 = "Elternteil 2";
// virtual //Kompilierungsfehler, da er nicht überschrieben werden kann
string JIBUN3 = "Elternteil 3";
public:
void print() {
cout << "print" << endl;
cout << "ich" + JIBUN1 + "ist." << endl;
cout << "ich" + JIBUN2 + "ist." << endl;
cout << "ich" + JIBUN3 + "ist." << endl;
};
virtual void print2() {
cout << "print2" << endl;
cout << "Eltern" + JIBUN1 + "ist." << endl;
cout << "Eltern" + JIBUN2 + "ist." << endl;
cout << "Eltern" + JIBUN3 + "ist." << endl;
}
void print3() {
cout << "print3" << endl;
cout << "Eltern" + JIBUN1 + "ist." << endl;
cout << "Eltern" + JIBUN2 + "ist." << endl;
cout << "Eltern" + JIBUN3 + "ist." << endl;
}
};
//Kinderklasse
class Child : public Parent{
private:
string JIBUN1 // override //Kompilierungsfehler, da er nicht überschrieben werden kann
= "Kind 1";
protected:
string JIBUN2 // override //Kompilierungsfehler, da er nicht überschrieben werden kann
= "Kind 2";
public:
Child() {
this->JIBUN3 = "Kind 3";
};
void print2() override {
cout << "print2" << endl;
cout << "Kinder" + JIBUN1 + "ist." << endl;
cout << "Kinder" + JIBUN2 + "ist." << endl;
cout << "Kinder" + JIBUN3 + "ist." << endl;
}
// void print3() override {Kompilierungsfehler, da print3 nicht virtuell ist
void print3() { //Nur eine Überschreibungsdefinition
cout << "print3" << endl;
cout << "Kinder" + JIBUN1 + "ist." << endl;
cout << "Kinder" + JIBUN2 + "ist." << endl;
cout << "Kinder" + JIBUN3 + "ist." << endl;
}
};
int main(void){
Child *c1 = new Child();
c1->print();
c1->print2();
c1->print3();
Parent *parent = new Child();
parent->print();
parent->print2();
parent->print3();
}
Ausführungsergebnis
print
Ich bin Elternteil 1.
Ich bin Elternteil 2.
Ich bin 3 Kinder
print2
Das Kind ist Kind 1.
Das Kind ist Kind 2.
Das Kind ist Kind 3.
print3
Das Kind ist Kind 1.
Das Kind ist Kind 2.
Das Kind ist Kind 3.
print
Ich bin Elternteil 1.
Ich bin Elternteil 2.
Ich bin 3 Kinder
print2
Das Kind ist Kind 1.
Das Kind ist Kind 2.
Das Kind ist Kind 3.
print3
Der Elternteil ist Elternteil 1.
Der Elternteil ist Elternteil 2.
Elternteil ist Kind 3.
Es gab keine besonderen Kompilierungsfehler (Warnungen).
Die Ergebnisse sind unten zusammengefasst.
Zu dieser Zeit habe ich auch die LL-Sprache untersucht. Die Klasse ist Python, das wie eine Nachrüstung aussieht.
Da die Annahmen unterschiedlich sind, hat die Quelle eine ganz andere Bedeutung. Es tut uns leid. (JIBUN1 und JIBUN2 sind Klassenfelder)
Auch hier gibt es print2 und print3, aber sie sind gleich, da sie nicht separat geschrieben werden können.
main.py
# coding: utf-8
# Your code here!
def main():
c1 = Child()
c1.print()
c1.print2()
c1.print3()
parent = Parent()
parent.print()
parent.print2()
parent.print3()
#Super Klasse
class Parent(object):
JIBUN1 = "Elternteil 1"
JIBUN2 = "Elternteil 2"
def __init__(self):
self.JIBUN3 = "Elternteil 3"
def print(self):
print("print")
print("ich" + self.JIBUN1 + "ist.")
print("ich" + self.JIBUN2 + "ist.")
print("ich" + self.JIBUN3 + "ist.")
def print2(self):
print("print2")
print("Eltern" + self.JIBUN1 + "ist.")
print("Eltern" + self.JIBUN2 + "ist.")
print("Eltern" + self.JIBUN3 + "ist.")
def print3(self):
print("print3")
print("Eltern" + self.JIBUN1 + "ist.")
print("Eltern" + self.JIBUN2 + "ist.")
print("Eltern" + self.JIBUN3 + "ist.")
#Kinderklasse
class Child(Parent):
JIBUN1 = "Kind 1"
def __init__(self):
super(Parent, self).__init__()
self.JIBUN3 = "Kind 3"
def print2(self):
print("print2")
print("Kinder" + self.JIBUN1 + "ist.")
print("Kinder" + self.JIBUN2 + "ist.")
print("Kinder" + self.JIBUN3 + "ist.")
def print3(self):
print("print3")
print("Kinder" + self.JIBUN1 + "ist.")
print("Kinder" + self.JIBUN2 + "ist.")
print("Kinder" + self.JIBUN3 + "ist.")
if __name__ == '__main__':
main()
Ausführungsergebnis
print
Ich bin ein Kind 1.
Ich bin Elternteil 2.
Ich bin 3 Kinder
print2
Das Kind ist Kind 1.
Das Kind ist Elternteil 2.
Das Kind ist Kind 3.
print3
Das Kind ist Kind 1.
Das Kind ist Elternteil 2.
Das Kind ist Kind 3.
print
Ich bin Elternteil 1.
Ich bin Elternteil 2.
Ich bin Elternteil 3
print2
Der Elternteil ist Elternteil 1.
Der Elternteil ist Elternteil 2.
Der Elternteil ist Elternteil 3.
print3
Der Elternteil ist Elternteil 1.
Der Elternteil ist Elternteil 2.
Der Elternteil ist Elternteil 3.
Die Ergebnisse sind unten zusammengefasst.
Nun, ich denke es ist leicht zu verstehen.
Selbst in der LL-Sprache scheint Ruby die Klasse von Anfang an entworfen zu haben, also als Referenz. Rubin Ich habe es nur ein wenig gekratzt.
Dies ist auch eine Quelle mit einer ganz anderen Bedeutung.
Main.rb
# coding: utf-8
# Your code here!
def main()
c1 = Child.new
c1.print
c1.print2
Child.print3
parent = Parent.new
parent.print
parent.print2
Parent.print3
end
#Super Klasse
class Parent
@JIBUN1 = "Elternteil 1"
@@JIBUN2 = "Elternteil 2"
def initialize
@JIBUN3 = "Elternteil 3"
end
def print
p "print"
p "ich" + (@JIBUN1 || 'nicht definiert') + "ist."
p "ich" + (@@JIBUN2 || 'nicht definiert') + "ist."
p "ich" + @JIBUN3 + "ist."
end
def print2
p "print2"
p "Eltern" + (@JIBUN1 || 'nicht definiert') + "ist."
p "Eltern" + (@@JIBUN2 || 'nicht definiert') + "ist."
p "Eltern" + @JIBUN3 + "ist."
end
def self.print3
p "print3"
p "Eltern" + @JIBUN1 + "ist."
p "Eltern" + @@JIBUN2 + "ist."
p "Eltern" + (@JIBUN3 || 'nicht definiert') + "ist."
end
end
#Kinderklasse
class Child < Parent
@JIBUN1 = "Kind 1"
@@JIBUN2 = "Kind 2"
def initialize
super
@JIBUN3 = "Kind 3"
end
def print2
p "print2"
p "Kinder" + (@JIBUN1 || 'nicht definiert') + "ist."
p "Kinder" + (@@JIBUN2 || 'nicht definiert') + "ist."
p "Kinder" + @JIBUN3 + "ist."
end
def self.print3
p "print3"
p "Kinder" + (@JIBUN1 || 'nicht definiert') + "ist."
p "Kinder" + (@@JIBUN2 || 'nicht definiert') + "ist."
p "Kinder" + (@JIBUN3 || 'nicht definiert') + "ist."
end
end
main
Ausführungsergebnis
"print"
"Ich bin undefiniert."
"Ich bin 2 Kinder"
"Ich bin 3 Kinder"
"print2"
"Kinder sind undefiniert."
"Das Kind ist Kind 2."
"Das Kind ist Kind 3."
"print3"
"Das Kind ist Kind 1."
"Das Kind ist Kind 2."
"Kinder sind undefiniert."
"print"
"Ich bin undefiniert."
"Ich bin 2 Kinder"
"Ich bin Elternteil 3"
"print2"
"Der Elternteil ist undefiniert."
"Der Elternteil ist Kind 2."
"Der Elternteil ist Elternteil 3."
"print3"
"Der Elternteil ist Elternteil 1."
"Der Elternteil ist Kind 2."
"Der Elternteil ist undefiniert."
Die Ergebnisse sind unten zusammengefasst.
Es scheint, dass es mit Klassen entworfen wurde, aber es ist ein Rätsel, warum Klassenvariablen und Klasseninstanzvariablen so wurden.
Recommended Posts