`

Java extends 多态

    博客分类:
  • Java
阅读更多
class A {
    public int i = 1;
    public static int j = 11;
    public static String m1() {  return "类A的静态方法m1.";  }
    public String m2() {  return "类A的实例方法m2.";   }
    public String m3() {  return "类A的实例方法m3.";   }
}

class B extends A {
    public int i = 2;
    public static int j = 22;
    public static String m1() {   return "类B的静态方法m1.";   }
    public String m2() {  return "类B的实例方法m2.";    }
}

public class Output02 {
    public static void main(String[] args) {
        A x = new B(); //x是A的一个实例,所以无法访问子类定义的新成员和新方法
        System.out.println("(1)x.i: " + x.i);  //(1)x.i: 1
        System.out.println("(2)(B)x.i: " + ((B) x).i); //(2)(B)x.i: 2
        System.out.println("(3)x.j: " + x.j);   //(3)x.j: 11
        System.out.println("(4)(B)x.j: " + ((B) x).j);    // (4)(B)x.j: 22
        System.out.println("(5)x.m1(): " + x.m1());   //(5) x.m1(): 类A的静态方法m1.
        System.out.println("(6)(B)x.m1(): " + ((B) x).m1());   //(6)(B)x.m1(): 类B的静态方法m1.
        System.out.println("(7)x.m2(): " + x.m2());  //(7)x.m2(): 类B的实例方法m2.
        System.out.println("(8)x.m3(): " + x.m3());  //(8)x.m3(): 类A的实例方法m3
    }
}

注:该程序考察的是,java的继承、多态、方法重写、方法覆盖

class A extends B :
A a = new B(); 结果a是一个A类的实例,只能访问A中的方法,那么又和A a = new A();有什么区别呢?
class B extends A
继承过后通常会定义一些父类没有的成员或者方法。
A a = new B();
这样是可以的,上传。
a是一个父类对象的实例,因而不能访问子类定义的新成员或方法。
假如这样定义:
class A{
int i;
void f(){}
}
class B extends A{
int j;
void f(){}//重写
void g(){}
}
然后:
B b = new B();
b就是子类对象的实例,不仅能够访问自己的属性和方法,也能够访问父类的属性和方法。诸如b.i,b.j,b.f(),b.g()都是合

法的。此时 b.f()是访问的B中的f()
A a = new B();
a虽然是用的B的构造函数,但经过upcast,成为父类对象的实例,不能访问子类的属性和方法。a.i,a.f()是合法的,而

a.j,a.g()非 法。此时访问a.f()是访问B中的f()
==========================================================
A a = new B(); 这条语句,实际上有三个过程:
(1) A a;
将a声明为父类对象,只是一个引用,未分配空间
(2) B temp = new B();
通过B类的构造函数建立了一个B类对象的实例,也就是初始化
(3) a = (A)temp;
将子类对象temp转换为父类对象并赋给a,这就是上传(upcast),是安全的。
经过以上3个过程,a就彻底成为了一个A类的实例。
子类往往比父类有更多的属性和方法,上传只是舍弃,是安全的;而下传(downcast)有时会增加,通常是不安全的。
===========================================================
a.f()对应的应该是B类的方法f()
调用构造函数建立实例过后,对应方法的入口已经确定了。
如此以来,a虽被上传为A类,但其中重写的方法f()仍然是B的方法f()。也就是说,每个对象知道自己应该调用哪个方法。
A a1 = new B();
A a2 = new C();
a1,a2两个虽然都是A类对象,但各自的f()不同。
===========================================================
子类调用父类构造方法:super关键字
在构造子类对象时,JVM会先调用父类的构造方法;
子类构造方法中可以通过super语句调用父类的构造方法;
如果子类构造方法中,没有通过super语句调用父类构造方法,那么JVM会调用父类的默认构造方法,如果不存在默认构造方法,将导致编译错误。
分享到:
评论

相关推荐

    java中多态的内存分析

    多态性分为编译时多态和运行时多态,其中运行时多态是Java中最常见的形式,也称为动态绑定。在深入探讨Java中多态的内存分析之前,我们需要先理解一些基本概念。 首先,了解Java内存模型至关重要。Java程序运行时...

    Java中多态的具体应用代码

    此外,Java的接口也是实现多态的一种方式。接口是一种完全抽象的类型,它只包含抽象方法和常量。一个类可以实现多个接口,从而获得多重身份,进一步增强多态性。例如,我们可以定义一个`Runnable`接口: ```java ...

    Java-多态--学习笔记.docx

    Java中的多态性是面向对象编程的一个核心特性,它允许我们设计更加灵活和可扩展的代码。在Java中,多态性(Polymorphism)主要体现在两个方面:方法的重写(Overriding)和接口的实现(Interface Implementation)。...

    java的编译时多态和运行时多态

    Java 编译时多态和运行时多态 Java 编译时多态和运行时多态是 Java 语言中两个重要的概念,它们都是多态性的实现方式,但它们在实现机制和应用场景上有所不同。 编译时多态 编译时多态是指在编译期根据参数列表的...

    Java 多态中的类型转换

    本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...

    Java多态的实现机制

    Java多态的实现机制 Java 多态的实现机制是面向对象程序设计中代码重用的一个重要机制。多态性是 Java 的三大属性之一,在开发中很重要的一个环节。多态性使对象能够调用正确的方法版本,从而提高代码的重用性和...

    源代码+报告-Java的继承和多态编程

    在Java中,我们使用`extends`关键字来实现继承。例如,`Manager`、`Technician`、`Salesman`和`SalesManager`都继承自`people`抽象类。`people`类定义了一些公共属性如`name`、`number`和`salary`,以及一些方法如`...

    java继承和多态PPT教案学习.pptx

    Java中,继承是通过extends关键字实现的。子类可以继承父类的成员变量和方法,并可以添加新的成员变量和方法或覆盖父类的方法。 在继承关系中,子类和父类之间应该有“IS-A”关系,即子类是父类的一种特殊类型。...

    Java基础多态PPT学习教案.pptx

    【Java基础多态】在Java编程中,多态性(Polymorphism)是面向对象三大特性之一,它允许我们使用一个引用类型来调用不同的实现,使得代码更加灵活且易于扩展。多态能够提高代码的复用性,降低耦合度,是软件设计中的...

    java基础_多态

    六、Java中的final关键字与多态 在Java中,final关键字用于修饰类、方法和变量。如果一个类被声明为final,那么它不能被继承;如果一个方法被声明为final,那么它不能被重写;如果一个变量被声明为final,那么它的值...

    java 多态的含义和例子经典讲解

    多态在Java中有着深远的影响,它提高了代码的可重用性、灵活性和可扩展性。本篇将通过一个经典例子深入解析多态的含义,并通过实际代码展示其应用。 首先,我们要理解多态的定义。在Java中,多态性(Polymorphism)...

    Java——多态与接口.rar

    在“Java——多态与接口”实验中,你可能需要编写一些示例代码来实践这些概念,例如创建一个基类,然后定义几个子类继承基类并覆盖其方法;再定义一个接口,让部分子类实现这个接口并提供接口方法的实现。通过运行和...

    java多态理解

    Java多态理解 java中的多态性是面向对象编程的精髓所在。多态性是指父类引用指向子类对象,例如父类Animal,子类Cat和Dog。其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类。Animal animal = ...

    java多态机制

    ### Java多态机制详解 #### 一、引言 多态是面向对象编程的重要特性之一,它使得程序设计更加灵活且易于扩展。Java作为一种广泛使用的面向对象编程语言,其多态机制是理解Java编程的关键所在。本文将详细介绍Java...

    Java多态实现

    Java多态实现是面向对象编程中的一个核心概念,它允许我们使用父类的引用变量来指向子类的对象,从而在运行时决定所调用的方法。这一特性极大地增强了代码的灵活性和扩展性,使得代码能够更好地应对未来的需求变化。...

    java中多态的使用实例

    在Java编程语言中,多态性(Polymorphism)是面向对象编程的三大特性之一,其余两者为封装和继承。多态性允许我们使用一个通用的接口来处理不同类型的对象,使得代码更具灵活性和可扩展性。这个特性使得程序在设计...

    Java 语言程序设计:第5章接口多态.ppt

    Java 语言程序设计第 5 章接口多态 本章主要讲解 Java 语言程序设计中接口和多态的概念、语法和应用。接口是 Java 语言中的一种抽象机制,它提供了一种定义类之间的“协议”的方式,允许类之间实现多继承,同时免除...

    java继承与多态

    ### Java继承与多态知识点详解 #### 一、引言 在面向对象编程语言中,继承和多态是非常重要的概念。它们提供了强大的机制来管理代码的复杂性,并且能够有效地复用现有代码。本文将详细介绍Java中的继承和多态概念...

    java继承、多态的简单程序.zip

    Java编程语言是面向对象的,其中继承和多态是核心概念。这个压缩包"java继承、多态的简单程序.zip"显然包含了一些示例代码,旨在帮助初学者理解这两个概念。接下来,我们将深入探讨Java中的继承和多态性。 ### 继承...

    详解java接口、继承和多态

    ### 详解Java接口、继承和多态 #### 一、Java接口 在Java中,接口是一种定义行为的方式,它提供了一种实现抽象方法的手段。通过接口,开发人员可以为类定义一组方法签名,但不提供这些方法的具体实现。这有助于...

Global site tag (gtag.js) - Google Analytics