Java 父实例和子实例之间的关系

Java 父实例和子实例之间的关系,java,inheritance,Java,Inheritance,我已经开始学习Java了,一个朋友问我这个问题 两者的区别是什么 父类p=新的子类() 及 ChildClass c=新的ChildClass() 提前感谢。p只有在ParentClass中定义的方法才可访问,只要它不是强制转换到ChildClass c将具有在ParentClass中定义的可用方法和在ChildClass 例如: class ParentClass { public void dothis() { } } class ChildClass extends Par

我已经开始学习Java了,一个朋友问我这个问题

两者的区别是什么

父类p=新的子类()

ChildClass c=新的ChildClass()


提前感谢。

p
只有在
ParentClass
中定义的方法才可访问,只要它不是强制转换到
ChildClass
c
将具有在
ParentClass
中定义的可用方法和在
ChildClass

例如:

class ParentClass {
   public void dothis() {
   }  
}
class ChildClass extends ParentClass {
   public void doother() {
   }  
}
p
将只能调用
p.dothis()
。调用
p.doother()

c
将乐意接受
c.dothis()
c.doother()

如果您“怀疑”(编程时,如果没有检查,您永远无法确定)某个对象可能是某个子类,您可以尝试将其降级。
执行此操作之前,请始终检查对象的实例。
当检查通过时,您可以将对象强制转换为子类

if(p instanceof ChildClass) {
    ChildClass c = (ChildClass)p;
    c.doother();
}

p
只有在
ParentClass
中定义的方法才可访问,只要它不是强制转换到它的
ChildClass

c
将具有在
ParentClass
中定义的可用方法和在
ChildClass

例如:

class ParentClass {
   public void dothis() {
   }  
}
class ChildClass extends ParentClass {
   public void doother() {
   }  
}
p
将只能调用
p.dothis()
。调用
p.doother()

c
将乐意接受
c.dothis()
c.doother()

如果您“怀疑”(编程时,如果没有检查,您永远无法确定)某个对象可能是某个子类,您可以尝试将其降级。
执行此操作之前,请始终检查对象的实例。
当检查通过时,您可以将对象强制转换为子类

if(p instanceof ChildClass) {
    ChildClass c = (ChildClass)p;
    c.doother();
}

有两种类型的绑定1)早期绑定2)后期绑定 绑定意味着comiler对指定过程调用进行标识。 方法重载是早期绑定的最好例子

而运行时多态性是后期绑定的最佳示例

class Parent{

    public void test()
    {
        System.out.println("a");
    }
}
class Child extends Parent{
    int a=100;
    public void test()
    {
        System.out.println("b");
    }
}

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Parent a =new Parent();
        a.test();
        Parent b=new Child();
        b.test();
 }
}

上面的示例可能会澄清您的概念

有两种类型的绑定1)早期绑定2)后期绑定 绑定意味着comiler对指定过程调用进行标识。 方法重载是早期绑定的最好例子

而运行时多态性是后期绑定的最佳示例

class Parent{

    public void test()
    {
        System.out.println("a");
    }
}
class Child extends Parent{
    int a=100;
    public void test()
    {
        System.out.println("b");
    }
}

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Parent a =new Parent();
        a.test();
        Parent b=new Child();
        b.test();
 }
}

上面的示例可能会清楚说明您的概念

c
可以利用
ChildClass
中定义的东西(方法、变量、枚举、子类等。当然,它们必须对调用方可见),而
p
只能访问
ParentClass
类的内容。请访问此链接了解更多@KevinEsche,这是否意味着ParentClass p=new ParentClass();与父类p=new ChildClass()相同@Kimutai在查看了链接之后,我认为示例所建议的与KevinEsche所说的完全相反,因为父类雇员e正在访问Salary类(Child)的方法
c
可以利用这些东西(方法、变量、枚举、子类等等。当然,调用方必须在这里看到它们)在
ChildClass
中定义,而
p
只能访问
ParentClass
类的内容。有关更多信息,请访问此链接@KevinEsche,这是否意味着ParentClass p=new ParentClass();与父类p=new ChildClass()相同@Kimutai在查看了链接之后,我认为示例所建议的与KevinEsche所说的完全相反,因为父类员工e访问的薪资类(Child)方法不准确。c将无权访问父类私有方法。此外,如果显式地cast@sharonbn当然,他们必须是可见的,而且你可以确定地投下它。如果你把与主题相关的所有其他材料都包括进来,比如访问修改器和施法,你的陈述也会不准确,因为仍然有可能使用反射。当然,这是不准确的,这就是我添加额外解释的原因。但请记住,是有人在学习java。一下子把它弄得太复杂,就会在可能的范围内丢失答案。调用p.doother()将导致编译器错误@Tschallacka做了一点实验,现在你的解释和多态性都清楚了。谢谢,不准确。c将无权访问父类私有方法。此外,如果显式地cast@sharonbn当然,他们必须是可见的,而且你可以确定地投下它。如果你把与主题相关的所有其他材料都包括进来,比如访问修改器和施法,你的陈述也会不准确,因为仍然有可能使用反射。当然,这是不准确的,这就是我添加额外解释的原因。但请记住,是有人在学习java。一下子把它弄得太复杂,就会在可能的范围内丢失答案。调用p.doother()将导致编译器错误@Tschallacka做了一点实验,现在你的解释和多态性都清楚了。谢谢。所以基本上家长b=新孩子();和Child c=新的Child();将在Child中引用相同的方法ie test()。那么这两者有什么区别呢?谢谢@KevalPithvaso基本上是父级b=新的子级();和Child c=新的Child();将在Child中引用相同的方法ie test()。那么这两者有什么区别呢?谢谢@克瓦尔皮特瓦