1、多态发生的三个必备条件

  继承、重写、父类引用指向子类对象

2、注意

  当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

  方法的重写,也就是子类能够重写父类的方法

  当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。要想调用父类中被重写的方法,则必须使用关键字super。

3、好处

  可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

4、例子

 //父类
package com.test.five; public class Parent {
public void Test(){
System.out.println("我 是 父类");
}
} //子类一
package com.test.five; public class Child extends Parent {
public void Test(){
System.out.println("我 是大儿子");
}
public void Sex(){
System.out.println("我 是个男的");
}
}
//子类二
package com.test.five; public class Sister extends Parent{
public void Test(){
System.out.println("我也是个子类");
}
public void Sex(){
System.out.println("我是个女儿");
}
}
//测试类
package com.test.five; public class Test {
public static void main(String[] args) {
Parent p = new Child();
p.Test();//父类声明,子类创建,调用该对象的方法(子类父同时所拥有的方法)
Show(p);
Show(new Sister());
Show(new Child());
}
//测试类中的静态类方法,在测试类中可以直接调用此方法(不用再实例化类的对象)
public static void Show(Parent p){
p.Test();
if( p instanceof Child){
Child c = (Child)p;
c.Sex();
}else if(p instanceof Sister){
Sister s = (Sister)p;
s.Sex();
}
}
}

得出的结果是:

我 是大儿子
我 是大儿子
我 是个男的
我也是个子类
我是个女儿
我 是大儿子
我 是个男的

 5、注意(例子)

 //父类
package com.test.six; public class Emploee {
private String name;
private String address;
private int num;
public Emploee(String name,String address,int num){
System.out.println("Emploee的构造函数");
this.name = name;
this.address = address;
this.num = num;
}
public void check(){
System.out.println("Emploee中check的name:"+this.name+" ,address = "+this.address);
}
public String toString(){
return name+" "+address+" "+num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getNum() {
return num;
}
} //子类
package com.test.six; public class Salary extends Emploee {
private double salary;
//构造函数
public Salary(String name, String address, int num,double salary) {
super(name, address, num);
System.out.println("salary的构造函数");
setSalary(salary);
}
public double getSalary() {
return salary;
} public void setSalary(double salary) {
if(salary >=0.0){
this.salary = salary;
}
}
public void check(){
System.out.println("这是salary的check的方法");
System.out.println("Salary中的name="+getName()+" 薪资="+getSalary());
}
public double computePay() {
System.out.println("计算工资,付给:" + getName());
return salary/52;
}
}
//测试类
package com.test.six; public class Test {
public static void main(String[] args) {
Salary s = new Salary("张三", "北京", 3, 8000.0);
Emploee e = new Salary("李四", "上海", 5, 10000.0);
System.out.println("salary对象引用中的方法调用");
s.check();
s.computePay();
System.out.println("emploee对象引用中的方法调用");
e.check();
}
}

得到的结果如下:

 Emploee的构造函数
salary的构造函数
Emploee的构造函数
salary的构造函数
salary对象引用中的方法调用
这是salary的check的方法
Salary中的name=张三 薪资=8000.0
计算工资,付给:张三
emploee对象引用中的方法调用
这是salary的check的方法
Salary中的name=李四 薪资=10000.0

----一旦实例化一个对象,其执行顺序,首先:

在不涉及继承的前提下,当首次加载类时,按照如下顺序执行:
1、按照出现顺序先后执行静态成员变量定义与静态块;
2、按照出现顺序先后执行动态成员变量定义与动态块;
3、执行构造函数;
4、再次实例化对象时只执行第2、4步即可;

在涉及到继承时,按照如下顺序执行:
1、执行父类的静态成员变量定义与静态块,执行子类的静态成员变量与静态块
2、执行父类非静态成员变量定义与动态块,执行父类构造方法;
3、执行子类的非静态成员变量定义与动态块,执行子类构造方法;
注意:父类构造方法中用到的方法如果已被子类重写,那么在构造子类对象时在
调用父类构造函数中使用子类重写的方法。

例子一:

package com.test.seven;

public class TestOne {
private static TestOne t1 = new TestOne();
//静态变量
private static int i1;
private static int i2 = 2; public TestOne(){
i1++;
i2++;
}
public static void main(String[] args) {
TestOne t2 = new TestOne();
System.out.println("t2.i1 = " +t2.i1);
System.out.println("t2.i2 = "+t2.i2);
}
}

得到的结果如下:

t2.i1 = 2
t2.i2 = 3

执行过程:

  首先执行给t1、i1、i2分别给予初始值null,0,0,在执行TestOne t1 = new TestOne();
这样子i1++,i2++被执行,i1,i2都变成1,执行完毕后接着执行int i1 ,  i1,i2的值仍然是1,1,当执行int i2=2时,i2被赋予了值,即i1=1,i2=2;再执行
TestOne t2 = new TestOne(),i1,i2在执行++,此时i1=2,i2=3,输出i1,i2,结果就是:t2.i1=2,t2.i2=3通过上面代码可以知道:
系统默认的给予比通过等号的赋予先执行。

例子二:

package com.test.seven;

public class TestOne {
private static TestOne t1 = new TestOne();
//静态变量
private static int i1;
private static int i2 = 2;
//静态块
static{
System.out.println("静态块");
}
//动态块
{
System.out.println("动态块");
}
public TestOne(){
i1++;
System.out.println("i1--------------"+i1);
i2++;
System.out.println("i2--------------"+i2);
}
public static void main(String[] args) {
TestOne t2 = new TestOne();
System.out.println("t2.i1 = " +t2.i1);
System.out.println("t2.i2 = "+t2.i2); }
}

得到的结果如下:

 动态块
i1--------------1
i2--------------1
静态块
动态块
i1--------------2
i2--------------3
t2.i1 = 2
t2.i2 = 3

java中的多态关系的运用的更多相关文章

  1. Java 中的多态,一次讲个够之接口实现关系中的多态

    上文还没有写完,这一篇继续 Java 中的多态,一次讲个够之继承关系中的多态 https://www.cnblogs.com/qianjinyan/p/10824576.html 接口实现关系,和继承 ...

  2. 13、java中的多态

    1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...

  3. java中实现多态的机制是什么?

    多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...

  4. Java中实现多态的条件是什么

    java中实现多态需要三个条件: 1,需要有继承关系的存在. 2,需要有方法的重写. 3,需要有父类的引用指向子类对象.

  5. 深度分析:理解Java中的多态机制,一篇直接帮你掌握!

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  6. 通过实例聊聊Java中的多态

    Java中的多态允许父类指针指向子类实例.如:Father obj=new Child();  那么不禁要发问?? 使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪 ...

  7. Java 中的多态,一次讲个够之继承关系中的多态

    多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个 ...

  8. (2)java中的集中关系,is a, has a, 继承,重点聊聊继承

    java中常见的类关系(javacore上面也有介绍道的) 1.is a关系() 2.has a 整体与局部的关系 3.继承关系 是现实世界中存在而上面两种关系又无法描述的 当然谈的最多的是继承关系, ...

  9. 深入理解Java中的多态

    一.什么是多态? 多态指同一个实体同时具有多种形式.它是面向对象程序设计(OOP)的一个重要特征.如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的. 二.多态是如何实现的? ...

随机推荐

  1. linux完整卸载mysql数据库

    由于本机测试环境数据库装错了,需要卸载数据库,记录一下 yum -y remove mysql find / -name mysql /etc/selinux/targeted/active/modu ...

  2. Vue.js——vue-resource详细介绍

    概述 Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没有必要引入jQuery.vue-resource是Vue.js的一款插件,它可以通过 ...

  3. reactjs 的 css 模块化工具 styled-components 升级后 createGlobalStyle 废除,使用 createGlobalStyle 的方案

    在 styled-components 升级到 4 版本后设置全局属性的 createGlobalStyle 这个 api 被废除,替代的 api 是 createGlobalStyle 与过去组织代 ...

  4. 将JDBC查询出的数据转化为json格式返回

    使用JDBC,json工具使用的org.json /** * ResultSet转JSON * * @param rs * @return * @throws SQLException * @thro ...

  5. Vue CLi3入门

    摘自:https://www.jianshu.com/p/cf9b56efd3b8 Vue CLi3入门 12018.11.15 14:16:17字数 1222阅读 8895 地址 Vue CLi3 ...

  6. jsp里面自定义标签常量详解

    标签中静态常量: EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流 SKIP_BODY:告诉服务器不要处理正文内容 EVAL_PAGE:让服务器继续执行页面 SKIP_ ...

  7. Java 里volatile关键字是什么意思啊?如何使用呢?

    一旦一个并发共享变量(类的成员变量.静态成员变量)被 volatile 关键字修饰就具备了可见性(即一个线程修改了一个变量的值对于另一个线程来说是立即可见的)和有序性(即禁止进行指令重排序),实质是在 ...

  8. dubbo源码阅读笔记-如何引用远程服务,变成invoker

    1 消费端如何通过注册中心获取远程服务的invoker? RegistryDirectory.subscribe从注册中心中获取provider的url,通过DubboProtocol的refer方法 ...

  9. Eclipse中文插件安装教程

    先运行英文版Eclipse 点击Help选择Install New Software 直接点击Add按钮 Name输入: Babel Location输入: http://download.eclip ...

  10. SpringBoot整合kafka(安装)

    项目路径:https://github.com/zhaopeng01/springboot-study/tree/master/study_14 序言 Kafka 是一种高吞吐的分布式发布订阅消息系统 ...