一、多态

1.1、多态概念

 定义:某一类事物的多种存在形态。
    
    例:动物中猫,狗。
    猫这个对象对应的类型是猫类型:猫 x = new 猫();
    同时猫也是动物中的一种,也可以把猫称为动物:动物  y = new 猫();
    动物是猫和狗具体事物中抽取出来的父类型。
    父类型引用指向了子类对象。
    体现:
    父类或者接口的引用指向或者接收自己的子类对象。

作用:
    多态的存在提高了程序的扩展性和后期可维护性。
    
    前提:
    1. 需要存在继承或者实现关系。
    2. 需要有覆盖操作。

好处:
    提高了代码的扩展性,前期定义的代码可以使用后期的内容。

1.2、2种类型

向上转型和向下转型

1.3、向上转型

声明时为父类的类型,如动物 小鸟=new 小鸟();

但运行时为子类的类行

任何子类存在的地方都可以用父类来替代

package com.day08.doutai.demo1;

public abstract class Animal {

    private String name;
private String gender; /**
* 吃饭方法
*/
public abstract void eat(); public String getName() { return name;
} public void setName(String name) {
this.name = name;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} }
package com.day08.doutai.demo1;
/**
* 小鸟吃虫子
* @author denny
*
*/
public class Bird extends Animal { @Override
public void eat() {
System.out.println("小鸟吃虫子");
}
public void fly(){
System.out.println("小鸟在天上飞");
} }
package com.day08.doutai.demo1;
/**
* 小狗吃骨头
* @author denny
*
*/
public class Dog extends Animal { @Override
public void eat() {
System.out.println("小狗吃骨头");
} public void run(){
System.out.println("小狗在地上跑!");
}
}
package com.day08.doutai.demo1;
/**
* 小猪类
* @author denny
*
*/
public class Pig extends Animal { @Override
public void eat() {
System.out.println("小猪吃杂食!"); } public void sleep(){
System.out.println("小猪在睡觉!"); }
}

测试类

package com.day08.doutai.demo1;
/**
* 多态向上转型
* 声明状态进为父类
* 运行时状态为子类
* @author denny
*/
public class AnimalTest1 { public static void main(String[] args) {
//声明小狗
Animal dog=new Dog();
//声明小猪
Animal pig=new Pig();
//声明小鸟
Animal bird=new Bird(); getAnimal(dog);
getAnimal(pig);
getAnimal(bird);
} public static void getAnimal(Animal a){
a.eat();
}
}

结果:

小狗吃骨头
小猪吃杂食!
小鸟吃虫子

1.4、向下转型

判断是不是子类,是就强制类型转换

intanceof 关键字来判断

以上类不变

package com.day08.doutai.demo1;
/**
* 多态向上转型
* 声明状态进为父类
* 运行时状态为子类
* @author denny
*/
public class AnimalTest1 { public static void main(String[] args) {
//声明小狗
Animal dog=new Dog();
//声明小猪
Animal pig=new Pig();
//声明小鸟
Animal bird=new Bird(); getAnimal(dog);
getAnimal(pig);
getAnimal(bird);
} public static void getAnimal(Animal animal){
//判断是不是 小狗类
if(animal instanceof Dog){
Dog dog=(Dog)animal;
dog.run();
//判断 是不是小鸟
}else if(animal instanceof Bird){
Bird bird=(Bird)animal;
bird.fly();
}else if(animal instanceof Pig){
Pig pig=(Pig)animal;
pig.sleep();
} } }

结果:

小狗在地上跑!
小猪在睡觉!
小鸟在天上飞

1.5、简单工厂

package com.day08.doutai.demo1;

public class AnimalFactory {
Animal an;
public Animal getAmincal(String animal){
if(animal.equalsIgnoreCase("bird")){
an=new Bird();
}else if(animal.equalsIgnoreCase("pig")){
an=new Pig();
}else if(animal.equalsIgnoreCase("dog")){
an=new Dog();
}else{
System.out.println("没这个动物");
} return an; } }

测试类

package com.day08.doutai.demo1;

public class Test1 {

    public static void main(String[] args) {

                //声明一个工厂类
AnimalFactory factory=new AnimalFactory();
Animal animal =factory.getAmincal("dog");
animal.eat();
} }

结果:

小狗吃骨头

1.6、多态中成员变量的特点

成员函数特点:

在编译时期:参阅引用类型变量所属类中是否有这个调用方法,如果有,编译通过,如果没有编译失败。

在运行时期:参阅对象所属的类中是否有调用这个方法。

简单:成员函数在多态调用时,编译看左边,运行持右边

无论编译和运行,都参考左边(引用类型变量所属的类)。

静态成员,也是都参考左边

package com.day08.demo1;
/**
* 父类
* @author Denny
*
*/
public class Fu { //成员变量
int num=5; } package com.day08.demo1; public class Zi extends Fu {
int num=8; }
package com.day08.demo1; public class Test1 { public static void main(String[] args) {
Fu f=new Zi();
System.out.println(f.num); //
Zi z=new Zi();
System.out.println(z.num); // } }

结果:

5

8

二、Object类

2.1、Object类

Object类是所有类的根类(间接父类),Java对象中最顶级的类。

这个类中定义了所有对象都具备的功能

2.2、equalse()方法

package com.day08.objec.demo1;
/**
* 人类
* @author Administrator
*
*/
public class Person {
/**
* 姓名
* 年龄
* 性别
*/
private String name;
private int age;
private String gender; /**
* getter和setter方法
* @return
*/
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
} }

测试类

package com.day08.objec.demo1;

public class Test1 {

    public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
Person p3 = p1;
System.out.println(p1 == p2);
System.out.println(p1.equals(p2));
System.out.println(p1 == p3);
System.out.println(p1.equals(p3)); } }

结果:

false
false
true
true

重写equals方法

    /**
* 重写equalse方法
*/
@Override
public boolean equals(Object obj) {
//判断是不是这个对象
if(this==obj){
return true;
}
//判断 如果是空值就返回false
if(null==obj){
return false;
}
if(obj instanceof Person){
Person p=(Person)obj;
return name.equals(p.getName())&&age==p.getAge()&&gender.equals(p.getGender());
}else{
return false;
} }

测试

package com.day08.objec.demo1;

public class Test1 {

    public static void main(String[] args) {
Person p1 = new Person();
p1.setName("张三");
p1.setAge(20);
p1.setGender("男");
Person p2 = new Person();
p2.setName("李四");
p2.setAge(21);
p2.setGender("女");
Person p3 = p1;
p3.setName("张三");
p3.setAge(20);
p3.setGender("男");
System.out.println(p1.equals(p2));
System.out.println(p1.equals(p3));
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println(p3.hashCode()); } }

结果:

false
true
705927765
366712642
705927765

2.3、toString()类

toString=getClass().getName+@+Integer.toHexString(hasCode())

还是上面的Person类

package com.day08.objec.demo1;

public class Test2 {

    public static void main(String[] args) {
Person p1 = new Person(); System.out.println(p1.toString()); //默认为十六进制
System.out.println(p1.hashCode());//默认为10进制
System.out.println(Integer.toHexString(p1.hashCode())); //转换为十六进制
System.out.println(p1.getClass().getName()+"@"+Integer.toHexString(p1.hashCode())); } }

结果:

com.day08.objec.demo1.Person@2a139a55
705927765
2a139a55
com.day08.objec.demo1.Person@2a139a55

基础学习day08---多态、简单工厂、Object类equals和toString的更多相关文章

  1. C#基础巩固(1)-多态+简单工厂

    多态 如果要简要的描述多态的话,我个人是这样理解的:通过继承,父类定义方法,具休的实现由子类进行. 01代码 //父类 class Person { public virtual void skill ...

  2. Java基础学习总结(7)——Object类

    一.Object类介绍 Object类在JAVA里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能 ...

  3. [转帖]java基础学习总结——多态(动态绑定)

    https://www.cnblogs.com/xdp-gacl/p/3644035.html 多态的概念 java基础学习总结——多态(动态绑定) 一.面向对象最核心的机制——动态绑定,也叫多态

  4. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  5. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  6. 别样JAVA学习(五)继承上(1.0)Object类equals()

    上一节继承下(一)我们进行抽象类.接口以及多态的学习. 接下来大家我们讲点特殊的东西就是object类, 我们一直在说继承,子继承了父,父还有没有父类呢, 为什么这么思考,大家想构造函数的第一行是不是 ...

  7. 设计模式学习(四): 1.简单工厂 (附C#实现)

    New 这是一个典型的情况, 我们需要在运行时来实例化一些具体的类. 在需要修改或者扩展的时候我们就需要改这段代码. 一个程序中可能会多次出现类似的代码, 这使得维护和更新非常困难而且容易出错. 通过 ...

  8. 四. Java继承和多态10. Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: p ...

  9. C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...

随机推荐

  1. 资源 | 数十种TensorFlow实现案例汇集:代码+笔记

    选自 Github 机器之心编译 参与:吴攀.李亚洲 这是使用 TensorFlow 实现流行的机器学习算法的教程汇集.本汇集的目标是让读者可以轻松通过案例深入 TensorFlow. 这些案例适合那 ...

  2. AutoLayout那些坑

    最近在做一个聊天界面,要适配iOS所有屏幕. 以前的思路是键盘弹出的时候去改table 和输入框的frame. 现在发现和autolayout的约束有冲突. 搞了半天发现需要动态改Constraint ...

  3. 剑指架构师系列-Struts2构造函数的循环依赖注入

    Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } pub ...

  4. 清除linux缓存命令

    命令 #sync #echo 3 > /proc/sys/vm/drop_caches 查看内存情况: # more /proc/meminfo Kernels 2.6.16 and newer ...

  5. Res_Orders_01之需求分析

    Res_Orders_01之需求分析 一.背景及好处 为了提高餐厅的运营效率,增强餐厅各部门间的配合,减少顾客到店后的点餐.等餐及结算过程消耗的时间,降低服务员点餐失误率,进一步提高餐厅管理人员对菜品 ...

  6. Android中的消息通知(NotificationManager和Notification)

    下面来谈谈notification,这个notification一般用在电话,短 信,邮件,闹钟铃声,在手机的状态栏上就会出现一个小图标,提示用户处理这个通知,这时手从上方滑动状态栏就可以展开并处理这 ...

  7. sencha combobox下拉框不用jsonstore,直接使用字符串数组做数据源

    combobox下拉框的store除了可以选择一个jsonstore来加载数据,还可以直接使用符串Array做数据源. { xtype: 'combobox', fieldLabel: 'Label' ...

  8. SQL Server 性能调优(一)——从等待状态判断系统资源瓶颈【转】

    转载自:http://blog.csdn.net/dba_huangzj/article/details/7607844#comments 通过DMV查看当时SQL SERVER所有任务的状态(sle ...

  9. 【JS复习笔记】00 序

    作为一个前端苦手,说是复习,你就当我是重学好了. 好吧,我当然不可能抱着一个砖头去复习,所以捡了本薄的来读——<JavaScript语言精粹>. 当初带我的人说这本书挺好,就看这本书好了. ...

  10. 行转列一定要sum

    --SELECT 姓名 ,-- 课程 ,-- 分数--FROM tb UNPIVOT ( 分数 FOR 课程 IN ( [语文], [数学], [物理] ) ) t --)