`
GongWenJun
  • 浏览: 2269 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

父类与子类引用的问题

阅读更多
class A {
     public void func1() {
          System.out.println("A func1 is calling.");
     }
     public void func2() {
          func1();
     }
}
class B extend A {
     public void func1() {
          System.out.println("B func1 is calling.");         
     }
     public void func3() {
          System.out.println("B func3 is calling.");
     }
}
class C {
     public static void main(String[] args) {
          B b = new B();
          A a = b;
          callA(a);
          callA(new B());
     }
     public void callA(A a) {
          a.func1();
          a.func2();
     }
}
编译器能够自动将类B的实例对象b直接赋值给A类的引用变量,也就是子类能够自动转换成父类类型。另外,程序可以直接创建一个类B的实例对象,传递给需要 类A的实例对象作参数的callA()方法,在参数传递的过程中发生了隐式自动类型转换。子类能够自动转换成父类的道理非常容易理解。
2、父类转换成子类
如果知道callA方法中传递的参数a实际上就是子类B的一个引用对象,想在callA方法中调用子类的特有方法,如何做:
     public void callA(A a) {
          a.func1();
          a.func2();
          a.func3();
     }
编译有问题,因为对编译器来说,它只分析程序语法,它只知道变量a的引用类型是类A,而类A又没有func3这个方法,所以编译不通过。代码改为:
     public void callA(A a) {
          B b = a;
          a.func1();
          a.func2();
          a.func3();
     }
编译还是有问题,因为编译器是不能将父类对象自动转换成子类的。
     public void callA(A a) {
          B b = (B)a;     //强制类型转换
          a.func1();
          a.func2();
          a.func3();
     }
 
-instanceof 操作符-
可以用instanceof判断是否一个类实现了某个接口,也可以用它来判断一个实例对象是否属于一个类
public void callA(A a) {
     if(a instanceof B){
          B b = (B)a;
          a.func1();
          a.func2();
          a.func3();
     } else {
          a.func1();
          a.func2();
     }
}
只要记住:一个男人肯定也是人,一个人却不一定是男人的道理,就非常容易理解父类和子类之间的转换关系了。
分享到:
评论

相关推荐

    父类赋值给子类

    在编程领域,特别是面向对象编程中,"父类赋值给子类" 是一个常见的操作。C# 作为一种强大的面向对象的语言,提供了多种方式来实现这种继承关系下的数据复制。这里我们将深入探讨如何在 C# 中进行父类属性到子类属性...

    论JAVA继承机制中父类与子类的关系

    文章围绕子类继承父类成员的过程、成员变量及方法的赋值、重写、覆盖等问题展开讨论,旨在帮助读者更好地理解Java继承中的重点与难点。 #### 关键词 - 继承机制 - 父类 - 子类 #### 一、超类的属性或方法在继承...

    java多态性详解——父类引用子类对象

    本文将深入探讨Java中的多态性,特别是“父类引用子类对象”的概念,以及这一特性如何在实际编码中体现。 ### 多态性概述 多态性主要通过方法的重写(Overriding)、重载(Overloading)和动态绑定(Dynamic Binding)来...

    父类引用指向子类对象

    当`main`方法在父类中,或者在与父类同包的其他类中时,可以访问父类和子类的`default`、`protected`、`public`属性和方法。如果`main`在其他包中,只能访问`public`属性和方法。 总的来说,父类引用指向子类对象是...

    将子类引用赋给父类对象时,java虚拟主机并没有将那些非继承成员丢弃

    在Java编程语言中,"将子类引用赋给父类对象"是一种常见的多态性表现。这个过程被称为向上转型(Upcasting),它允许我们用父类引用指向子类实例,从而实现更通用的代码设计。然而,这并不意味着在转换过程中会丢失...

    Java中父类和子类之间的转换操作示例

    在 Java 中,父类和子类之间的转换操作可以分为两种:父类引用强转成为子类引用和父类不可以强转成为子类。 一、父类引用强转成为子类引用 在 Java 中,父类引用可以强转成为子类引用。这意味着,我们可以将父类...

    java多态性详解——父类引用子类对象.pdf

    Java 多态性详解 —— 父类引用子类对象 多态性是 Java 面向对象编程的三个特征之一,另外两个是封装和继承。多态性是指通过方法的重写、重载和动态连接来实现的。在 Java 中,多态性是为了解决单继承问题而引入的...

    java 子类对象赋值给父类对象的使用

    4. **类型转换**:虽然父类引用可以指向子类对象,但反过来不行,即子类引用不能直接指向父类对象。若要从父类引用转回子类引用,需要进行类型转换(downcasting),如`Dog dog = (Dog) animal;`,但需要注意,只有...

    JAVA 多态操作----父类与子类转换问题实例分析

    JAVA 多态操作----父类与子类转换问题实例分析 JAVA 多态操作中的父类与子类转换问题是 Java 编程语言中的一种重要概念。多态操作允许我们在编程中使用父类类型的引用来指向子类类型的对象,这种机制使得我们可以...

    子类引用父类构造方法

    java训练题目 编写程序实现子类对父类构造方法的引用?

    java中的继承(子类调用父类构造方法还不懂).doc

    - **定义**:当子类中的方法与父类中的方法具有相同的方法名、参数列表和返回类型时,称子类方法重写了父类的方法。 - **规则**: - 方法名、参数列表和返回类型必须完全相同。 - 子类方法的访问级别不能小于父类...

    C#中子类调用父类的实现方法

    在C#编程语言中,子类继承父类后,可以访问和使用父类中的成员,包括方法和属性。本文将详细讲解如何在C#中实现子类调用父类的方法。 首先,我们要理解继承的基本概念。在C#中,一个类(子类)可以继承另一个类...

    父类引用指向子类对象[归纳].pdf

    在Java编程中,"父类引用指向子类对象"是一种常见的多态性表现形式,它体现了面向对象设计的核心原则之一。这种技术允许我们通过父类的引用或接口来调用子类的方法,从而实现了代码的灵活性和可扩展性。下面我们将...

    c#切换执行程序顺序,有些中级开发小伙伴还是搞不太明白在继承父类以及不同场景实例化的情况下,父类和子类的各种方法的执行顺序到底是

    当子类使用`override`关键字重写父类的虚方法`Fun`时,通过父类类型引用调用`Fun`会执行子类的实现。执行顺序如下: - 进入`A`类,执行构造函数`A()`。 - 进入`B`类,执行构造函数`B()`。 - 因为`Fun`被重写,...

    Java编程关于子类重写父类方法问题的理解

    Java编程关于子类重写父类方法问题的理解 Java编程中,子类重写父类方法是非常重要的概念之一。子类重新实现父类的方法称为重写,重写时可以修改访问权限修饰符和返回值,但方法名和参数类型及个数不能修改。只有...

    java子类重写父类的方法.doc

    在 Java 中,多态只看父类引用的方法,而不看子类对象的方法。这意味着,如果父类有一个方法 `void eat() { ... }`,子类可以定义一个同名的方法 `void eat() { ... }`,但这只是子类的方法,而不是重写父类的方法。...

    c++中子类对象不能调用父类中的虚函数

    然而,这里有一个陷阱:如果通过子类对象直接调用父类的虚函数,编译器会认为是在调用子类自身的实现,即使子类没有覆盖这个虚函数。这就是“子类对象不能调用父类中的虚函数”的含义。例如,假设我们有以下代码: ...

    java父类和子类初始化顺序的深入理解

    4. **父类的非静态实例初始化**:在调用子类构造器之前,父类的实例变量会被初始化。在这个例子中,`Art`类的构造器`Art()`被调用,打印出"Art"。注意,这是在`Cartoon`的构造器开始执行之前发生的,即使`Art`的构造...

Global site tag (gtag.js) - Google Analytics