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. C# 扩展方法——序列化与反序列化

    其他扩展方法详见:https://www.cnblogs.com/zhuanjiao/p/12060937.html 主要是是对日期格式的处理 using Newtonsoft.Json; using ...

  2. C++:std::map的遍历

    for (auto &kv : myMap) { count<<kv.first<<" has value "<<kv.second&l ...

  3. Python黑科技:赋值技巧

    一个变量一个值(正常赋值) v = 1 ''' # 结果,v: 1 ''' 多个变量一个值(连续赋值) x = y = z = 0 ''' # 结果,x: 0, y: 0, z: 0 ''' # 注意 ...

  4. hash索引

    hash算法 哈希表(hash table ,也叫散列表),是根据关键码值(key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个 ...

  5. 前端学习之三——jquery选择器

    Jquery中的选择器分为几大类:基本过滤选择器,层次选择器,内容过滤选择器,可见性过滤选择器,属性过滤选择器,子元素过滤选择器,表单对象选择器和表单对象属相过滤选择器. 1.非基本过滤选择器,一般需 ...

  6. 理解PyTorch的自动微分机制

    参考Getting Started with PyTorch Part 1: Understanding how Automatic Differentiation works 非常好的文章,讲解的非 ...

  7. C++入门经典-例4.5-利用循环求n的阶乘

    1:代码如下: // 4.5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  8. opencv_将图像上的4个点按逆时针排序

    1:代码如下: #include "stdafx.h" #include "cxcore.h" #include "cvcam.h" #in ...

  9. perf 命令

    perf 是用来进行软件性能分析的工具.通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计. 它不但可以分析指定应用程序的性能问题,也可以用来分析内核的性能问题 ...

  10. Arrays类与Collections类

    java.util.Arrays类包含一个静态的工厂,允许数组被视为列表.以下是关于数组的要点: 这个类包含了各种方法来操作数组(比如排序和搜索). 在这个类中的方法抛出NullPointerExce ...