Java 为什么我无法访问父类型的子对象方法

Java 为什么我无法访问父类型的子对象方法,java,inheritance,methods,Java,Inheritance,Methods,对象a2的类型为A,但引用了C类的对象。因此,a2应该能够访问m3()。但是,为什么它没有发生?如果m3()方法是在类A中定义的,那么代码可以正常运行 class A { int var = 7; void m1() { System.out.println("A's m1 ,"); } void m2() { System.out.println("A's m2 ,"); } } class B extends A { vo

对象a2的类型为A,但引用了C类的对象。因此,a2应该能够访问m3()。但是,为什么它没有发生?如果m3()方法是在类A中定义的,那么代码可以正常运行

class A {

   int var = 7;

   void m1() {
      System.out.println("A's m1 ,");
   }

   void m2() {
      System.out.println("A's m2 ,");
   }
}

class B extends A {

   void m1() {
      System.out.println("B's m1 ,");
   }
}

class C extends B {

   void m3() {
      System.out.println("c's m3 ," + (var + 6));
   }
}

class Mixed {

   public static void main(String[] args) {
      A a = new A();
      B b = new B();
      C c = new C();
      A a2 = new C();
      a2.m1();
      a2.m2();
      a2.m3();
   }
}

当你写这行的时候

 A a2=new C();
a2将只能访问类A中定义的方法

即使a2引用类C的实例,它也不能调用仅在C中定义的方法

但是,如果您有以下情况:

class A {
    void m3() {
        System.out.println("in A");
    }
}

class C extends A {
    void m3() {
        System.out.println("in C");
    }
}

...
A a2 = new C();
a2.m3();
将输出

在C中

在这种情况下,m3()方法将被重写,调用的方法将由a2引用的实例类型(即C)确定


我想在这里看一下Java教程:

当您写这行时

 A a2=new C();
a2将只能访问类A中定义的方法

即使a2引用类C的实例,它也不能调用仅在C中定义的方法

但是,如果您有以下情况:

class A {
    void m3() {
        System.out.println("in A");
    }
}

class C extends A {
    void m3() {
        System.out.println("in C");
    }
}

...
A a2 = new C();
a2.m3();
将输出

在C中

在这种情况下,m3()方法将被重写,调用的方法将由a2引用的实例类型(即C)确定


我想在这里看一下Java教程:

当您写这行时

 A a2=new C();
a2将只能访问类A中定义的方法

即使a2引用类C的实例,它也不能调用仅在C中定义的方法

但是,如果您有以下情况:

class A {
    void m3() {
        System.out.println("in A");
    }
}

class C extends A {
    void m3() {
        System.out.println("in C");
    }
}

...
A a2 = new C();
a2.m3();
将输出

在C中

在这种情况下,m3()方法将被重写,调用的方法将由a2引用的实例类型(即C)确定


我想在这里看一下Java教程:

当您写这行时

 A a2=new C();
a2将只能访问类A中定义的方法

即使a2引用类C的实例,它也不能调用仅在C中定义的方法

但是,如果您有以下情况:

class A {
    void m3() {
        System.out.println("in A");
    }
}

class C extends A {
    void m3() {
        System.out.println("in C");
    }
}

...
A a2 = new C();
a2.m3();
将输出

在C中

在这种情况下,m3()方法将被重写,调用的方法将由a2引用的实例类型(即C)确定

我想看看这里的Java教程:

如果使用父类/超类的引用并尝试调用子类上的方法,那么该方法应该在父类/超类中定义。i、 例如,可以对对象(rhs)调用什么方法取决于lhs(引用类型)

如果使用父类/超类的引用并尝试调用子类上的方法,则应在父类/超类中定义该方法。i、 例如,可以对对象(rhs)调用什么方法取决于lhs(引用类型)

如果使用父类/超类的引用并尝试调用子类上的方法,则应在父类/超类中定义该方法。i、 例如,可以对对象(rhs)调用什么方法取决于lhs(引用类型)

如果使用父类/超类的引用并尝试调用子类上的方法,则应在父类/超类中定义该方法。i、 例如,可以对对象(rhs)调用什么方法取决于lhs(引用类型)

这意味着您只能访问类
A
的成员和类
C
的实现(如果有)

现在m3不是
a
的成员。明白了吗

这意味着您只能访问类
A
的成员和类
C
的实现(如果有)

现在m3不是
a
的成员。明白了吗

这意味着您只能访问类
A
的成员和类
C
的实现(如果有)

现在m3不是
a
的成员。明白了吗

这意味着您只能访问类
A
的成员和类
C
的实现(如果有)


现在m3不是
a
的成员。清除?

编译器检查调用方法的对象的引用。。。 在您的例子中,
a2=…
是编译器可以看到的,它发现
A
类中没有定义
m3()
方法。因此,代码不会编译

请注意, 在运行时调用方法时,JVM引用该引用引用引用的对象。在你的例子中,类A的引用是指类C的对象


阅读更多信息:

编译器检查调用方法的对象的引用。。。 在您的例子中,
a2=…
是编译器可以看到的,它发现
A
类中没有定义
m3()
方法。因此,代码不会编译

请注意, 在运行时调用方法时,JVM引用该引用引用引用的对象。在你的例子中,类A的引用是指类C的对象


阅读更多信息:

编译器检查调用方法的对象的引用。。。 在您的例子中,
a2=…
是编译器可以看到的,它发现
A
类中没有定义
m3()
方法。因此,代码不会编译

请注意, 在运行时调用方法时,JVM引用该引用引用引用的对象。在你的例子中,类A的引用是指类C的对象


阅读更多信息:

编译器检查调用方法的对象的引用。。。 在您的例子中,
a2=…
是编译器可以看到的,它发现
A
类中没有定义
m3()
方法。因此,代码不会编译

请注意, 在运行时调用方法时,JVM引用该引用引用引用的对象。在你的例子中,类A的引用是指类C的对象


阅读更多信息:

您将子类
C
视为
A
的一个实例,因为
A
没有
C
所具有的功能
m3

  A a2 = new C();
因此,在这里,您只能访问