次のコードがあります。次の 2 つの質問があります。
class Parent {
private void test()
{
System.out.print("test executed!");
}
static void print(){
System.out.println("my class is parent");
}
}
class Child extends Parent
{
static void print(){
System.out.println("my class is Child");
}
}
public class Inheritence {
public static void main(String[] args)
{
Child p1 = new Child();
Parent p = new Child();
System.out.println("The class name of p is "+p.getClass());
System.out.println("The class name of p1 is "+p1.getClass());
System.out.println("p instance of child "+ (p instanceof Child));
System.out.println("p1 instance of child "+ (p1 instanceof Child));
//p.test();
p.print();
}
}
出力は次のとおりです。
The class name of p is class Child
The class name of p1 is class Child
p instance of child true
p1 instance of child true
my class is parent
タイプが であるため、クラス名は にp
なると思いました。ただし、 として印刷されます。どうすれば の を取得できますか。Parent
Parent
Child
type
p
ここでの 2 番目の質問は、プライベート メソッドが継承されているかどうかです。thisを含む多くの記事では、プライベート メソッドは継承されないというコメントがありますが、以下の例では継承されていることがわかります。以下の型キャストの問題である可能性があります。
class Child1 extends Parent1
{
}
public class Parent1 {
private void test()
{
System.out.print("test executed!");
}
public static void main(String[] args)
{
Parent1 p = new Child1();
p.test();
Child1 c = new Child1();
//c.test(); The method test from parent1 is not visible
}
}
Output is : test executed!
ここでは、タイプのオブジェクトでtest
メソッドを呼び出しています。継承されないため、メソッドはありません。しかし、プライベート メソッドが継承されていることを示す出力が得られます。保護されたメソッドであり、子クラスでオーバーライドした場合、それが呼び出されるオブジェクトのタイプが親であっても、実行されるのはオーバーライドされたメソッドですChild1
Parent1
Child1
test
test
(parent p1 = new child1());
編集:いくつかのコメントの後、クラス Parent1 とクラス Child1 を別々に作成し、親と子のオブジェクトを構築する App という新しいクラスを作成しました。今、私はp.test
以下のコードを呼び出すことができません。
class Child1 extends Parent1
{
}
class Parent1 {
private void test()
{
System.out.print("test executed!");
} }
public class App1{
public static void main(String[] args)
{
Parent1 p = new Child1();
p.test();//The method test from parent is not visible
Child1 c = new Child1();
//c.test(); //The method test from parent1 is not visible
}
}