java中的多态关系的运用
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中的多态关系的运用的更多相关文章
- Java 中的多态,一次讲个够之接口实现关系中的多态
上文还没有写完,这一篇继续 Java 中的多态,一次讲个够之继承关系中的多态 https://www.cnblogs.com/qianjinyan/p/10824576.html 接口实现关系,和继承 ...
- 13、java中的多态
1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...
- java中实现多态的机制是什么?
多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...
- Java中实现多态的条件是什么
java中实现多态需要三个条件: 1,需要有继承关系的存在. 2,需要有方法的重写. 3,需要有父类的引用指向子类对象.
- 深度分析:理解Java中的多态机制,一篇直接帮你掌握!
Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...
- 通过实例聊聊Java中的多态
Java中的多态允许父类指针指向子类实例.如:Father obj=new Child(); 那么不禁要发问?? 使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪 ...
- Java 中的多态,一次讲个够之继承关系中的多态
多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个 ...
- (2)java中的集中关系,is a, has a, 继承,重点聊聊继承
java中常见的类关系(javacore上面也有介绍道的) 1.is a关系() 2.has a 整体与局部的关系 3.继承关系 是现实世界中存在而上面两种关系又无法描述的 当然谈的最多的是继承关系, ...
- 深入理解Java中的多态
一.什么是多态? 多态指同一个实体同时具有多种形式.它是面向对象程序设计(OOP)的一个重要特征.如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的. 二.多态是如何实现的? ...
随机推荐
- docker-compose容器互相连接
一些示例未整理 haproxy 与nginx 容器连接 ## 服务的compose 编写 mkdir /mnt/compose vim docker-compose.yml web1: image: ...
- 3、Grid、GridSplitter 网格分离器、SharedSizeGroup 共享尺寸组
Grid——网格布局,是WPF中最强大的布局容器,可以实现任何其他容器的布局.一个网格中只展示一个元素,若要展示多元素,可用容器 布局舍入:网格的边界有时会模糊,如三等分100宽度无法被整除.推荐设定 ...
- (Java多线程系列三)线程间通讯
Java多线程间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 1.使用wait()和notify()方法在线程中通讯 需求:第一个线程写入(input)用户,另一个线程 ...
- python3基础: 元组tuple、 列表list、 字典dict、集合set。 迭代器、生成器
一.元组: tuple Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组 tup2 = (111, 22, 33, ...
- Linux环境下TomCat使用指定JDK的版本
服务器是web服务器,在上面安装了jdk1.7和jdk1.8.及多个tomcat应用,默认/etc/profile 配置的jdk1.7,大部分tomcat应用使用的也是jdk1.7, 但目前有一个新项 ...
- SNMP命令
snmp命令 配置管理网络协议Weblogic项目管理Cisco Snmputil 命令 Snmputil是一个命令行下的软件,使用语法如下: usage: snmputil get|getnext| ...
- JAVA_OPT理解及调优理论
以RocketMQ的namesrv和broker启动为例,理解CMS和G1垃圾收集器下的jdk参数 CMS垃圾收集器 以RocketMQ中runserver.cmd为例,这是启动NameSrv的命令行 ...
- Java第09次实验(流与文件)
第一次实验 0. 字节流与二进制文件 1.使用DataOutputStream与FileOutputStream将Student对象写入二进制文件student.data 二进制文件与文本文件的区别 ...
- LVS负载均衡DR工作流程
LVS负载均衡DR工作流程 (a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链. 此时报文的源IP为CIP,目标IP为VIP (b) PRE ...
- 【JVM】jstack和dump线程分析(2)
一:jstack jstack命令的语法格式: jstack <pid>.可以用jps查看java进程id.这里要注意的是:1. 不同的 JAVA虚机的线程 DUMP的创建方法和文件格式 ...