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会调用父类的默认构造方法,如果不存在默认构造方法,将导致编译错误。
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 模拟Interceptor 过程
2015-09-29 16:25 709Java,用普通类 模拟Interceptor 过程 -
java 关闭其他应用程序或重启机器
2014-06-12 08:49 1473public static Process performCo ... -
mybatis in action
2014-02-25 15:01 1450mybatis实战教程(mybatis in action) ... -
java 创建文件夹和文件
2014-01-06 13:22 1025一:判断文件夹是否存在,不存在则创建 String fileP ... -
spring 发送邮件
2013-09-25 16:12 769Spring mail 发送邮件 一:添加mail jar 包 ... -
Spring 定时器 quartz
2013-09-22 15:36 932spring quartz 定时执行任务(SSH) 配置文件: ... -
java 读取硬件信息
2013-09-05 15:33 1099java 读取计算机信息: 机器名、CPU、内存使用率、IP ... -
java 连接sqlite数据库
2013-09-04 17:22 1405一:首先 添加jar包 二: import java.sql. ... -
java 打包jar 成exe 并动态绑定jre
2013-09-04 17:13 1181转: http://www.doc88.com/p-18569 ... -
Java GUI(图形用户界面) 布局管理器
2013-04-16 17:03 1142java 图形用户界面布局管理器 -
MyEclipse发布Java应用程序
2013-03-29 11:48 8721、首先:我们使用MyEclipse导出Java应用程序的Ja ... -
基于UDP协议的网络编程(使用DatagramSocket发送接收数据)
2013-03-01 14:21 1624一:UDP服务器端 package socketServer; ... -
S2SH:struts2获取前台数据的三种方式
2013-02-02 09:38 2202struts2 获取前台数据的 ... -
MyEclipse 配置Tomcat 服务器
2013-01-31 14:11 1102一:首先安装JDK和Tomcat 二:打开MyEclipse, ... -
Hibernate 动态添加数据库(数据库信息不固定)
2012-11-03 09:56 1434上篇文章利用spring来连接多个数据库并进行切换数据源, ... -
SSH 连接多个数据库并且动态切换
2012-11-03 09:35 3392在项目中,有时遇到连接多个数据库的情况,并且根据用户的操 ... -
JavaEE Hibernate 分页查询 语句
2012-06-28 11:01 1582//计算总记录数 public int getTotalRo ...
相关推荐
多态性分为编译时多态和运行时多态,其中运行时多态是Java中最常见的形式,也称为动态绑定。在深入探讨Java中多态的内存分析之前,我们需要先理解一些基本概念。 首先,了解Java内存模型至关重要。Java程序运行时...
此外,Java的接口也是实现多态的一种方式。接口是一种完全抽象的类型,它只包含抽象方法和常量。一个类可以实现多个接口,从而获得多重身份,进一步增强多态性。例如,我们可以定义一个`Runnable`接口: ```java ...
Java中的多态性是面向对象编程的一个核心特性,它允许我们设计更加灵活和可扩展的代码。在Java中,多态性(Polymorphism)主要体现在两个方面:方法的重写(Overriding)和接口的实现(Interface Implementation)。...
Java 编译时多态和运行时多态 Java 编译时多态和运行时多态是 Java 语言中两个重要的概念,它们都是多态性的实现方式,但它们在实现机制和应用场景上有所不同。 编译时多态 编译时多态是指在编译期根据参数列表的...
本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...
Java多态的实现机制 Java 多态的实现机制是面向对象程序设计中代码重用的一个重要机制。多态性是 Java 的三大属性之一,在开发中很重要的一个环节。多态性使对象能够调用正确的方法版本,从而提高代码的重用性和...
在Java中,我们使用`extends`关键字来实现继承。例如,`Manager`、`Technician`、`Salesman`和`SalesManager`都继承自`people`抽象类。`people`类定义了一些公共属性如`name`、`number`和`salary`,以及一些方法如`...
Java中,继承是通过extends关键字实现的。子类可以继承父类的成员变量和方法,并可以添加新的成员变量和方法或覆盖父类的方法。 在继承关系中,子类和父类之间应该有“IS-A”关系,即子类是父类的一种特殊类型。...
【Java基础多态】在Java编程中,多态性(Polymorphism)是面向对象三大特性之一,它允许我们使用一个引用类型来调用不同的实现,使得代码更加灵活且易于扩展。多态能够提高代码的复用性,降低耦合度,是软件设计中的...
六、Java中的final关键字与多态 在Java中,final关键字用于修饰类、方法和变量。如果一个类被声明为final,那么它不能被继承;如果一个方法被声明为final,那么它不能被重写;如果一个变量被声明为final,那么它的值...
多态在Java中有着深远的影响,它提高了代码的可重用性、灵活性和可扩展性。本篇将通过一个经典例子深入解析多态的含义,并通过实际代码展示其应用。 首先,我们要理解多态的定义。在Java中,多态性(Polymorphism)...
在“Java——多态与接口”实验中,你可能需要编写一些示例代码来实践这些概念,例如创建一个基类,然后定义几个子类继承基类并覆盖其方法;再定义一个接口,让部分子类实现这个接口并提供接口方法的实现。通过运行和...
Java多态理解 java中的多态性是面向对象编程的精髓所在。多态性是指父类引用指向子类对象,例如父类Animal,子类Cat和Dog。其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类。Animal animal = ...
### Java多态机制详解 #### 一、引言 多态是面向对象编程的重要特性之一,它使得程序设计更加灵活且易于扩展。Java作为一种广泛使用的面向对象编程语言,其多态机制是理解Java编程的关键所在。本文将详细介绍Java...
Java多态实现是面向对象编程中的一个核心概念,它允许我们使用父类的引用变量来指向子类的对象,从而在运行时决定所调用的方法。这一特性极大地增强了代码的灵活性和扩展性,使得代码能够更好地应对未来的需求变化。...
在Java编程语言中,多态性(Polymorphism)是面向对象编程的三大特性之一,其余两者为封装和继承。多态性允许我们使用一个通用的接口来处理不同类型的对象,使得代码更具灵活性和可扩展性。这个特性使得程序在设计...
Java 语言程序设计第 5 章接口多态 本章主要讲解 Java 语言程序设计中接口和多态的概念、语法和应用。接口是 Java 语言中的一种抽象机制,它提供了一种定义类之间的“协议”的方式,允许类之间实现多继承,同时免除...
### Java继承与多态知识点详解 #### 一、引言 在面向对象编程语言中,继承和多态是非常重要的概念。它们提供了强大的机制来管理代码的复杂性,并且能够有效地复用现有代码。本文将详细介绍Java中的继承和多态概念...
Java编程语言是面向对象的,其中继承和多态是核心概念。这个压缩包"java继承、多态的简单程序.zip"显然包含了一些示例代码,旨在帮助初学者理解这两个概念。接下来,我们将深入探讨Java中的继承和多态性。 ### 继承...
### 详解Java接口、继承和多态 #### 一、Java接口 在Java中,接口是一种定义行为的方式,它提供了一种实现抽象方法的手段。通过接口,开发人员可以为类定义一组方法签名,但不提供这些方法的具体实现。这有助于...